SQL注入(四)--WAF绕过思路
本文最后更新于:2 年前
什么是WAF
什么是WAF?WAF(Web Application Firewall),即网站应用防火墙,通过过滤和监视Web应用程序与Internet之间的HTTP通信来帮助保护Web应用程序。它通常可以保护Web应用程序免受跨站点伪造(CSRF/SSRF),跨站点脚本(XSS),文件上传和SQL注入等攻击。 WAF工作在OSI模型的第七层(即应用层),并非用于防御所有类型的攻击。
WAF防御原理
简单来说,waf就是解析http请求,通过正则表达式匹配,检测http请求中的参数是否存在恶意的攻击行为,如果请求中的参数和waf中的规则库所匹配,那么waf则判断此条请求为攻击行为并进行阻断,反之则放行。
常见的SQL注入绕过WAF有两种方法:
一种是利用waf可能存在的http协议解析缺陷来绕过waf,另外一种是利用各种方式来包装sql注入语句进行混淆来绕过waf的规则库。
常用手法
注意:由于WAF产品会不停更新换代,拦截手法也一再升级,所以这里介绍的方法可能会过时,请各位师傅灵活运用!
1.加密解密:通常使用异或(xor)、md5加密payload。
2.编码解码:base64、hex、Unicode、URL······
3.等价(冷门)函数:例如hex()
,bin()
等价于ascii()
,mid()
,substring()
等价于substr()
,以此类推。
4.特殊符号:我们加进去一些特殊符号,数据库不会产生其他影响,举个例子我们要查询当前用的是什么数据库,那我们select database();
就可以了,但是十有八九会被waf拦截,我们就可以在database的前面添加一些特殊符号,比如~
,!
,{
,\n
,单双引号之类的都可以。
5.注释符混用:众所周知,MySQL有多种注释符,例如#
,-- =
,/**/
。
6.空格替换:SQL语句中的空格,可以用+
,:
或它们的URL编码进行替换。
7.换行符:在URL编码中,%23
代表#
号,%0A
代表换行符。我们可以把它们加在payload里,起到迷惑waf的作用。
8.大小写绕过:例如sElECt
,dATaBasE()
。
9.双写绕过:例如selselectect
。
10.拆分绕过:以联合注入为例,我们去掉了union
发现waf不会拦截,但是去掉select
,发现waf也不会拦截。只要这两个东西在一起使用的话,就会拦截,因为union select
就是waf拦截掉的联合查询。
所以我们的绕过思路就是,不让这两个在一起,并且可以执行这个sql语句。比如说我们在union
和select
中都加上注释符,变成uni/**/on /**/select
这样,以此类推。
再以查询当前数据库为例,我们先将database()
拆开试试,我们先输入一个database
,我们发现waf不会拦截,我们在单输入一个括号(
,也不会拦截,因为这种写法是错误的。我们通过上面这个例子可以发现,拦截的不是database
也不是()
,拦截的是database()
这个整体。所以绕过的思路应该是让database
和()
拆分,但是不能影响数据库的运行,如果实现这个的话,我们也就可以实现waf的绕过了。
骚姿势
上面介绍了常用的手法,下面是我从其他师傅那里学到的骚姿势:
1.GET和POST同时请求
2.垃圾字符串
3.内联注释:例如/*!50000aaa*/
的形式,当5000小于当前MySQL版本号的时候,注释不生效,当大于版本号的时候注释生效。
4.正则表达式函数(regexp()
)
5.脚本语言特性:例如%00
截断仅可用于aspx+mssql
6.关键字替换:and
可以替换为&&
,or
可以替换为||
,(1,2)
可以替换为from 1 to 2
。
实战中一般在本地搭建环境,安装上目标机器的waf,然后使用burpsuite或者自己编写的Python脚本进行模糊测试,判断过滤掉的字符有哪些。
暂时只能想到这么多了,如果师傅们有更好的思路,可以在评论区留言,谢谢!