返回
Featured image of post SQL 注入绕 WAF

SQL 注入绕 WAF

go!

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检测

HTTP请求走私

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy