js逆向实战:突破wasm加密与waf检测的攻防博弈

张开发
2026/4/19 11:27:43 15 分钟阅读

分享文章

js逆向实战:突破wasm加密与waf检测的攻防博弈
1. 当WASM遇上WAF一场加密与检测的巅峰对决最近在分析某个电商平台时遇到了一个有趣的案例。这个网站不仅部署了WAF防护关键业务逻辑还用WASM进行了加密。就像闯关游戏里的双重BOSS需要先绕过门口的保安WAF再破解保险箱密码WASM。下面我就用这个真实案例带大家体验完整的逆向过程。先说说这个网站的防护特点首次打开页面会加载WAF检测脚本通过468状态码返回client_id核心接口参数经过WASM加密响应数据里还藏着验证彩蛋。这种组合拳在金融、电商领域越来越常见我去年处理的类似案例就有7起。2. WAF检测的破解之道2.1 初识雷池WAF打开开发者工具就触发警告这是典型的环境检测。我试过三种方法分离式调试窗口 - 依然被识别禁用断点调试 - 无法分析逻辑修改UserAgent - 治标不治本关键检测逻辑藏在waf-module.js里用AST工具分析后发现检测项多达42项包括浏览器指纹特征开发者工具特性常见自动化工具标记// 典型检测代码示例 function checkDevTools(){ let score 0; if(window.Firebug) score 30; if(window.__nightmare) score 50; return score; }2.2 动态补丁技术在Chrome扩展中注入这段代码可绕过检测// 覆盖检测函数 const oldCheck unsafeWindow.checkDevTools; unsafeWindow.checkDevTools function(){ return 0; // 永远返回0分 };更彻底的做法是使用Mitmproxy拦截响应直接替换检测脚本。实测需要保持三个关键点维持原始session保留client_id参数模拟468状态码流程3. WASM加密逆向实战3.1 定位加密入口通过Network面板发现关键线索issue接口返回加密数组verify接口提交处理后的数据WASM模块在首次加载时初始化在Chrome的Memory面板抓取WASM实例# 导出wasm模块 chrome://inspect/#devices - Memory - Take heap snapshot3.2 WASM动态调试技巧遇到临时文件断点消失的问题时我的解决方案是勾选Async stack traces选项在WebAssembly.Instance入口打断点使用wasm-decompile工具反编译关键参数处理流程原始数组 - WASM加密 - Base64编码 - 表单提交3.3 算法还原实战用WABT工具链处理wasm文件wasm2wat module.wasm module.wat wat2wasm module.wat -o decoded.wasm在逆向过程中发现该网站使用了改良版的XXTEA算法有三个关键修改轮次从32增加到64初始魔数改为0x9E3779B9增加了动态S盒变换4. 攻防对抗的深层思考4.1 WAF的进化趋势现代WAF不再单纯依赖规则库而是结合行为特征分析鼠标轨迹、输入频率环境指纹收集WebGL渲染、音频上下文机器学习模型异常请求识别4.2 WASM保护方案对比方案防调试能力性能损耗逆向难度纯WASM★★☆5%★★★WASM混淆★★★8%★★★★WASM虚拟机★★★★15%★★★★★5. 实战中的那些坑缓存陷阱WAF会校验脚本一致性直接修改JS会导致签名校验失败。我的解决方案是Hookcrypto.subtle.digest方法。时间对抗加密算法中植入了时间戳校验误差超过2秒就失效。需要重写Date.now方法let fixedTime 1625097600000; Date.now () fixedTime;隐式校验响应数据中的彩蛋其实是MAC校验需要额外处理X-Signature头字段。

更多文章