本文来源:WebRAY
http://192.168.6.183/test/sqli.php?&id=@`/*`%20union%20select%20@`*/`%20from%20user 
曾几何时,某WAF就出现过一个很经典的绕过方式(相信懂的小伙伴肯定秒懂我说的是谁,当然现在已经修复了),如图2.3.3所示。这里面最主要的是通过两个不存在的参数来引入多行注释/**/。
内联注释已经被广泛使用于绕过WAF,目前主流的WAF对内联注释基本上都做了比较好的防御,如图2.4.1所示。
这里有一个问题是内联注释/*!50001注释内容*/中的数字可以允许有哪些?实际上内联注释里的数字只要小于当前mysql版本号就可以。例如假设当前mysql版本为5.7.34,那么小于等于50734的五位数字都可以执行。部分WAF在Normalize阶段对这块的处理并不严格也会导致绕过,如图2.4.2所示。
原文链接
1、Normalize概述
在上一篇文章中,我们简要描述了WAF检测的流程,详述了通过编码方式绕过WAF的思路。传送门:
图2.3.2 通过伪造注释绕过WAF
曾几何时,某WAF就出现过一个很经典的绕过方式(相信懂的小伙伴肯定秒懂我说的是谁,当然现在已经修复了),如图2.3.3所示。这里面最主要的是通过两个不存在的参数来引入多行注释/**/。

图2.3.3 通过构造不存在参数带入/**/绕过WAF
2.4 内联注释问题
内联注释是属于mysql特有的一种特性,并不适用于其他数据库。内联注释的使用方式有两种,如表2.4.1所示。表2.4.1 内联注释的使用方式
类型 | 内联注释 | 数据库引擎解析 |
普通注释 | /*union*/select | select |
内联注释 | /*!union*/select | union select |
内联注释 | /*!50001union*/select | union select |

图2.4.1 两种内联注释均能被WAF识别并拦截
这里有一个问题是内联注释/*!50001注释内容*/中的数字可以允许有哪些?实际上内联注释里的数字只要小于当前mysql版本号就可以。例如假设当前mysql版本为5.7.34,那么小于等于50734的五位数字都可以执行。部分WAF在Normalize阶段对这块的处理并不严格也会导致绕过,如图2.4.2所示。

图2.4.2 绕过WAF的内联注释数字
3、总结
可能有的小伙伴会问,WAF在normalize阶段,除了会对注释符进行替换之外,还会不会有其他的处理动作?一般来说,normalize阶段还可能会有的动作包括:1) 把所有的不可见字符替换为空格
2) 把百分号%替换为空(兼容mssql+asp的场景)
3) 把上传文件的内容替换为空(上传文件较大,部分WAF为了提高效率,会在正则之前先把上传文件的内容替换为空)
只要是WAF进行了操作,那么就可能会有被利用的空间,我们站在WAF设计的角度来分析WAF可能出现的安全性问题,就会发现其实可利用的点还有很多。
本文以安全研究为目的,不针对特定WAF产品,请勿对号入座。原文链接
转载请注明来自网盾网络安全培训,本文标题:《Normalize导致的WAF安全性研究》
标签:
- 上一篇: PHP反序列化及绕过
- 下一篇: 【安全头条】新的工业间谍被盗数据市场通过裂缝、广告软件推广
- 关于我们