JS逆向-加密算法解密与Sign签名绕过 在渗透测试中前端加密是阻碍参数篡改、重放攻击和漏洞验证的常见障碍。无论是登录密码加密、API签名还是返回数据加密只有破解或模拟其算法才能构造有效请求、发现后端漏洞。本笔记从实战出发系统梳理加密算法定位、解密模拟的方法论以及Sign签名机制的绕过技术涵盖“扣代码”与“替代库”两种核心策略。1. 加密算法定位找到加密入口定位加密函数是解密的第一步常用两种方法方法操作适用场景调用堆栈回溯在发起网络请求的XHR断点处通过调用堆栈向上回溯寻找加密函数。加密逻辑与请求发送紧密耦合易找到调用关系。关键字全局搜索在Sources面板中搜索请求参数名如password、sign、加密方法名如encrypt、md5或常量。加密函数命名规范或参数名可见。实战步骤网络面板定位请求找到包含加密参数如param、sign的请求。XHR断点拦截在Sources面板设置XHR断点URL包含关键字刷新页面触发断点。调用堆栈分析断点处查看Call Stack从栈顶向下查找重点关注名称含encrypt、hash、submit等函数。进入加密函数点击栈帧进入可疑函数观察参数和作用域找到加密逻辑。2. 解密策略扣代码 vs 替代库模拟根据算法复杂度和依赖环境可选择两种策略策略原理优点缺点适用场景扣代码JS模拟将加密函数及其依赖的完整代码从浏览器中复制在Node.js中运行。无需理解算法细节100%还原。代码可能庞大、依赖Web环境需模拟DOM、混淆度高时难以扣全。加密函数独立无复杂外部依赖如WebAssembly、Canvas。替代库模拟分析算法类型AES、RSA、MD5用Python/Node.js的标准库重新实现。代码简洁、可控适合自动化集成。需要识别算法类型和参数key、iv、mode。算法标准、密钥已知或可逆向提取。3. 请求数据解密实战扣代码模拟场景登录请求参数password被加密需模拟加密算法以爆破密码。步骤定位加密函数在登录请求处打断点通过调用堆栈找到处理密码的函数例如hidetxtPassword。进入该函数观察其调用了encrypt方法可能位于某个外部JS文件。提取加密代码在Sources面板找到包含加密算法的JS文件可能是Webpack打包后的文件。将整个文件内容保存为本地.js文件。若文件过大可只复制关键函数及其依赖。搭建Node.js运行环境创建新目录执行npm init -y初始化。安装必要依赖如crypto-js、jsdom等若需模拟浏览器环境。将保存的JS文件放入目录并创建测试脚本encrypt.js。编写调用脚本// 假设加密函数为 window.encryptPassword const fs require(fs); // 加载提取的JS代码如果它依赖全局对象可能需要模拟 eval(fs.readFileSync(extracted.js, utf8)); // 调用函数 let encrypted window.encryptPassword(123456); console.log(encrypted);根据浏览器中断点处的调用方式在Node.js中调用该函数。如果遇到window、document未定义可使用jsdom模拟或修改代码剥离依赖。验证运行脚本对比浏览器中生成的加密值是否一致。若一致则扣代码成功。渗透测试应用在爆破脚本中调用此加密函数生成有效加密密码。4. 返回数据解密实战替代库模拟场景API返回的数据如result是密文需解密后查看明文内容。步骤定位解密函数在返回数据的响应断点处可在XHR断点命中后在回调函数中下断查看调用堆栈找到处理返回数据的函数。例如发现webInstace.shell函数调用了一个解密方法参数为响应数据。分析算法参数进入解密函数观察其使用的算法和密钥来源。例如CryptoJS.AES.decrypt(encryptedData, key, { mode: CryptoJS.mode.ECB })密钥key可能是一个常量或由其他函数生成如SHA1(secret)取前32位。确定算法类型识别算法AES、DES、RSA等和模式ECB、CBC等、填充方式。从代码中提取密钥生成逻辑。使用替代库实现Python示例AES-128-ECBfrom Crypto.Cipher import AES import base64, hashlib def decrypt(data_b64, key_secret): # 密钥生成SHA1(key_secret)[:32] key hashlib.sha1(key_secret.encode()).hexdigest()[:32] cipher AES.new(key.encode(), AES.MODE_ECB) encrypted base64.b64decode(data_b64) decrypted cipher.decrypt(encrypted) # 去除填充PKCS7 pad_len decrypted[-1] return decrypted[:-pad_len].decode(utf-8) decrypted decrypt(encrypted_base64_string, secret_constant) print(decrypted)在Python或Node.js中导入对应库如pycryptodomePython或crypto-jsNode.js。根据提取的密钥生成逻辑编写解密函数。验证用相同密钥和算法解密浏览器中获取的密文与页面显示明文对比一致则成功。渗透测试应用自动化获取解密后的数据用于后续攻击如提取敏感信息、越权测试。5. Sign签名机制与绕过实战Sign机制是保护API接口完整性的常见手段也是渗透测试中绕不开的“拦路虎”。5.1 Sign机制概述Sign是一种基于密钥和算法对请求参数进行哈希或加密生成的校验值通常附加在请求头或参数中用于防篡改确保请求数据在传输中未被修改。防重放结合时间戳timestamp和随机数nonce使同一请求仅一次有效。身份认证验证请求来源的合法性。常见算法MD5、SHA系列、HMAC、AES等。5.2 Sign对渗透测试的影响影响类型具体表现渗透测试应对策略正面影响1. 提高安全性减少低风险漏洞如简单重放。2. 迫使测试人员深入分析业务逻辑而非依赖自动化扫描。- 需结合逆向工程和动态调试。- 关注签名生成逻辑本身是否安全。负面影响1.增加复杂度逆向混淆代码耗时动态调试受限。2.自动化工具失效Burp、AWVS等无法直接修改带签名的请求。3.可能掩盖漏洞开发者过度依赖签名忽视输入过滤、权限控制等基础安全。- 掌握JS逆向、HOOK技术。- 编写脚本自动生成签名。- 重点测试签名校验逻辑缺陷如客户端计算签名、密钥硬编码。5.3 案例算法逆向绕过调用堆栈定位目标某API接口/api/questions/lists请求头需携带Sign参数。逆向步骤XHR断点定位在Sources面板设置XHR断点关键字/api/questions/lists触发请求后断下。调用堆栈回溯在Call Stack中找到生成Sign的调用点发现t.headers.Sign h h bs()(o c r n o)分析bs()和参数值在bs()处下断点发现其为MD5算法。各参数值o硬编码常量12b6bb84e093532fb72b4d65fec3f00bc从Cookie中提取的值dbbc7981-906b-45c5-8102-edf02376f9c4r当前URL去掉/api后的路径/questions/listsn当前时间戳(new Date).getTime()验证签名生成在控制台手动计算crypto.MD5(o c r n o).toString()与请求头中的Sign对比一致。编写Python脚本自动化用hashlib.md5复现在Burp Intruder中调用外部脚本生成签名实现爆破。绕过思路若签名仅依赖客户端可控参数如时间戳、固定密钥则可在本地完全模拟。若密钥硬编码在JS中可直接提取。6. 工具与辅助技巧工具/技术用途说明AI助手如ChatGPT辅助分析混淆代码、生成解密脚本将加密函数或算法描述提供给AI可快速生成对应语言实现。JsRPC远程调用浏览器中的加密函数在浏览器中注入RPC服务Python脚本通过WebSocket实时调用加密函数无需扣代码。Yakit热加载在Burp中动态执行JS解密编写Yakit插件将解密函数加载到Burp中自动解密请求/响应数据。AutoDecodeBurp插件自动调用JS解密配置解密函数后自动对匹配的请求/响应进行解码。浏览器本地替换修改JS代码并保存测试效果在Sources面板修改加密函数右键选择“Save for overrides”可永久替换本地代码。7. 总结Sign绕过方法论步骤关键操作技巧1. 定位签名生成点XHR断点、全局搜索关键字sign、md5、encrypt。优先使用XHR断点快速定位到请求发起位置。2. 分析签名参数查看作用域中的变量值确定哪些参数参与签名。关注时间戳、随机数、路径、Cookie、固定密钥等。3. 提取算法和密钥单步调试进入加密函数识别算法类型若密钥硬编码直接复制。若算法被混淆可借助AI还原逻辑。4. 本地复现签名用Python/Node.js实现相同算法并测试与浏览器生成的签名是否一致。若依赖浏览器环境如window对象可使用JsRPC动态调用。5. 集成到测试工具在Burp中调用外部脚本如Python脚本生成签名或使用Yakit热加载。确保每次请求都附带有效签名从而进行后续测试如注入、越权。8. 学习建议阶段核心技能目标定位熟练使用F12断点、调用堆栈、搜索快速找到加密/解密函数入口。提取扣代码技巧复制依赖、模拟环境获取完整的可执行加密逻辑。模拟算法识别、标准库使用用Python/Node.js实现相同功能便于自动化。集成JsRPC、Burp插件、Yakit将解密能力无缝融入渗透测试流程。核心思想签名机制虽增加了测试门槛但一旦破解即可完全模拟客户端行为进而深入测试服务端漏洞。始终记住签名保护的只是传输完整性而非业务安全本身。掌握这些技巧你将能突破前端加密屏障更深入地测试后端安全发现更多逻辑漏洞。