已经超过 707 天,自上次更新后,文章内容可能已经过时。

编者荐语:渗透总是在不断试错,一次次的fuzz总会找到出路。

转载自:https://www.yuque.com/broken5/blog/lpdex0#HQxQs

0x01 前言

之前遇到过遇到过类似的注入,因为某种原因在注入语句中不能存在逗号,环境又是MSSQL,所以很难构造出来有效的payload。今天在测试的时候又遇到了,怼了几个小时终于出货了,详情见下文

0x02 复现

首先是一个提交选择的表单

img

img

dcid_5进行了注入测试,结果如下

php
1
2
3
4
5
6
7
8
9
10
11
payload: 36 * 1
结果:200

payload: 36 * a
结果: 500

payload: len(user)
结果: 200

payload: len(usera)
结果: 500

img

基本上断定这就是一个注入,然后尝试利用substring(user,1,1)结果报错了

img

后续又测试了left(user,1)、rigth(user,1)、convert(int,1)都是返回500

img

测试到这里,我发现可能不是单纯的SQL语句拼接

仔细观察参数发现了猫腻,dcid_6=39&dcid_6=42&dcid_6=386这三个参数传到WEB服务器,由于.Net解析的特性就变成了dcid_6=39,42,386

img

加上这是个答案提交的表单,肯定是WEB应用先将参数用逗号分割成列表然后再遍历列表将语句拼接到SQL中,所以这也就导致了我测试的payload只要有逗号就报错

img

所以得构造一个没有逗号的payload,首选是(case when user like 'a%' then 1 else user end)

解析:如果user like 'a%'返回1否则返回user,由于对应的字段类型是整数型,传入字符型user会导致服务器报错,所以可以借此判断注入

但是目标环境还有WAF,用这条payload被拦截了

img

Bypass WAF首选是畸形包,因为可以直接绕过,比较方便

如下图我用filename字段伪造了一个假的文件上传,欺骗了WAF

img

然后就用intruder直接跑就行,跑出来第一个字符是l

img