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语句。比如说我们在unionselect中都加上注释符,变成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脚本进行模糊测试,判断过滤掉的字符有哪些。

暂时只能想到这么多了,如果师傅们有更好的思路,可以在评论区留言,谢谢!


SQL注入(四)--WAF绕过思路
https://rookieterry.github.io/2021/09/27/SQL注入(四)-WAF绕过思路/
作者
HackerTerry
发布于
星期一, 九月 27日 2021, 2:52 下午
许可协议