记一次思路新奇的绕WAF sql注入

sssaa   ·   发表于 2021-05-17 11:53:27   ·   实战纪实

来到某高校网站,随便找了一个页面,看URL栏,发现有两个传参


先试试分别给两个传参加入引号
第一个传参:


发现报错弹窗,顺手测试了一下其他符号,发现都弹窗报错,这里过滤太过严密,于是放弃这个点,转手测试下一个传参

第二个传参:


发现报错,还直接把sql语句给爆出来了!看到发现有魔术引号
并可以通过观察语句发现这是个数字型的,可以尝试数字型注入
遇事不决,先or 1=1 (观察语句可以发现不用注释)


这里就非常尴尬了,页面打转,它估计是对什么语句做了过滤,只要你打了关键词触发了他的waf,他就直接给你die() 我这里直接就被链接重置了

接着,我想先试试有什么语句被过滤,于是顺手测了一下,手测出来有
‘union select’,
’substr(xxx)’,
’database()’,
’x=x’,
’version()’,
’@@version’,
’sleep()’
这就有点麻烦,关键语句都给过滤了,最变态的是如果检测到()内有值,他就直接重置链接。

找了找百度上的绕过滤方法,测了一下都不行,不过我发现一个他们用来绕空格的办法:用/**/可以绕过过滤了空格的网站。这个网站并没有空格过滤,但是处于好奇心,我百度了一下/**/是什么意思,一查,原来是注释,而且还有查到一个用法/*!*/
mysql为了保持兼容,它把一些特有的仅在mysql上用的语句放在/*!….*/中,这样这些语句如果在其他数据库中是不会被执行,但在mysql中它会执行。

查到这里,我想了想,虽然我这个网站没有过滤空格,但我是不是可以利用这些注释,或者/*!..*/来绕过一些关键词呢?

在mysql数据库中执行了一下un/**/ion


发现报错了,原因是因为/**/相当于一个空格,会把语句隔开,导致union变成了un ion

接着又想了想,substr()这个函数括号内有数值会被过滤,但是如果我在里面先放入注释符然后再写内容行不行?


发现页面正常回显,语句被执行了。(奇奇怪怪,我到现在还没能猜出来这到底是怎么过滤语句的)

再这个语句后面加个 = 1试试能不能执行


页面打转,说明不行,链接给重置了。

换上等价的like试试

页面显示正常,再换成like 2试试


发现页面上本来有一个’当前位置’里面的’内页banner’不见了,然后测了一下like 3 like 4都是’内页banner’不见,说明确实是语句被执行。这里存在布尔盲注

把substr里的第一个1改成database(),尝试,因为database()被过滤,改成使用database(/**/)
发现还是链接重置,不行再换,用database/**/(/**/)还是不行,再换,用/*!database/**/(/**/)*/,还是不行。
我想了想,难道是因为substr的括号和后面的database()的括号离得太近被过滤了??
这么想,于是我就换了个方式


发现没有被重置链接,激动的跳起来!(虽然还是不知道为什么运行起来了,奇奇怪怪)

接下来就是激动人心的爆库环节。因为开了魔术引号,所以用不了’xxx’,这里就用16进制就可以了
开burp抓包,添加16进制字典

爆破出来是0x5f 和0x68 查一下是_和h,这里会有两个结果,是因为_是任意字符

记录下来爆破下一个,到第6个感觉数据库名字是不是有点长
于是尝试爆出数据库长度


测出这个语句可以,于是上爆破

发现数据库为13位,老老实实爆数据库名字吧


最后成功爆出数据库名字,提交,完成
这次sql注入难度感觉很大,语句虽然说已经很熟了,可是难点就在于那个waf怎么绕过,在这上面花费了一天时间,特别是database()这个函数不知道怎么绕过,其实一开始我爆的是@@datadir,在写笔记的时候才发现原来database()可以绕,看来写笔记还是有意义的

用户名金币积分时间理由
Track-聂风 65.00 0 2021-05-21 20:08:43 继续加油

打赏我,让我更有动力~

1 Reply   |  Until 21天前 | 301 View

Track-聂风
发表于 21天前

最后还是内联注释绕过了,其实我记得可以 database/**/()

评论列表

  • 加载数据中...

编写评论内容
LoginCan Publish Content
返回顶部 投诉反馈

掌控者 © 2016 - 2021. All Rights Reserved. 掌控者

Powered by 掌控者