手把手js逆向断点调试&js逆向前端加密对抗&企业SRC实战分享
字数 1712 2025-08-22 12:22:15
JS逆向工程实战指南:断点调试与前端加密对抗
0x1 前言
本文旨在为安全研究人员提供全面的JS逆向工程实战指南,涵盖基础概念、调试技巧、加密算法分析以及实际漏洞挖掘案例。适合刚接触JS逆向的初学者,也包含对经验丰富的安全研究人员有价值的实战技巧。
0x2 JS逆向基础概念
作用域(Scope)
作用域决定了变量、函数和对象在代码中的可访问范围:
-
全局作用域:
- 在所有函数和代码块之外声明的变量
- 示例:
const globalVar = "我是全局变量"; function test() { console.log(globalVar); // 可访问 }
-
函数作用域:
- 在函数内部声明的变量,仅在该函数内部可访问
- 示例:
function test() { const funcVar = "我是函数内变量"; console.log(funcVar); // 可访问 } console.log(funcVar); // 报错:未定义
-
块级作用域:
- 由
{}包裹的代码块中用let/const声明的变量 - 示例:
if (true) { const blockVar = "我是块内变量"; console.log(blockVar); // 可访问 } console.log(blockVar); // 报错:未定义
- 由
调用堆栈(Call Stack)
调用堆栈是JavaScript引擎管理函数调用顺序的数据结构,遵循"后进先出"原则:
-
工作原理:
- 函数被调用时,创建"执行上下文"并压入栈顶
- 函数执行完毕,其执行上下文从栈顶弹出
- 栈顶始终是当前正在执行的函数
-
示例:
function a() { console.log("a开始"); b(); console.log("a结束"); } function b() { console.log("b开始"); c(); console.log("b结束"); } function c() { console.log("c执行"); } a(); -
调用堆栈过程:
- 执行
a()→a入栈 → 栈:[a] a中调用b()→b入栈 → 栈:[a, b]b中调用c()→c入栈 → 栈:[a, b, c]c执行完毕 →c出栈 → 栈:[a, b]b执行完毕 →b出栈 → 栈:[a]a执行完毕 →a出栈 → 栈:[]
- 执行
0x3 加密算法定位技巧
使用浏览器开发者工具
-
XHR断点:
- 在Chrome开发者工具的"Sources"面板中设置XHR断点
- 可拦截特定URL模式的AJAX请求
-
DOM断点:
- 可设置在DOM元素被修改时触发断点
- 适用于表单提交前的事件监听
-
事件监听器断点:
- 可设置在特定事件(如click, submit)触发时中断
常见加密特征识别
-
AES加密特征:
- 关键词:
AES,CryptoJS.AES,mode,padding - 典型模式:
CBC,ECB - 常见密钥长度:128, 192, 256位
- 关键词:
-
RSA加密特征:
- 关键词:
RSA,publicKey,privateKey,modulus,exponent - 常见库:
jsencrypt,forge
- 关键词:
-
签名校验特征:
- 关键词:
sign,signature,md5,sha1,sha256 - 常见参数:
timestamp,nonce,token
- 关键词:
0x4 实战调试技巧
断点调试流程
-
定位关键函数:
- 通过搜索加密参数名(如
encrypt,sign)找到相关函数 - 通过调用堆栈回溯加密过程
- 通过搜索加密参数名(如
-
动态修改:
- 在断点处修改变量值测试加密逻辑
- 可绕过某些前端校验
-
Hook技巧:
- 覆盖原生函数如
JSON.stringify,XMLHttpRequest.send - 示例:
var oldSend = XMLHttpRequest.prototype.send; XMLHttpRequest.prototype.send = function() { console.log("拦截请求:", arguments); return oldSend.apply(this, arguments); };
- 覆盖原生函数如
微信小程序加密分析
-
AES加密绕过:
- 定位密钥生成逻辑
- 提取或固定IV向量
-
RSA加密分析:
- 获取公钥生成逻辑
- 尝试固定公钥或修改加密参数
-
Sign签名绕过:
- 分析签名生成算法
- 尝试重放有效签名
- 修改时间戳等参数测试
0x5 企业SRC实战案例:商城优惠券并发漏洞
漏洞发现过程
-
接口分析:
- 通过抓包发现优惠券领取接口
- 分析请求参数和加密逻辑
-
并发测试:
- 使用工具同时发送多个领取请求
- 观察服务器响应和账户余额变化
-
结果验证:
- 确认可超额领取优惠券
- 验证漏洞可被利用获取超额优惠
漏洞修复建议
-
服务端校验:
- 增加领取频率限制
- 实现原子操作保证数据一致性
-
签名强化:
- 增加请求唯一性标识
- 强化签名算法复杂度
-
监控机制:
- 实现异常领取行为监控
- 设置自动告警阈值
0x6 总结
JS逆向工程需要结合扎实的JavaScript知识、熟练的调试技巧和对加密算法的理解。通过本文介绍的方法,安全研究人员可以:
- 有效定位前端加密逻辑
- 掌握实用的调试和Hook技巧
- 分析常见加密算法实现
- 应用于实际漏洞挖掘场景
建议读者通过搭建本地靶场实践所学知识,逐步提升逆向分析能力。