
JS 逆向入门读懂前端加密参数突破接口签名校验前言在现在的 Web、H5、小程序、APP 网页端业务中越来越多网站会对接口请求参数做前端加密。常见的有sign、token、timestamp、nonce这类签名参数。很多同学使用 Burp 抓包后发现请求体里面多了一串 sign 值每次刷新页面、每次发包 sign 都会变化直接复制旧包重放就会返回签名错误。不少新人遇到接口签名第一反应这是后端加密无法测试。其实绝大多数网站的 sign 都是前端 JS 生成。JS 逆向就是找到生成加密参数的 JS 代码读懂加密逻辑甚至复写加密算法方便我们做接口测试、漏洞挖掘。免责声明本文仅用于授权环境安全测试、前端安全学习。禁止对未授权网站、小程序进行逆向、爬虫、接口批量测试等操作违规操作将触犯相关法律法规请务必遵守。0x01 什么是前端接口签名 sign接口签名sign本质是一种简易防篡改、防重放机制。后端约定一套加密规则前端把请求参数、时间戳、随机字符串拼接经过 MD5、SHA 等哈希运算生成 sign随请求一起传给后端。后端拿到参数后用完全相同的算法重新计算一次 sign对比前后 sign 是否一致。简单流程前端收集业务参数 timestamp 时间戳 nonce 随机串 密钥 secret按照约定顺序拼接字符串MD5/SHA256 哈希得到 sign将 sign 放到请求头或者请求体一起提交给后端后端使用相同算法重新计算 sign校验是否匹配作用防止抓包后直接篡改参数修改参数sign 会变化校验失败简单防重放依靠 timestamp 时间戳超过有效期请求直接拒绝⚠️ 重点前端 JS 里写死的加密密钥 secret本质是不安全的。前端代码完全暴露任何人都可以逆向拿到密钥和算法。前端签名只能防普通爬虫无法阻止有逆向能力的安全测试人员。0x02 快速定位加密 JS 代码最核心入门技巧抓包看到请求携带 sign第一步就是定位生成 sign 的 JS有 4 种常用方法。方法 1全局搜索关键词新手首选打开浏览器 F12 开发者工具 → Source 源代码面板全局搜索关键词sign、generateSign、getSign、createSign、signature、md5快捷键CtrlShiftF 全局检索所有 JS 文件搜索到对应代码行看 sign 的赋值位置这里就是加密函数调用处。方法 2XHR 断点拦截接口请求Network 面板找到目标接口右键 →Add XHR/fetch breakpoint。当网页发起这个接口请求时JS 执行会断住代码停在发起请求的位置。单步调试往回追溯就能找到 sign 生成的地方。调试快捷键F10单步跳过Step Over不进入函数内部F11单步进入Step Into进入函数内部ShiftF11跳出当前函数F8继续执行直到下一个断点实战技巧断住请求之后看请求体对象找到 sign 属性顺着变量回溯找到这个变量在哪里被赋值。方法 3调用栈 Call Stack 回溯断点断住之后右侧 Call Stack调用栈会显示函数执行顺序。从栈底到栈顶可以看到代码一层一层调用关系快速找到加密函数源头。方法 4Hook 拦截监控 sign 变量赋值可以在 Console 控制台写入简单的 Hook 代码监控 sign 变量一旦被赋值自动触发断点。// Hook sign赋值一旦sign被修改自动断下 Object.defineProperty(window, sign, { set: function(val) { debugger; console.log(sign值被赋值,val); } })执行脚本之后页面生成 sign 的时候会自动触发 debugger 断点直接定位加密位置。0x03 看懂基础签名算法常见模板绝大多数中小型网站的 sign 逻辑都非常固定我们看几个真实场景案例。案例 1参数排序拼接 MD5最经典伪代码逻辑// 原始业务参数 let params { id: 1001, name: test, timestamp: 1756543211 } // 1. 将key按照字母升序排序 // 2. keyvalue拼接用连接 // 3. 末尾拼接密钥secret // 4. 整体MD5转大写/小写得到sign function getSign(params, secret){ const keys Object.keys(params).sort(); let str ; for(let k of keys){ str ${k}${params[k]} } str str secret; return md5(str) }重点坑点参数是否排序很多站点不排序顺序错一点 MD5 结果完全不同拼接符是还是|secret 密钥放在前面还是末尾MD5 结果大写还是小写大小写不一致会直接校验失败。案例 2时间戳 随机 nonce增加 timestamp毫秒时间戳和 nonce 随机字符串用来防重放。let timestamp new Date().getTime(); let nonce Math.random().toString(36).slice(2); params.timestamp timestamp; params.nonce nonce;后端校验 timestamp如果和服务器时间相差超过 300 秒直接拒绝请求。案例 3AES 加密参数不是哈希是对称加密部分网站不使用 MD5而是把整个请求 JSON 字符串 AES 加密传输密文。这种场景逆向目标就是找到 AES 的 key 和 iv 向量。区分MD5/SHA 是哈希摘要不可逆AES 是对称加密可以解密原文。0x04 调试实战一步步复现 sign拿到加密函数之后分 3 步复现算法。本地调试验证函数输出在浏览器 Console 直接复制加密函数手动传入参数看计算出的 sign 和真实抓包的 sign 是否一致。如果不一致逐行对比排查拼接顺序、编码问题。剥离环境依赖提取纯算法网页 JS 会依赖浏览器环境包含 window、document 等对象。我们需要剥离无关代码只保留加密逻辑、md5 库。可以把 md5 函数、getSign 函数单独提取出来放到 NodeJS 环境运行。示例 NodeJS 简易 democonst crypto require(crypto); function md5(str){ return crypto.createHash(md5).update(str).digest(hex) } function getSign(params, secret){ const keys Object.keys(params).sort(); let str ; for(let k of keys){ str ${k}${params[k]} } str secret; return md5(str) } // 测试参数 let data {id:1001,name:test} let secret abc123456 console.log(getSign(data,secret))运行代码比对和网页生成的 sign 是否相同相同代表算法提取成功。集成到 Burp自动化生成 sign拿到独立算法之后有两种方式在 Burp 中自动计算 sign使用 Burp 的 Custom Scripts / Jython 脚本写简易本地 APIBurp 请求前调用本地接口自动生成 sign这样重放 Repeater 发包时自动计算最新 sign不再出现签名失效。0x05 JS 逆向常见阻碍与绕过思路阻碍 1JS 代码混淆变量名 a1,b2,c3代码压缩一行网页 JS 经常压缩混淆所有变量名无意义代码挤成一整行。解决方法Source 面板里面点击{}格式化美化代码格式化之后再断点调试。如果是严重混淆控制流混淆、字符串加密入门阶段可以优先换思路先找未混淆的备用接口。阻碍 2debugger 反调试打开 F12 自动断住打开开发者工具就触发 debugger无限断点干扰调试。解决方案右键 debugger 行Add conditional breakpoint填入false让断点永远不触发使用浏览器禁用 debugger 插件在 Console 重写 debugger 函数debuggerfunction(){};阻碍 3加密函数在 eval、atob 里面动态执行代码使用 atob base64 解码字符串再 eval 执行。可以在 eval 位置下断点解码完成之后打印出真实 JS 代码。阻碍 4多段 JS加密逻辑拆分在多个文件sign 生成分布在多个 JS 文件函数互相调用。优先使用 XHR 断点 调用栈顺着执行流一次性定位完整链路。0x06 安全测试中的使用边界 漏洞挖掘场景学会前端 sign 逆向不是用来写爬虫批量爬数据而是用于安全测试接口参数篡改测试原本前端加了签名保护无法直接修改 price、userid 参数。逆向拿到算法后可以构造合法 sign提交篡改后的参数验证后端是否存在越权、金额篡改等逻辑漏洞。重点前端签名校验只能防篡改后端没有做业务校验的话依然存在高危逻辑漏洞。重放测试每次发包 sign 都会变化普通重放失效。逆向算法自动生成新 sign开展重复提交、业务状态机漏洞测试。测试签名机制本身缺陷常见签名设计缺陷secret 硬编码写在前端 JS密钥泄露只校验 sign没有校验 timestamp可永久重放签名只对部分参数做计算修改未参与签名的参数后端不检测签名算法简单容易被复现。签名只是防护手段不能替代后端权限校验、参数校验。很多开发误以为加了 sign 接口就安全这是严重误区。0x07 高频踩坑总结❌坑 1找到 md5 函数直接复制但是 sign 结果不一致大概率参数没有排序、拼接符号错误、密钥位置不对、中文未做 url 编码。❌坑 2混淆 JS 直接放弃新手不用一上来硬啃重度混淆。优先 XHR 断点抓调用栈格式化代码很多混淆只是简单变量名替换。❌坑 3以为 sign 是后端生成花费大量时间尝试爆破 signsign 随前端参数实时变化爆破几乎不可能核心是逆向算法。❌坑 4逆向成功之后直接在生产环境大规模请求未经授权批量请求属于违规行为逆向技术仅限授权测试环境使用。❌坑 5混淆前端签名和后端业务校验就算 sign 校验通过后端依然需要校验用户权限、参数合法性签名不等于安全。0x08 学习路线新手入门建议先掌握 JS 基础变量、对象、循环、函数、对象排序不用精通前端开发看得懂代码即可。熟悉浏览器调试断点、单步、调用栈、格式化 JS反复练习。从简单无混淆的 sign 站点入手练习定位 sign 函数、提取算法本地 Node 复现。再逐步接触简单混淆、AES 加密场景。实战练习在本地靶场搭建带 sign 签名的 Web 项目练习不要直接上手线上站点。0x09 企业防御方案甲方视角不要依赖前端签名作为安全屏障。前端所有代码、密钥都可以被逆向前端签名只能降低爬虫成本不能抵御攻击者。密钥不要硬编码在前端 JS、小程序代码中高敏感接口尽量把加密校验放在后端。时间戳有效期严格限制增加 nonce 一次性随机串做好防重放。核心业务接口增加二次身份校验IP 风控、行为风控。敏感交易类接口除了签名后端必须独立校验业务参数、资源归属。可以增加 JS 混淆、反调试增加逆向成本但不能作为唯一防护手段。总结JS 逆向入门核心不是破解复杂加密算法而是学会浏览器断点调试、追踪变量、定位加密函数剥离并复现签名逻辑。前端接口签名本质是 “前端的一层简单防护”一旦逆向拿到加密算法这层防护就被绕过。在漏洞挖掘中很多接口因为加了 sign让测试人员无法直接 Burp 重放而学会 JS 逆向就可以突破这层限制继续测试接口底层业务逻辑挖掘隐藏的逻辑漏洞。一句话记住前端任何加密、签名算法都能被逆向前端签名只能防小白不能防安全测试后端业务校验才是安全的根基。最后关于网络安全技术储备学好网络安全不论是就业还是做副业赚钱都不错但要学会网络安全还是要有一个学习规划。最后大家分享一份全套的网络安全学习资料给那些想学习网络安全的小伙伴们一点帮助对于0基础小白入门如果你是零基础小白想快速入门网络安全是可以考虑的。一方面是学习时间相对较短学习内容更全面更集中。二方面是可以找到适合自己的学习方案包括网安成长学习路线图、SRC黑客文档、护网行动、黑客必读书单、面试题、学习视频等教程。带你从零基础系统性的学好网络安全需要的可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】1.成长路线图学习规划要学习一门新的技术作为新手一定要先学习成长路线图方向不对努力白费。对于从来没有接触过网络安全的同学我们帮你准备了详细的学习成长路线图学习规划。可以说是最科学最系统的学习路线大家跟着这个大的方向学习准没问题。2.网安入门到进阶视频教程很多朋友都不喜欢晦涩的文字我也为大家准备了视频教程其中一共有21个章节每个章节都是当前板块的精华浓缩。全套教程文末领取哈3.SRC黑客文档大家最喜欢也是最关心的SRC技术文籍黑客技术也有收录SRC技术文籍黑客资料由于是敏感资源这里不能直接展示哦全套教程文末领取哈4.护网行动资料其中关于HW护网行动也准备了对应的资料这些内容可相当于比赛的金手指5.黑客必读书单随着互联网技术的飞速发展网络安全已经成为了当今科技领域的一大热点。这些SQL注入、CCNA、Web渗透、Linux服务器等以其强大的语言理解和防御能力正在守护着我们网络世界。 那以下这些PDF籍就是非常不错的学习资源。6.网络安全岗面试题合集当你自学到这里你就要开始思考找工作的事情了而工作绕不开的就是真题和面试题。这份完整版的网络安全学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】