今天,一位朋友遇到sql注入漏洞,被waf给拦截了。目标使用的中间件为nginx,可以使用updatexml进行报错注入,waf使用mod-security规则,而且开发人员自己改写了规则,禁用了concat等常见字符串拼接函数。朋友一开始使用hex来读取数据,后来发现部分数据会丢失。原因很简单,updatexml中存在特殊字符、字母时,会出现报错,报错信息为特殊字符、字母及之后的内容,而hex出的数据包含字母和数字,所以第一个字母前面的内容都会丢失,如下图:
既然updatexml函数是从特殊字符、字母后面开始截取的,我们就需要在我们想要的数据前面拼接上特殊字符。waf禁用了concat等常见字符串拼接函数,那么我们可以使用冷门的字符串处理函数绕过,这里感谢雨了个雨
师傅提供的payload
1 | mysql> select updatexml(1,make_set(3,'~',(select user())),1); |
关于make_set函数的用法,可以参考:mysql MAKE_SET()用法 ,我们还可以找到类似的函数:lpad()、reverse()、repeat()、export_set()(lpad()、reverse()、repeat() 这三个函数使用的前提是所查询的值中,必须至少含有一个特殊字符,否则会漏掉一些数据)。
1 | mysql> select updatexml(1,lpad('@',30,(select user())),1); |
还有一个要注意的是:updatexml报错最多只能显示32位,我们结合SUBSTR函数来获取数据就行了。