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

栏目: IT技术 · 发布时间: 4年前

内容简介:前言:网络上SQL注入绕过WAF的帖子文章纷繁多样,良莠不齐,眉毛胡子一把抓,各种姿势让人眼花缭乱。于是,便有学生问我,SQL注入绕过WAF的最本质原理是什么…….要从本质上回答SQL注入绕过WAF的原理就首先要了解WAF。WAF(Web Application Firewal,网站应用级入侵防御系统)是对Web网站实施安全防护和负载均衡的主要工具,是大小网站标配之一,应用范围极其广泛。WAF从产品形态上来划分,可以大致分为三类:硬件

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

0X01 WAF介绍

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

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

0X02 WAF正则匹配原理

正则表达式(regular expression)是使用单个字符串来描述、匹配一系列符合某种句法规则的字符串,广泛应用于各种编程代码中。例如:匹配8位数字的QQ号码的正则表达式可以写成^d{8}$;匹配1开头11位数字的手机号码可以写成 ^1d{10}$;匹配*号是14~18位的数字可以写成^d{14,18}$。正则表达式虽然是一个非常强大的处理字符工具,但其可读性很差、晦涩难懂。完整的正则表达式由两种字符构成:特殊字符(元字符)和普通字符。这里我们用正则表达式提取URL中的各个组成部分的例子来说明其原理: 突破正则匹配:探寻SQL注入绕过WAF的本源之道 对于网站管理员来说,在用上面的正则表达式获取到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原创奖励计划,未经许可禁止转载


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

游戏编程入门

游戏编程入门

莫里森 / 人民邮电出版社 / 2005-9 / 49.00元

本书介绍如何设计和构建自己的计算机游戏。书中从零开始,引导读者开发一个“即插即用”的游戏引擎,并基于该引擎,循序渐进地开发7个完整的游戏。全书分为8个部分,共24章,内容包括游戏编程基础知识、如何与玩家交互、使用子画面动画、使用声音和音乐、高级动画、游戏人工智能、增添游戏的趣味性和附加练习。此外,在随书光盘中提供有附录,包括C++语言和windows编程的入门指导、游戏开发工具以及游戏图形创建的介......一起来看看 《游戏编程入门》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换