渗透测试角度优化笔记JS逆向基础、反调试与实战应用1. JS逆向与Web安全的关联JS逆向是前端分析的核心技术它并非孤立的代码审计而是与Web安全测试紧密相连。其主要应用场景包括突破前端防护分析登录加密、Sign签名、参数混淆等机制为后续的暴力破解、数据篡改、接口越权等攻击铺路。发现隐藏攻击面从JS文件中提取API接口、敏感参数、甚至硬编码的密钥或调试信息。逻辑漏洞挖掘分析前端折扣计算、验证码生成、支付逻辑等寻找可被利用的业务缺陷。2. 开发者工具F12核心面板使用指南面板名称核心功能在逆向与安全测试中的应用️元素 (Elements)查看和实时编辑页面的HTML结构与CSS样式。用于定位与数据提交相关的DOM元素如表单字段、隐藏值或观察页面元素的变化如验证码图片刷新。️控制台 (Console)执行任意JavaScript代码查看日志和错误信息。1. 测试变量/函数在断点处可直接在控制台输入变量名查看其值或调用已加载的函数。2. 定位加密入口搜索可能的关键词如encrypt、sign、md5。网络 (Network)监控所有网络请求的详情Header、参数、响应。核心入口1.抓包分析找到目标请求如登录、提交订单分析其请求参数尤其是加密参数如sign、token。2.启动器 (Initiator)查看请求由哪个JS文件的哪一行发起的快速定位加密代码的位置。源代码/来源 (Sources)核心调试面板。可查看所有加载的资源JS、CSS、设置断点、单步执行、查看调用栈和作用域。逆向主战场1.文件查找通过搜索CtrlShiftF全局搜索关键词定位加密函数所在文件。2.断点调试详见下文。3.调用栈分析理清代码执行顺序找到加密函数的调用源头。应用程序 (Application)查看和管理本地存储Cookie、LocalStorage、SessionStorage、缓存等。用于检查前端存储的敏感信息如令牌、用户信息或分析存储对应用状态的影响。3. 核心逆向技术断点调试六种姿势断点是暂停代码执行、观察运行时状态的最有效手段。以下是六种常用断点及其在逆向中的应用场景断点类型如何设置主要应用场景正常断点在Sources面板的代码行号上单击。基础调试。分析核心加密函数、参数生成逻辑的每一步执行过程。条件断点右键行号 → “添加条件断点”输入条件表达式。精准定位。只在满足特定条件如data.id 10086、i 5时暂停适用于循环或处理大量数据时。日志断点右键行号 → “添加日志断点”输入要输出的表达式。插桩分析。无需暂停代码仅在命中断点时输出日志。非常适合分析复杂的虚拟机和混淆代码可以打印出关键寄存器和变量的值。XHR断点Sources → XHR/提取断点 → “”添加URL包含的关键字。定位请求。当希望拦截所有包含特定关键字如/api/login的Ajax请求时代码会自动断在send()方法处轻松找到请求的发送源头。️事件断点Sources → 事件监听器断点 → 展开并勾选目标事件如click。分析交互。用于调试由用户操作触发的功能特别是滑块验证码、图片点击等场景可以捕捉到事件处理函数。DOM断点元素面板 → 右键目标元素 → 中断 → 子树修改/属性修改/节点移除。追踪DOM变化。当页面元素被动态修改、添加或删除时如翻页加载、弹窗出现可以断下并追溯修改DOM的JS代码。4. 调用堆栈分析理清代码执行逻辑当断点触发时调用堆栈 (Call Stack)面板会显示当前函数的调用链。在逆向中它的作用是追溯源头从当前断点位置如加密函数内部向上查看找到是谁调用了这个函数最终找到参数传入的起点。理解流程分析整个加密逻辑的执行顺序避免在嵌套的异步回调或复杂的函数调用中迷失方向。5. 反调试技术概览反调试的目的是阻止或干扰开发者工具的调试功能使逆向分析者难以动态跟踪代码执行。根据其实现方式主要分为以下几类类别代表技术检测原理绕过思路无限循环/断点无限Debugger利用debugger;语句或setInterval触发断点使调试器不断暂停。禁用所有断点、替换文件、条件断点。键盘事件监听监听F12、CtrlShiftI等监听keydown事件阻止开发者工具打开。修改事件监听、Burp替换响应、油猴脚本。环境特征检测检测窗口大小差异、console对象、devtools变量等通过比较窗口内外尺寸、console.log调用次数、Function.prototype.toString检测等判断调试器是否打开。Hook相关函数、修改返回结果、使用无头浏览器。时间差异检测测量代码执行时间调试状态下代码执行速度变慢通过时间差判断。设置条件断点跳过检测、修改时间计算逻辑。非浏览器检测检测User-Agent、navigator属性等识别自动化工具或非标准浏览器环境。伪造User-Agent、模拟浏览器环境。6. 常见反调试技术详解与绕过实战6.1 无限Debugger原理在关键代码前插入debugger;语句或通过setInterval不断触发导致调试器无限暂停。javascript(function() {function evil() {debugger;setTimeout(evil, 100);}evil();})();绕过方法*禁用所有断点在Sources面板点击“Deactivate breakpoints”按钮或按CtrlF8临时忽略所有debugger断点。*设置条件断点在debugger行上右键选择“条件断点”输入false使其永远不触发。*替换文件使用Burp Suite或油猴插件将响应中的debugger替换为空白。6.2 键盘事件监听阻止打开调试工具原理监听keydown事件当按F12或CtrlShiftI等组合键时阻止默认行为或弹窗警告。javascriptdocument.addEventListener(keydown, function(e) {if (e.key F12 || (e.ctrlKey e.shiftKey e.key I)) {e.preventDefault();return false;}});绕过方法*使用菜单打开在浏览器菜单中手动选择“开发者工具”。*Burp替换拦截响应移除事件监听代码。*油猴脚本注入脚本解除事件监听如window.removeEventListener(keydown, listener, true)。6.3 检测开发者工具状态原理利用console.log调用次数、console.profile、Function.prototype.toString等方法判断调试器是否打开。javascriptvar c 0;setInterval(function() {console.log(c);if (c 100) alert(调试中);}, 100);绕过方法*Hookconsole.log在控制台执行console.log function(){}使其失效。*修改检测逻辑通过Burp或油猴替换相关代码或使用Object.defineProperty重写属性。6.4 时间差检测原理在调试模式下代码执行速度会显著变慢。通过测量两段代码之间的时间差判断是否处于调试状态。javascriptvar start Date.now();for (var i 0; i 10000000; i) { /* 空循环 */ }var end Date.now();if (end - start 100) alert(调试中);绕过方法*跳过检测在Date.now()处设置条件断点修改返回值。*使用脚本自动化用无头浏览器如Puppeteer运行避免手动调试。6.5 非浏览器环境检测原理检测navigator.webdriver、navigator.plugins、window.chrome等属性识别自动化工具。绕过方法*使用puppeteer-extra并安装stealth插件模拟真实浏览器。*手动修改属性在控制台执行Object.defineProperty(navigator, webdriver, {get: () undefined})。7. 实战应用思路从逆向到漏洞利用将以上技巧串联起来形成从发现到利用的闭环捕获目标在网络面板找到包含可疑参数如sign、token的请求。定位代码右键请求 → “启动器” 查看调用栈或在Sources面板中全局搜索加密参数名。设置断点* 如果找到了疑似加密函数在函数入口处设置正常断点。* 如果想拦截所有API请求设置XHR断点。* 如果是验证码点击设置事件断点。触发与调试重新触发操作如点击登录代码在断点处暂停。此时* 查看作用域观察变量值找到生成sign的原始数据和算法。* 利用调用堆栈向上追溯理解数据流。* 在控制台中测试函数或修改变量值观察影响。模拟与验证* 分析清楚后可以使用Python、Node.js等语言模拟出加密算法。* 在Burp Suite中构造请求使用模拟的算法生成合法参数尝试绕过前端限制进行漏洞测试如越权、爆破、篡改价格。关键技巧先禁用所有断点快速跳过无限debugger。使用XHR断点定位请求如果加密由请求触发直接对请求URL设XHR断点定位发送位置绕过前端检测。利用条件断点精准暂停在可疑函数入口设条件断点避免频繁暂停。结合Burp替换响应将服务器返回的JS文件中的反调试代码删除然后重放请求。8. 常用工具与插件油猴插件Tampermonkey编写脚本动态修改页面代码移除反调试。Burp Suite拦截响应使用“Match and Replace”功能删除反调试代码。Chrome DevTools 内置功能*禁用断点CtrlF8*黑盒脚本在Sources面板右键JS文件选择“Blackbox Script”忽略该文件的断点。*条件断点在行号上右键设置。Puppeteer/Playwright自动化浏览器配合--auto-open-devtools-for-tabs参数调试。9. 总结JS逆向是连接前端分析与后端漏洞挖掘的桥梁。掌握开发者工具的使用特别是六种断点的灵活运用和调用堆栈的分析是解开前端黑盒的关键。从网络请求入手顺藤摸瓜找到加密逻辑再通过断点调试还原算法最终将成果应用到渗透测试中。同时反调试技术是JS逆向中的一道门槛但并非不可逾越。掌握常见的反调试原理及其绕过方法可以帮助你在渗透测试中顺利突破前端限制深入分析加密逻辑。核心目标获取签名算法、提取加密参数从而更有效地进行漏洞挖掘如越权、注入、爆破等。希望本笔记能成为你工具箱中实用的一页。
JS逆向-断点调试与反绕过技巧
发布时间:2026/7/8 14:36:38
渗透测试角度优化笔记JS逆向基础、反调试与实战应用1. JS逆向与Web安全的关联JS逆向是前端分析的核心技术它并非孤立的代码审计而是与Web安全测试紧密相连。其主要应用场景包括突破前端防护分析登录加密、Sign签名、参数混淆等机制为后续的暴力破解、数据篡改、接口越权等攻击铺路。发现隐藏攻击面从JS文件中提取API接口、敏感参数、甚至硬编码的密钥或调试信息。逻辑漏洞挖掘分析前端折扣计算、验证码生成、支付逻辑等寻找可被利用的业务缺陷。2. 开发者工具F12核心面板使用指南面板名称核心功能在逆向与安全测试中的应用️元素 (Elements)查看和实时编辑页面的HTML结构与CSS样式。用于定位与数据提交相关的DOM元素如表单字段、隐藏值或观察页面元素的变化如验证码图片刷新。️控制台 (Console)执行任意JavaScript代码查看日志和错误信息。1. 测试变量/函数在断点处可直接在控制台输入变量名查看其值或调用已加载的函数。2. 定位加密入口搜索可能的关键词如encrypt、sign、md5。网络 (Network)监控所有网络请求的详情Header、参数、响应。核心入口1.抓包分析找到目标请求如登录、提交订单分析其请求参数尤其是加密参数如sign、token。2.启动器 (Initiator)查看请求由哪个JS文件的哪一行发起的快速定位加密代码的位置。源代码/来源 (Sources)核心调试面板。可查看所有加载的资源JS、CSS、设置断点、单步执行、查看调用栈和作用域。逆向主战场1.文件查找通过搜索CtrlShiftF全局搜索关键词定位加密函数所在文件。2.断点调试详见下文。3.调用栈分析理清代码执行顺序找到加密函数的调用源头。应用程序 (Application)查看和管理本地存储Cookie、LocalStorage、SessionStorage、缓存等。用于检查前端存储的敏感信息如令牌、用户信息或分析存储对应用状态的影响。3. 核心逆向技术断点调试六种姿势断点是暂停代码执行、观察运行时状态的最有效手段。以下是六种常用断点及其在逆向中的应用场景断点类型如何设置主要应用场景正常断点在Sources面板的代码行号上单击。基础调试。分析核心加密函数、参数生成逻辑的每一步执行过程。条件断点右键行号 → “添加条件断点”输入条件表达式。精准定位。只在满足特定条件如data.id 10086、i 5时暂停适用于循环或处理大量数据时。日志断点右键行号 → “添加日志断点”输入要输出的表达式。插桩分析。无需暂停代码仅在命中断点时输出日志。非常适合分析复杂的虚拟机和混淆代码可以打印出关键寄存器和变量的值。XHR断点Sources → XHR/提取断点 → “”添加URL包含的关键字。定位请求。当希望拦截所有包含特定关键字如/api/login的Ajax请求时代码会自动断在send()方法处轻松找到请求的发送源头。️事件断点Sources → 事件监听器断点 → 展开并勾选目标事件如click。分析交互。用于调试由用户操作触发的功能特别是滑块验证码、图片点击等场景可以捕捉到事件处理函数。DOM断点元素面板 → 右键目标元素 → 中断 → 子树修改/属性修改/节点移除。追踪DOM变化。当页面元素被动态修改、添加或删除时如翻页加载、弹窗出现可以断下并追溯修改DOM的JS代码。4. 调用堆栈分析理清代码执行逻辑当断点触发时调用堆栈 (Call Stack)面板会显示当前函数的调用链。在逆向中它的作用是追溯源头从当前断点位置如加密函数内部向上查看找到是谁调用了这个函数最终找到参数传入的起点。理解流程分析整个加密逻辑的执行顺序避免在嵌套的异步回调或复杂的函数调用中迷失方向。5. 反调试技术概览反调试的目的是阻止或干扰开发者工具的调试功能使逆向分析者难以动态跟踪代码执行。根据其实现方式主要分为以下几类类别代表技术检测原理绕过思路无限循环/断点无限Debugger利用debugger;语句或setInterval触发断点使调试器不断暂停。禁用所有断点、替换文件、条件断点。键盘事件监听监听F12、CtrlShiftI等监听keydown事件阻止开发者工具打开。修改事件监听、Burp替换响应、油猴脚本。环境特征检测检测窗口大小差异、console对象、devtools变量等通过比较窗口内外尺寸、console.log调用次数、Function.prototype.toString检测等判断调试器是否打开。Hook相关函数、修改返回结果、使用无头浏览器。时间差异检测测量代码执行时间调试状态下代码执行速度变慢通过时间差判断。设置条件断点跳过检测、修改时间计算逻辑。非浏览器检测检测User-Agent、navigator属性等识别自动化工具或非标准浏览器环境。伪造User-Agent、模拟浏览器环境。6. 常见反调试技术详解与绕过实战6.1 无限Debugger原理在关键代码前插入debugger;语句或通过setInterval不断触发导致调试器无限暂停。javascript(function() {function evil() {debugger;setTimeout(evil, 100);}evil();})();绕过方法*禁用所有断点在Sources面板点击“Deactivate breakpoints”按钮或按CtrlF8临时忽略所有debugger断点。*设置条件断点在debugger行上右键选择“条件断点”输入false使其永远不触发。*替换文件使用Burp Suite或油猴插件将响应中的debugger替换为空白。6.2 键盘事件监听阻止打开调试工具原理监听keydown事件当按F12或CtrlShiftI等组合键时阻止默认行为或弹窗警告。javascriptdocument.addEventListener(keydown, function(e) {if (e.key F12 || (e.ctrlKey e.shiftKey e.key I)) {e.preventDefault();return false;}});绕过方法*使用菜单打开在浏览器菜单中手动选择“开发者工具”。*Burp替换拦截响应移除事件监听代码。*油猴脚本注入脚本解除事件监听如window.removeEventListener(keydown, listener, true)。6.3 检测开发者工具状态原理利用console.log调用次数、console.profile、Function.prototype.toString等方法判断调试器是否打开。javascriptvar c 0;setInterval(function() {console.log(c);if (c 100) alert(调试中);}, 100);绕过方法*Hookconsole.log在控制台执行console.log function(){}使其失效。*修改检测逻辑通过Burp或油猴替换相关代码或使用Object.defineProperty重写属性。6.4 时间差检测原理在调试模式下代码执行速度会显著变慢。通过测量两段代码之间的时间差判断是否处于调试状态。javascriptvar start Date.now();for (var i 0; i 10000000; i) { /* 空循环 */ }var end Date.now();if (end - start 100) alert(调试中);绕过方法*跳过检测在Date.now()处设置条件断点修改返回值。*使用脚本自动化用无头浏览器如Puppeteer运行避免手动调试。6.5 非浏览器环境检测原理检测navigator.webdriver、navigator.plugins、window.chrome等属性识别自动化工具。绕过方法*使用puppeteer-extra并安装stealth插件模拟真实浏览器。*手动修改属性在控制台执行Object.defineProperty(navigator, webdriver, {get: () undefined})。7. 实战应用思路从逆向到漏洞利用将以上技巧串联起来形成从发现到利用的闭环捕获目标在网络面板找到包含可疑参数如sign、token的请求。定位代码右键请求 → “启动器” 查看调用栈或在Sources面板中全局搜索加密参数名。设置断点* 如果找到了疑似加密函数在函数入口处设置正常断点。* 如果想拦截所有API请求设置XHR断点。* 如果是验证码点击设置事件断点。触发与调试重新触发操作如点击登录代码在断点处暂停。此时* 查看作用域观察变量值找到生成sign的原始数据和算法。* 利用调用堆栈向上追溯理解数据流。* 在控制台中测试函数或修改变量值观察影响。模拟与验证* 分析清楚后可以使用Python、Node.js等语言模拟出加密算法。* 在Burp Suite中构造请求使用模拟的算法生成合法参数尝试绕过前端限制进行漏洞测试如越权、爆破、篡改价格。关键技巧先禁用所有断点快速跳过无限debugger。使用XHR断点定位请求如果加密由请求触发直接对请求URL设XHR断点定位发送位置绕过前端检测。利用条件断点精准暂停在可疑函数入口设条件断点避免频繁暂停。结合Burp替换响应将服务器返回的JS文件中的反调试代码删除然后重放请求。8. 常用工具与插件油猴插件Tampermonkey编写脚本动态修改页面代码移除反调试。Burp Suite拦截响应使用“Match and Replace”功能删除反调试代码。Chrome DevTools 内置功能*禁用断点CtrlF8*黑盒脚本在Sources面板右键JS文件选择“Blackbox Script”忽略该文件的断点。*条件断点在行号上右键设置。Puppeteer/Playwright自动化浏览器配合--auto-open-devtools-for-tabs参数调试。9. 总结JS逆向是连接前端分析与后端漏洞挖掘的桥梁。掌握开发者工具的使用特别是六种断点的灵活运用和调用堆栈的分析是解开前端黑盒的关键。从网络请求入手顺藤摸瓜找到加密逻辑再通过断点调试还原算法最终将成果应用到渗透测试中。同时反调试技术是JS逆向中的一道门槛但并非不可逾越。掌握常见的反调试原理及其绕过方法可以帮助你在渗透测试中顺利突破前端限制深入分析加密逻辑。核心目标获取签名算法、提取加密参数从而更有效地进行漏洞挖掘如越权、注入、爆破等。希望本笔记能成为你工具箱中实用的一页。