作者:broken5 原文地址:见阅读原文
0x01 前言
0x02 复现
首先是一个提交选择的表单
对dcid_5进行了注入测试,结果如下
payload: 36 * 1
结果:200
payload: 36 * a
结果: 500
payload: len(user)
结果: 200
payload: len(usera)
结果: 500
基本上断定这就是一个注入,然后尝试利用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
END
往期回顾
技术分享 | spring-security 三种情况下的认证绕过
实用工具 | ChatGPT Tools,无需登录网址即可直接使用
技术分享 | 如何利用HTTP头部注入漏洞赚取12500美元的赏金
技术分享 | Windows文件/文件夹隐藏技巧,无需借助三方软件
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,文章作者和本公众号不承担任何法律及连带责任,望周知!!! |
点赞是鼓励 在看是认同 分享是传递知识
看完点个“在看”分享给更多人
原文始发于微信公众号(杂七杂八聊安全):实战 | 一次没有逗号的MSSQL注入