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
快捷键:Ctrl+Shift+F 全局检索所有 JS 文件
搜索到对应代码行,看 sign 的赋值位置,这里就是加密函数调用处。
方法 2:XHR 断点,拦截接口请求
Network 面板找到目标接口,右键 →Add XHR/fetch breakpoint。
当网页发起这个接口请求时,JS 执行会断住,代码停在发起请求的位置。
单步调试,往回追溯,就能找到 sign 生成的地方。
调试快捷键:
- F10:单步跳过(Step Over),不进入函数内部
- F11:单步进入(Step Into),进入函数内部
- Shift+F11:跳出当前函数
- F8:继续执行,直到下一个断点
实战技巧:断住请求之后,看请求体对象,找到 sign 属性,顺着变量回溯,找到这个变量在哪里被赋值。
方法 3:调用栈 Call Stack 回溯
断点断住之后,右侧 Call Stack(调用栈)会显示函数执行顺序。
从栈底到栈顶,可以看到代码一层一层调用关系,快速找到加密函数源头。
方法 4:Hook 拦截,监控 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. key=value拼接,用&连接 // 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 秒,直接拒绝请求。
案例 3:AES 加密参数(不是哈希,是对称加密)
部分网站不使用 MD5,而是把整个请求 JSON 字符串 AES 加密,传输密文。
这种场景,逆向目标就是找到 AES 的 key 和 iv 向量。
区分:MD5/SHA 是哈希摘要,不可逆;AES 是对称加密,可以解密原文。
0x04 调试实战,一步步复现 sign
拿到加密函数之后,分 3 步复现算法。
- 本地调试,验证函数输出
在浏览器 Console 直接复制加密函数,手动传入参数,看计算出的 sign 和真实抓包的 sign 是否一致。如果不一致,逐行对比,排查拼接顺序、编码问题。 - 剥离环境依赖,提取纯算法
网页 JS 会依赖浏览器环境,包含 window、document 等对象。我们需要剥离无关代码,只保留加密逻辑、md5 库。
可以把 md5 函数、getSign 函数单独提取出来,放到 NodeJS 环境运行。
示例 NodeJS 简易 demo:
const 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 脚本;
- 写简易本地 API,Burp 请求前调用本地接口,自动生成 sign;
这样重放 Repeater 发包时,自动计算最新 sign,不再出现签名失效。
0x05 JS 逆向常见阻碍与绕过思路
阻碍 1:JS 代码混淆(变量名 a1,b2,c3,代码压缩一行)
网页 JS 经常压缩混淆,所有变量名无意义,代码挤成一整行。
解决方法:Source 面板里面点击{}格式化美化代码,格式化之后再断点调试。
如果是严重混淆(控制流混淆、字符串加密),入门阶段可以优先换思路,先找未混淆的备用接口。
阻碍 2:debugger 反调试,打开 F12 自动断住
打开开发者工具就触发 debugger,无限断点干扰调试。
解决方案:
- 右键 debugger 行,Add conditional breakpoint,填入
false,让断点永远不触发; - 使用浏览器禁用 debugger 插件;
- 在 Console 重写 debugger 函数:
debugger=function(){};
阻碍 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 是后端生成,花费大量时间尝试爆破 sign
sign 随前端参数实时变化,爆破几乎不可能,核心是逆向算法。
❌坑 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%免费】