JS逆向学习之JS语法(一)

张开发
2026/4/16 11:52:28 15 分钟阅读

分享文章

JS逆向学习之JS语法(一)
JS逆向学习之JS语法一目录1.前言为什么在渗透测试/安全领域要熟悉 JS 逆向▪ 典型场景与案例分析2. JavaScript 基础语法概览2.1变量2.1.1 变量声明方式2.1.2 常用数据类型2.2运算符2.3函数2.3.1 函数声明 表达式2.3.2 箭头函数2.3.3 作用域与闭包2.4流程控制3.逆向相关核心语法点1.常见对象与原型链2. 字符串相关3. 动态代码执行4. 常用加密与数据序列化API5. 异步与网络相关6. 事件与 DOM 相关7. 调试相关要点1.前言为什么在渗透测试/安全领域要熟悉 JS 逆向在黑盒渗透测试实践中我们频繁遭遇各类请求加解密场景。这是由于为满足等保合规要求大量行业系统如金融、政务领域开始对 HTTP 请求体进行加密处理并引入动态签名、时间戳校验、随机 RequestId等防御机制。这些技术手段直接导致传统渗透方式如暴力破解、数据包重放/篡改失效——攻击者无法直接解析请求结构更难以构造有效攻击载荷。典型困境示例无法爆破登录接口密码字段被前端 RSA/AES 加密原始字典直接发包将被服务端拒绝难以批量测试越权请求需携带动态生成的 HMAC 签名但签名逻辑完全封装在前端 JS 中无法绕过风控拦截请求头需附加由 JS 生成的设备指纹/行为轨迹加密参数此时JS逆向分析便成为突破此类防御体系的核心技术手段——通过逆向加密算法、解析签名规则、提取关键参数生成逻辑攻击者可精准复现合法请求构造流程进而穿透前端防护实现深度渗透。▪ 典型场景与案例分析这里我介绍一个靶场https://github.com/0ctDay/encrypt-decrypt-vuls/这是一个本地JS逆向靶场当我们需要练习JS逆向时可以在这上面进行练习。这里我推荐使用fofa在网上搜索一个bodyencrypt-labs countryCN随便打开一个就可以了之所以这里我推荐使用fofa寻找靶场是因为JS靶场不用拿到flag不用担心目录乱改和后端魔改只需要在前端成功逆向出来即可这时完全可以使用网上的靶场。因为不知道网上的靶场过段时间还能不能连接所以就不放链接了这时可能有人会有疑问这不就是一个普通的登录页面吗为什么会用上js呢别急我们抓包来看看。首先请求体这里可以看到一大串加密数值这种情况根本无法从burp进行爆破这时就需要还原其加密及预处理机制了。你以外就仅仅只有这点吗再来看看这个这是0佬写的靶场vue/_demo点进去是这样抓个包来看看你可能会说这不是和上一个一样吗不不不我们可以放到repeater里重放试试这里可以看到相同的数据造成了不同的回显结果这是因为其携带动态生成的requestID在这个数据包中同时拥有签名认证sign和requestID当requestID中的值重复或者不满足格式时便会被waf拦截。所以js逆向好啊得学啊。2. JavaScript 基础语法概览2.1变量每一种语言都是从变量开始学的js也不例外因为主要学习的是js逆向所以这里仅对js语法进行简单说明。2.1.1 变量声明方式var函数作用域可被重复声明变量提升重点了解“提权”问题let块级作用域不可重复声明不变量提升const块级作用域声明后不可重新赋值常用于常量。练习js的工具我们需要用到vscode和node.js相信大家都已经安装过了吧如果没有可以看这个帖子。//这里附之前js环境搭建帖子链接//2.1.2 常用数据类型原始类型String,Number,Boolean,null,undefined,Symbol,BigInt引用类型Object,Array,Function,Date等示例用typeof测试各类型变量typeof检测变量类型console.log( typeof abc, typeof 5, typeof true, typeof {}, typeof [], typeof function(){});2.2运算符到了运算符环节了其实js和大多数语言一样运算符也是来来回回那么几样这里也不再多说了。2.3函数学习js逆向就是和各种函数打交道所以函数也是必须要了解的。2.3.1 函数声明 表达式函数的声明有两种方式表达式和函数声明。声明function foo(){}表达式const foo function(){}区别函数声明会被提升到当前作用域顶部因此可以在声明前调用函数表达式中的命名只在函数内部可用外部无法访问函数声明必须有函数名称而表达式可以匿名sayHello(); // 函数调用,声明函数可在声明前调用 function sayHello() { console.log(Hello!); } // 2. 函数表达式 - 不会提升 try { sayGoodbye(); // 先尝试调用报错: sayGoodbye is not a function } catch (e) { console.log(错误:, e.message); } const sayGoodbye function() { console.log(Goodbye!); }; sayGoodbye();//这里正常调用 // 3. 匿名函数表达式 const multiply function(a, b) {//这里没有函数名称 return a * b; }; console.log(乘法结果:, multiply(3, 4)); // 4. 命名函数表达式有名称标识符 const calculate function factorial(n) {//函数名称是factorial return n 1 ? 1 : n * factorial(n - 1); }; console.log(阶乘结果:, calculate(5)); // 尝试访问函数表达式内部名称外部不可访问 try { console.log(factorial(5)); //尝试直接使用函数名称调用函数报错: factorial is not defined } catch (e) { console.log(错误:, e.message); }2.3.2 箭头函数相比普通函数语法更简洁只能作为表达式常规用法不能用作构造函数不支持 new。箭头函数不会创建自己的this其this绑定在定义时所在的外层作用域。示例使用this访问箭头函数和普通函数的对象const obj { name: Object, normal: function() { console.log(this.name); }, arrow: () { console.log(this.name); } }; obj.normal(); // 输出: Object (this 指向 obj) obj.arrow(); // 输出: undefined (因为 window.name 未定义this 指向全局 window 对象)2.3.3 作用域与闭包作用域变量的有效范围包括全局/函数/块级作用域。闭包闭包指“函数可以记住并访问其定义时的作用域”即使在其外部执行。其常见于函数内部返回一个内部函数内部函数能访问外部函数的变量常用于隐藏变量/敏感数据对逆向极为重要。示例实现一个基本闭包计数器function makeCounter(){ let count 0; return function(){ return count; } } let counter makeCounter(); console.log(counter()); //1 console.log(counter()); //22.4流程控制到了典型的流程控制了条件语句if、switch循环语句for、while、do...while跳转语句break、continue、return等等这些想必在其它语言时已经学习过了因语法格式相同就不在过多讲述了。3.逆向相关核心语法点想必到了这里你已经可以看懂大部分的js代码了进入这一步已经可以开始最初的加密函数定位操作了在渗透测试中我们所需要的js知识到这一步已经差不多了剩下的可以在实战中进行提升。当然如果你的最终目的不是渗透测试或者非常高级的渗透测试想要达到通过反混淆–分析代码逻辑–研究参数作用–添加补环境–最终通过本地运行JS来加解密那可能你还需要很多逆向相关的知识点这里我举一些例子这里你还需要学习1.常见对象与原型链对象的创建字面量、new Object()、构造函数属性访问与操作点/中括号访问增删改查属性delete 用法对象枚举遍历for…in、Object.keys()、Object.values()、Object.entries()原型链与继承proto、prototype、构造函数继承、Object.create方法与 this对象方法定义this 的多种指向情况、箭头函数不绑定 thishasOwnProperty属性归属判断混淆常避开此方法对象 API 常用Object.assign()、Object.defineProperty、JSON.stringify/parsegetter/setter调试时常见属性访问拦截对象解构、剩余参数混淆时常用于分散变量属性特性可枚举性、可写性、可配置性Object.getOwnPropertyDescriptor类型判断typeof/instanceof、Array.isArray()2. 字符串相关常用方法split、substring、substr、slice、replace、charCodeAt、fromCharCode编码/解码decodeURIComponent、encodeURIComponent、unescape、escape拼接与拆解字符串拼接混淆、模板字符串、Unicode/十六进制转义3. 动态代码执行eval / new Function动态执行字符串中的代码常被用做混淆和运行时还原setTimeout/setInterval传递匿名函数或字符串另类动态执行途径4. 常用加密与数据序列化APIBase64atob/Btoa手写和常见第三方库CryptoJS等调用如何识别并断点调试加密运算过程常见加密算法识别md5, sha1, aes等在源码中的实现模式JSONJSON.stringify/parse体会序列化/反序列化过程5. 异步与网络相关异步实现方式回调、Promise、async/await定时器setTimeout/setInterval影响代码流程XHR/Fetch识别和定位加密请求参数的生成与发送位置6. 事件与 DOM 相关事件绑定addEventListener/onclick常作为逆向入口埋点常见 API 监听点window.onload、表单提交、按钮点击等DOM 读取/设置getElementById、querySelector、innerText/innerHTML 等与反爬有关的字段捕获7. 调试相关要点断点下标查找所有动态加解密出现地代码插桩console/alert/log注入随时打点观察关键变量变化异常处理try…catch拦截隐藏流程《网络安全从零到精通全套学习大礼包》96节从入门到精通的全套视频教程免费领取如果你也想通过学网络安全技术去帮助就业和转行我可以把我自己亲自录制的96节 从零基础到精通的视频教程以及配套学习资料无偿分享给你。网络安全学习路线图想要学习 网络安全作为新手一定要先按照路线图学习方向不对努力白费。对于从来没有接触过网络安全的同学我帮大家准备了从零基础到精通学习成长路线图以及学习规划。可以说是最科学最系统的学习路线大家跟着这个路线图学习准没错。配套实战项目/源码所有视频教程所涉及的实战项目和项目源码学习电子书籍学习网络安全必看的书籍和文章的PDF市面上网络安全书籍确实太多了这些是我精选出来的面试真题/经验以上资料如何领取fb5d4309b20.jpeg#pic_center)面试真题/经验以上资料如何领取

更多文章