12

突破正则匹配:探寻SQL注入绕过WAF的本源之道

 4 years ago
source link: https://www.freebuf.com/vuls/229300.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言:网络上SQL注入绕过WAF的帖子文章纷繁多样,良莠不齐,眉毛胡子一把抓,各种姿势让人眼花缭乱。于是,便有学生问我,SQL注入绕过WAF的最本质原理是什么…….

0X01 WAF介绍

要从本质上回答SQL注入绕过WAF的原理就首先要了解WAF。WAF(Web Application Firewal,网站应用级入侵防御系统)是对Web网站实施安全防护和负载均衡的主要工具,是大小网站标配之一,应用范围极其广泛。WAF从产品形态上来划分,可以大致分为三类: 硬件WAF、软件WAF和云WAF 。三种WAF的特点和具体例子如图所示: VB32Inm.jpg!web 目前,几乎所有的WAF都可以基于规则来识别过滤SQL注入,这是WAF优点,也是我们能够使用多种姿势绕过WAF的前提保证, 而基于规则就直接可以理解为基于正则表达式匹配 。为说明这个基础判定条件,我们通过公开资料分析主流WAF的详细参数加以佐证。

硬件 WAF :从下图可以看出,绿盟硬件WAF中明确指出,多种基于规则的检测基于规则防护来对抗SQL注入,表明硬件WAF采用正则表达式来过滤SQL注入。 nUnI3iU.jpg!web软件WAF: 安全狗作为国内一款低端主流的软件WAF产品,受到众多站长的青睐,其HTTP检测规则中提出防止复杂的and or 方式注入,防止基于时间的注入判断等,这些都表明软件WAF也采用正则表达式过滤SQL注入。 zeuueyU.jpg!web WAF :腾讯云Web防火墙中对于防止SQL注入的描述是基于AI+规则,说明云WAF在防护SQL注入时依然离不开基于规则的正则匹配。 umy2amY.jpg!web 因此, WAF使用基于基于规则的防护手段是常态,基于规则就是基于正则匹配,理解了正则表达式有助于我们从原理本质上弄清各种绕过WAF的手段

0X02 WAF正则匹配原理

正则表达式(regular expression)是使用单个字符串来描述、匹配一系列符合某种句法规则的字符串,广泛应用于各种编程代码中。例如:匹配8位数字的QQ号码的正则表达式可以写成^d{8}$;匹配1开头11位数字的手机号码可以写成 ^1d{10}$;匹配*号是14~18位的数字可以写成^d{14,18}$。正则表达式虽然是一个非常强大的处理字符工具,但其可读性很差、晦涩难懂。完整的正则表达式由两种字符构成:特殊字符(元字符)和普通字符。这里我们用正则表达式提取URL中的各个组成部分的例子来说明其原理: vEVFNbj.jpg!web 对于网站管理员来说,在用上面的正则表达式获取到URL链接中的参数提后,下一步要做的是继续使用正则表达式分析参数,过滤掉恶意攻击。为此,网站管理员可以先使用这样的正则表达式:

"[\x22\x27]\s*OR|AND\s*\d+\x3d\d+"

其中,\x22 是双引号”、\x27单引号’、\x3d为=号的ASCII编码。这样是正则表达式在忽略大小写的模式下,可以过滤类似’ or 1=1或者’ and 22=22样式的SQL注入测试,这也是上面某狗SQL注入过滤规则之一的“防止简单and or方式注入”。诚然,这样一个正则表达式太过于简单,很容易被攻击者绕过,于是网络管理员使出浑身力气,构建了一个恶意SQL注入的正则表达式库,部分如下所示:

"(OR|AND)(\s+?).+?=[\x22\x27](\s+?)[\x22\x27]$"
 "(OR|AND)(\s+?).+?=(\s+?)[\x22\x27]$", "([\x22\x27])?(\s+?)--(\s+?)([\x22\x27])?"
".+?=[\x22\x27]\*[\x22\x27]\s(AND|OR)\s.+?=[\x22\x27][\x22\x27]", "\x3bDROP"
"((\x27)|(\x22))\*((\x27)|(\x22))"
"#.+?WHERE.+?SELECT", "--.+?[\x22\x27]","%27%20","\/\*|\*\/",";.+?$"
"\w*((\%27)|(\'))(\s?)((\%6F)|(\%4F))((\%72)|(\%52))"
 "\w*((\%27)|(\'))(\s?)((\%6F)|o|(\%4F))((\%72)|r|(\%52))"
 "\w*((\%6F)|(\%4F))((\%72)|(\%52))(\s?)((\%27)|(\'))",".+?(\%2A).+?$"
".+?(0x3(a|A)).+?$", ".+?information_schema.+?$"

0X03 从正则匹配角度反观WAF绕过手法

WAF主流绕过手法主要包括 关键词替换绕过、编码替换绕过、 注释绕过和 参数污染 等。下面我们对这四种主流的绕过手法,结合正则表达式进行深度分析:

方式一:关键词替换绕过

对于SQL注入中,攻击者常用的关键词有:and, or, union, where, limit, group by, select。

针对这些关键词,WAF可以轻易写出正则匹配规则,从而阻挡攻击。为此,最有效的方法就是使用等价函数替换关键词,如用“||”替换“union”,用“group by user_id having user_id = 1”替换“limit 1”等,常用的等价函数还有:

hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()

利用这些等价函数,可以绕过WAF正则匹配对关键词的过滤机制,从而达到攻击目的, 网上很多文章大篇幅教你怎么替换关键词,其本质和出发点就在于此 。一般来说, WAF都会开启大小写同时过滤机制,尝试使用大小写绕过正则的可能性较小。

方式二: 编码替换绕过

目前,常用的编码有URL 编码、Unicode 编码、HTML 实体编码、双重URL编码等。上文已经有了ASCII编码,这里不再赘述。

例如,对于Unicode 编码,单引号: %u0027;空格:%u0020;左括号:%u0028;右括号:%u0029。

URL编码中,空格为%20、单引号为%27、左括号为%28、右括号为%29、*为%2a、/为%2f,%为%25,这些特殊字符的编码一样会被WAF录入正则匹配规则之中,单独使用%2a或者%27的话会触发正则的匹配机制。 在探知WAF对特殊字符编码进行匹配过滤后,可以使用编码绕过的“大招”,即构建二次编码绕过WAF ,具体如下所示:

攻击端

编码前:page.php?id=?id=1/**/UNION/**/SELECT

二次编码后:page.php?id=1%252f%252a*/UNION%252f%252a*/SELECT

服务器端解析过程:

第一次解码:page.php?id=1%2f%2a*/UNION%2f%2a*/SELECT

第二次解码: page.php?id=?id=1/**/UNION/**/SELECT

使用二次编码绕过正则匹配的可能性极大,优先推荐使用!

方式三: 注释绕过

常用的注释的符号有://, — , /**/, #, –+,– -, ;,–a,使用注释可以规避对空格的依赖或关键字识别,从而突破WAF正则匹配,特别是对于MySQL数据库,还可以使用内联注释,利用其“ /*!SQL语句*/ ”表示注释里面的SQL语句会被执行的特性绕过正则匹配。如union select这种关键词极易被WAF正则匹配拦截,可以使用注释uni/**/on se/**/lect混淆匹配。再比如以下SQL注入语句:

id=1 union select user,password from mysql.user

可以改为:

id=1 /*!union*/ /*!select*/  user,password /*!from*/ mysql.user

甚至还可以再综合利用编码混淆进一步变形为:

id=1 /*!%75nion*/ /*!%53elec%54*/  user,password /*!from*/ mysql.user

在搞清楚WAF的过滤规则之后,综合利用上述三种绕过方式,灵巧搭配,主动变形,绕过WAF将不再困难。

方式四: HTTP 参数污染 绕过

HTTP 参数污染绕过的原理主要是服务器在接受到用户传递过来的参数时,WAF仅检查第一个或者前几个参数,而不是将所有的参数都送入WAF进行过滤分析。针对于此,可以在后面参数中构造SQL注入语句。如:

<strong>?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users</strong>

可以利用解析容器的这一特点,综合上述三种绕过WAF正则的方法,突破WAF的SQL注入限制。

0X04 小结

SQL注入漏洞稳居OWASP Top1榜首之位,其存在范围广,危害程度大。要是用一句话总结本文,就是要如何回答文章开头那位学生的问题,现在可以这么回答: 所有的SQL注入变形方式都是为了突破WAF防御,猜解出WAF防御规则就可以针对性绕过WAF,而目前WAF防御还基本依靠正则匹配。因此,SQL注入绕过正则匹配,就可以绕过WAF!

除此之外,在撰写本文的时候,还觉得:

1.目前,主流WAF基本全部依靠正则表达式过滤用户输入, 由于需要在业务可用性和安全性之间寻找平衡点 ,正则表达式必不会穷举所有的攻击形式,只要使用正则,就有被绕过的可能。

2.目前,单一的绕过手段很难突破高级WAF,需要手注几次尝试猜解WAF正则形式,从而综合使用多种绕过手段进行精准突破。

3.网上绕过WAF的帖子教程繁多,在学习过程中,需要根据WAF防御本质,抓住要害,学习效果才能事半功倍。

本文不妥之处,还请各位大牛批评指正,也欢迎童鞋们站内信加我讨论交流,共同提高安全技能!

*本文原创作者:DD想上学了,本文属于FreeBuf原创奖励计划,未经许可禁止转载


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK