前言
某次渗透中遇到的注入存在双层waf的情况,第一层是云waf第二层似乎是本地的安全狗或者是代码层面的防护,后端数据库是mysql,jsp环境,最终通过多次fuzz的方式成功找到突破口,并且利用sqlmap的tamper脚本来获取数据.
正文
首先来看一下这个双层waf的大概情况,首先是云waf,利用一个简单的 'and '1'='1 触发waf
渲染后的样子
有兄弟看出这个是啥牌子的waf嘛 有的话希望告知一下 小弟没看出来
因为后端是mysql 所以直接用&&替换了 and 并且url编码一下 因为是特殊字符 直接就过了 我是没想到的 0_0
其他更多的payload我还没测试我在回包里发现还有检测,应该是本地的安全狗或者是代码层面的检测
换一个 or 对应的 || 试试
偶哟 还不错哦 检测了=号 我们用 like 来替换一下
成功过去了 我低头沉思 虽然过去了 但是好像没有什么卵用 单纯or 用 || 替换 =用 like 替换 那么其他的payload 会不会被检测到了 我觉得多半是会被检测到的 我们来试一试 因为这个返回是把错误打印出来的 多半是支持报错注入的
找个报错注入的payload试一试 稍微加点注释和换行
理所当然的被拦截了 这都拦截不鸟的话 这云waf也太垃圾了 0_0
如果想要真正把这个注入利用起来,也就是最终想要获取到数据库数据,那么多半要找一个一劳永逸,比较通用的绕过方法,类似于 假定可以双写绕过 那么利用 sqlmap 的tamper 把所有关键字双写 假如只是不允许有空格 那么用其他能绕过检测的东西批量替换空格 获取数据 所以我想寻找到类似上述两种情景的这么一个突破口
于是我开始fuzz 还有一个比较好的地方是 因为如果语法出错 返回包会把具体位置 语句 给你爆出来 所以我们可以对着 返回包来fuzz
首先 如果语法有问题那么 返回包会显示具体情况
我特地构造了一个 payload 来fuzz
fuzz payload 如下
我想找到一个会被替换为空的字符 如果存在这样一个字符那么肯定可以绕过waf 利用sqlmap 获取数据 如果存在这么一个字符 返回结果里肯定有123321 那么我只需要在结果里寻找这个123321就好
加载 16进制数据 00 01 一直到 100(256的16进制) 测试所有字符 看有没有机会
在intruder 爆破结束后的 option 选项里 可以设置要寻找的数据 下图就是设置要寻找的123321
结果没有发现这样一个字符
不慌 我们继续来fuzz 我们来用两次urlencode试试 看后端怎么处理
这次构造的payload如下 就是urlencode了两次 对要测试的字符 我只要在结果里寻找123321就好
let's go
bingo 有结果了 0_0 运气不错 第二次fuzz 就中奖了 奥里给
可以看到 %2527被替换为空了只剩下123321 因为post的时候 会自动urldecode一次 所以后端程序其实是把%27替换为空了
这么多组合都可以用来绕waf 嘿嘿 简单测试一下 报错注入
哦哟 舒服了 接下来就是修改sqlmap tamper 来获取数据
什么是sqlmap的tamper
sqlmap是一款人见人爱的自动化SQL渗透工具,能够以良好的引擎发现给定URL中的可注入处,并自动化的完成注入。但是由于SQL注入的影响过于广泛,致使现代程序的防护越来越严密。sqlmap/tamper是官方给出的一些绕过脚本,可以配合渗透测试人员完成更高效更高质量的测试
至于sqlmap有哪些tamper 作用是啥 可以参考 https://www.freebuf.com/sectool/179035.html
修改sqlmap-tamper-获取数据
不得不感叹一句 sqlmap真乃神器 已经写好的tamper 功能基本就满足大多数场景了 在这里我的目标是在每一个字符前加上%2527在sqlmap自带的tamper中已经有一个叫 percentage.py的,这个的功能是在每个字符前加% 我只需要改成加%2527就行 非常简单 我们先看一下这个tamper大概长啥样
框起来的部分是关键 sqlmap把原来的payload 每一个字符前加%后给retVal 并且重新拼接起来 那么我只需要改一句
retVal += '%%2527%s' % payload[i]
就好
还有 =号之前说过是会被检测的 只需要 把=号 换成 like 在最后加上
retVal = re.sub(r"\s*=\s*", " LIKE ", retVal)
最终的tamper 如下
sqlmap 真乃神奇也 简直奥里给
好了 现在就来一把梭
sqlmap 命令如下 ; python2 sqlmap.py -r "d:\sqlmap.txt" --dbms=mysql --technique=E --tamper mypercentage
我开始了 嘿嘿