主页 > 网络知识 > 突破正则匹配:探寻SQL注入绕过WAF的本源之道(2)

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

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注入语句。如:

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

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

0X04 小结

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

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

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

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

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

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!