已经超过 707 天,自上次更新后,文章内容可能已经过时。
编者荐语:渗透总是在不断试错,一次次的fuzz总会找到出路。
0x01 前言
之前遇到过遇到过类似的注入,因为某种原因在注入语句中不能存在逗号,环境又是MSSQL,所以很难构造出来有效的payload。今天在测试的时候又遇到了,怼了几个小时终于出货了,详情见下文
0x02 复现
首先是一个提交选择的表单
对dcid_5
进行了注入测试,结果如下
php
1 | payload: 36 * 1 |
基本上断定这就是一个注入,然后尝试利用substring(user,1,1)
结果报错了
后续又测试了left(user,1)、rigth(user,1)、convert(int,1)
都是返回500
测试到这里,我发现可能不是单纯的SQL语句拼接
仔细观察参数发现了猫腻,dcid_6=39&dcid_6=42&dcid_6=386
这三个参数传到WEB服务器,由于.Net
解析的特性就变成了dcid_6=39,42,386
加上这是个答案提交的表单,肯定是WEB应用先将参数用逗号
分割成列表
然后再遍历列表
将语句拼接到SQL中,所以这也就导致了我测试的payload只要有逗号
就报错
所以得构造一个没有逗号的payload,首选是(case when user like 'a%' then 1 else user end)
解析:如果user like 'a%'
返回1
否则返回user
,由于对应的字段类型是整数型
,传入字符型
的user
会导致服务器报错,所以可以借此判断注入
但是目标环境还有WAF,用这条payload被拦截了
Bypass WAF首选是畸形包,因为可以直接绕过,比较方便
如下图我用filename
字段伪造了一个假的文件上传,欺骗了WAF
然后就用intruder直接跑就行,跑出来第一个字符是l
评论