瑞数WAF保护站点的渗透测试
The following article is from KQsec Author Win64debug
公众号现在只对常读和星标的公众号才展示大图推送,
建议大家把听风安全设为星标,否则可能就看不到啦!
----------------------------------------------------------------------
在一次测试项目中碰到一个站点很奇怪,每次请求的时候在url后面都会跟一个长长的加密字符串,而且请求都是一次性的(或者很短的时效性),不能通过burp的Repeater进行重发,效果如下图所示。
删除加密参数后重发,出现了瑞数WAF比较常见的特征,即响应码 412 ,和响应包中 以$_ts
开头的变量以及一大堆看不懂的长字符串
被瑞数WAF保护站点的特征
1、首次请求网页状态码返回202/412,重发数据包响应码为400或412(删除URL中的加密参数后)
2、禁止F12,出现两个循环 debugger
3、查看Cookie
HttpOnly 打✔ 的cookie是服务器返回的,一般判断瑞数WAF版本是看客户端生成的Cookie ,在这里就是FSSBBIl1UgzbN7NT的对应的值,m开头,说明这是瑞数VMP版本。
具体如何区分瑞数版本,请查看这篇文章:
js逆向思路-区分瑞数vmp/6/5/4/3反爬
https://mp.weixin.qq.com/s/rqrqCv4h4FoHdb1vsBYlLQ
二、测试方法
背景
在某个站注册了两个账号后发现了一个查询接口:/projectaudit/users/queryDetail ,请求数据格式:{"userId":"xxxxxx"},现在希望测试这个站点有没有越权漏洞。假如没瑞数WAF保护,这个需要分分钟钟就能测完,但是瑞数在中间搞事情,加了很多验签和加密在里头,导致不能重放数据包。
一、hook send 函数,实现数据包重发
首先绕过无限循环的debugger ,在前文提到的2个debugger处,右击鼠标选择,就可以开始调试了。
添加xhr断点,将接口关键词设置为断点参数
在网页上重新请求该页面,成功拦下
回溯【调用堆栈】找到比较靠后的发包点:send()函数
$_198.withCredentials = $_55,
$_198.send($_345),
$_139;
$_345 刚好为post请求中的内容
下面的工作就是hook住这个send函数,实现更改函数后手动发包。
手动修改 $_345
参数的内容,赋值为需要查询的 userid ,放过这个断点,就将篡改的内容发送出去了。但是这种方法太麻烦了,每次都要调试到这个地方,而且需要筛选到这个URL。
二、直接调用XMLHttpRequest
function rsPost(path, bodyData) {
var a, s, u = new window.XMLHttpRequest;
u.open("POST", path, false)
u.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
u.setRequestHeader("Content-type", "application/json");
u.send(bodyData)
if (4 === u.readyState) {
return u.responseText;
}
}
如果请求头中携带了认证信息,还需要手动设置:
u.setRequestHeader("Authorization", "Bearer ......);
测试在 /projectaudit/users/queryDetail
接口查询 userId
path = '/projectaudit/users/queryDetail'
data = '{"userId":"1691375873224982530"}'
rsPost(path,data)