白盒绕过
熟练的掌握MySQL函数和语法使用方式
深入了解中间件运行处理机制
了解WAF防护原理及方法
黑盒测试:(http://www.mottoin.com/86886.html)
一.架构层绕过WAF:
1. 寻找源站->针对云WAF
2. 利用同网段->绕过WAF防护区域
3. 利用边界漏洞->绕过WAF防护区域
二.资源限制角度绕过WAF:
1. POST大BOOY
三.协议层面绕过WAF的检测:
1. 协议未覆盖绕过WAf
*请求方式变换:GET->POST
*Content-Type变换:application/x-www-form-urlencoded:-> multipart/from-data
2. 参数污染
四.规则层面的绕过:
主要的绕过方式
~每一个点都能找到绕过的方法
以注释绕过为例子,开始Fuzz
注释符绕过:
*先测试最基本的: union/**/select
*再测试中间引入特殊字:union/aaaa%01bbs/select
*最后测试注释长度:union/aaaaaaaaaaaaaaaaaaaaaaa/select
最基本的模式:
union/something/select
大小写绕过
如果程序中设置了过滤关键字,但是过滤过程中并没有对关键字组成进行深入分析过滤,导致只对整体进行过滤。例如:and过滤。当然这种过滤只是发现关键字出现,并不会对关键字处理。可以通过修改关键字的内字母大小写来绕过过滤措施。
双写绕过
如果在程序中设置出现关键字之后替换为空,那么SQl注入攻击也不会发生。对于这样的过滤策略可以使用双写绕过。因为在过滤过程中只进行了一次替换。
例如:过滤了union 只要发现union 无论大小写都会被替换为空。这是就可以通过双写uniunionon的写法来对过滤进行绕过。
编码绕过
可以利用网络中的URl在线编码,绕过SQL注入的过滤机制。
http://tool.chinaz.com/Tools/urlencode.aspx
内联注释绕过
在Mysql中内容注释中的内容可以被当做SQL语句执行。
绕过去除注释符的SQL注入
注释符的作用:用于标记某段代码的作用,起到对代码功能的说明作用。但是注释的内容不会被执行。
1 、Mysql中的注释符: --+或–空格 或#
2、多行注释:/!多行注释内容/
对于正常的SQL语句中,注释符起到说明作用的功能。但是对于在利用SQL注入漏洞的过程中,注释符起到闭合单引号、多引号、双引号、但括号、多括号的功能。
去除注释符的代码举例:
preg_replace(mixed $pattern, mixed $replacement,mixed $subject):执行一个正则表达式的搜索和替换。
$pattern:要搜索的模式,可以是字符串或一个字符串数组
$replacement:用于替换的字符串或字符串数组
$subject:要搜索替换的目标字符串或字符串数组
此时可以利用注释符被过滤不能成功闭合单引号,换一种思路 利用or ‘1’='1闭合单引号。也可以使用Sqlmap进行安全测试。
绕过过滤and和or的SQL注入
Mysql一些特性:
1、Mysql中的大小写不敏感,大写和小写一样。
2、Mysql中的十六进制与URL编码。
3、符号和关键字替换 and --> &&、or --> ||
4、内联注释与多行注释 /!内联注释/ /多行注释/。
5、Mysql中会自动识别URL与Hex编码好的内容。
绕过策略:
1、大小写变形,or,OR,oR,Or,and,And,AND,aND等。
2、在这两个敏感词汇中添加注释,例如:a/**/and 双写:oorr
3、利用符号替代 and–>&&、or–>||
绕过去除空格的SQL注入
编码:hex,urlencode
空格URL编码:
%0a 新建一行
%0c 新的一页
%0d return功能
%0b TAB键(垂直)
Sqlmap安全检测:
sqlmap -u “URL” --hex --dbs --batch
绕过去除(union和select)的SQL注入
编码%0a、加入/**/符,union/select大小写、双写等绕过。
宽字节注入
ASCII占用一个字节,而GB2312、GBK、GB18083、BIG5、Shift_JIS等这些都是常说的宽字节,实际为两个字节。Mysql在使用GBK编码的时候,会认为两个字符为一个汉字。
例如: %df’ --> %df’ --> %df%5c%27 --> %df和%5c会被认为是一个汉字。
方法:在注入点后键入%df,然后按照正常的注入流程开始注入Ascii码大于128才能到汉字的范围。
注入测试:
1、在可能的注入点后键入%df%27,之后进行注入测试。
2、查看Mysql编码是否为GBK
3、是否使用preg_replace把单引号替换成’
4、是否使用addslashes进行转义
5、是否使用mysql_real_escape_string进行转义
宽字节注入防御:
1、不使用GBK编码,使用utf-8。宽字节注入不只是gbk,韩文、日文等都是宽字节,都是可能被利用的
2、使用mysql_real_escape_string,
mysql_set_charset(‘gbk’, $conn);
3、可以设置mysql连接参数,character_set_client=binary,使用二进制的形式进行数据的连接。
Sqlmap安全检测:
sqlmap -u “URL?id=1%df%27” --search --level 3 --risk 1 --thread 10
sqlmap.py -u"URL" --tamper=unmagicquotes.py
二次注入
二次注入原理:
二次注入,主要分为两步
第一步:插入恶意数据,第一次进行数据库插入数据的时候,仅仅对其中的特殊字符进行了转义,在写入数据库的时候还是保留了原来的数据,但是数据本身包含恶意内容。
第二步:引用恶意数据,在数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次需要进行查询的时候,直接从数据库中取出了恶意数据,没有进行进一步的校验和处理,这样就会造成SQL的二次注入。
例如:寻找插入数据库并会转义的操作–>输入参数1’ -->参数经过转义函数后1’–>参数进入数据库存储还原为1’ -->寻找另外一处引用这个数据的操作–>将1’从数据库中取出–>取出后直接给变量并带入SQL–>SQL注入触发。
二次编码注入
urldecode()与php本身处理编码时,两者配合失误,可构造数据消灭
例:如果php代码中使用了urldecode()等编码函数,放在了一个比较尴尬的位置,与php自身编码配合失误。
id=1%2527 --> id=1%27 --> id=1’ %25 --> %
注入测试:
1、在可能的注入点后键入%2527,之后进行注入测试
2、是否使用urldecode函数
3、urldecode函数是否在转义方法之后。