前言:渗透测试当中遇到一个注入,有WAF,记录一下思路。
不要嫌麻烦,如果静不下心来思考,那还不如不做技术。按照以前说的注入绕过的思路,首先还是要先看看会拦截什么语句或者关键字,这点对于后续的绕过思路很有帮助,比如substr()函数被限制了,那有没有其他函数可以替代呢?诸如此类的问题多想想,既可以完成工作,又能够学到新的知识点,做好积累。
拦截语句
首先尝试了各种常用的payload,看看WAF拦了哪些操作,发现如下语句会拦截:
- and 1=1类型
- order by num类型
- union select x类型
- sleep(5)类型
- /*!*/
- …
放行语句
在上面尝试中发现如下语句未被拦截:
- order by
- /**/
- /*/**/and if(1,1,0)
- %0a、%0b…
- …
根据上面的测试结果可以看出,WAF对于order by num和union select x类型限制的比较严格,从联合查询入手去绕不太合适,比较花时间,然而and if(1,1,0)这种形式未做拦截,所以我们可以通过盲注的形式获取数据。
测试思路
- 第一坑
当payload写到and if(substr(),1,0)
时还没有问题,但写到and if(substr(user()),1,0)
时被拦截,起初以为是user()是拦截的原因(也确实是一个原因),但后续测试发现只要substr(x)这种形式,都会被拦截。尝试使用注释和编码未果,考虑使用替代函数,这里收集了几个mysql的截取字符串的函数- substr()
- substring()
- mid()
- left()
- right()
- substring_index()
后来发现right()未被拦截(这就很有意思了,因为left被拦截了),所以我们找到了替代substr()的函数,第一坑填好了
- 第二坑
user()等函数被拦截,这没法找替代函数了,怎么办呢?
那就只能在user()上做文章了,各种尝试后发现user%0a/*%0a*/()
可以绕过WAF
后续出数据的思路就没有多少坑了,故不再详述。