目标站点
aHR0cHM6Ly93d3cuY2hhbmdhbmp5enguY29tLw==
某雷池waf
这里逆向的是公开的demo版本,它的反爬点一般是防调试、浏览器指纹,在这基础上通过它的接口请求拿到有效cookie即可
想要应用它或者深入了解它所提供的功能,可以参考这篇博客自己部署一个:雷池waf搭建
逆向破解
某亭雷池 waf 验证码逆向分析这篇博客已经很详细讲解了逆向过程,大家跟着它来就能实现破解流程,下面内容是我在此基础上对某些步骤的破解增加写思路。
逆向流程整理
- 首次访问网址,响应码是
468
- 雷池waf检测文件是
challenge.js
,一系列检测和加密都是在此完成,我们要替换和修改代码的就是这个文件 - 控制台检测绕过
devtoolsFormatterChecker
: 控制台格式检查器_detectLoop
: 循环检测函数_detectLoopDelay
: 循环间隔isOpen
: 打开函数- 最终将
devtoolsFormatterChecker
调用处注释掉即可绕过控制台检测
- 抓包分析
issue
接口: client_id 第一次请求首页 468 响应内容里的verify
接口需要逆向的参数:issue_id
:issue
接口返回的issue_id
result
:issue
接口返回的data
列表进行wasm
加密后得到visitorId
:浏览器指纹参数,雷池waf使用的是三方库生成
- 验证测试
verify
接口请求成功后会返回jwt
参数,将其传给cookiesl-challenge-jwt
- 再次请求网址,成功后响应码是200,且返回
sl_jwt_session
和sl_jwt_sign
- 请求post接口数据
逆向思路思考
verify接口 result 参数
这一步调试中,上面那篇博客使用的是Hook的方式找到生成位置
originalCreateObjectURL = URL.createObjectURL;
URL.createObjectURL = function(obj) {
console.trace("Blob 被创建了", obj);
debugger;
return originalCreateObjectURL.call(this, obj);
};
这里提供另一个调试思路:
添加XHR断点
,对verify
接口进行监控,刷新界面就会在发起请求处断住,这里调用堆栈
这里调用处是一个临时生成的本地对象链接,可以跳转过去查看调用代码,但是进去后是无法成功下断点调试的,所以我们可以退而求其次在调用这个文件前的代码下断点
重新刷新断住后进入下一步就是关键代码位置了。
wasm加密处理
上面那篇博客提供了两种方式,一个是nodejs直接调用wasm文件;一个是暴漏出来的加密算法。
这里提供另一个思路:
使用Binaryen
将wasm转成js代码,这样好实现加密算法
- 直接下载预编译版本:Binaryen releases
- 解压缩后,执行
./binaryen-version_123/bin input.wasm -o output.js
- 转换后的js代码会保留原有的方法名,只要根据网站实际调用代码使用即可。
不太清楚博客提供的暴漏出来的加密算法是怎么看出来的,通过转换得到的js代码硬扣还是可以转成python的,就看大家顶不顶了。