web逆向-webpack代码自吐

0 声明

本文仅用于技术交流

1 分析

网站:aHR0cHM6Ly9zcGEyLnNjcmFwZS5jZW50ZXIv
一个webpack练手网站
分析一下接口
一个简单的get请求,请求url中添加了一个加密参数token
在这里插入图片描述
定位加密位置的方式比较多,这里还是使用习惯用的请求拦截器,在代码中搜索interceptors.requets.use,找到了之后打断点定位
在这里插入图片描述
重新加载页面,通过堆栈去找token加密位置,发现params中的token值是e,在这里打断点
在这里插入图片描述
翻页,使断点定住,分析代码,方法i.a传入了两个参数,第一个参数是this.$store.state.url.index,发现其值固定为/api/movie,第二个参数e,是通过(page - 1) * 10计算得来,即第一页值为0,第二页值为10,依次类推,再看最重要的方法i.a,发现i并没有在在此方法内部,往上找,发现i = e("7d92"),看起来比较像webpack,还是打个断点跟一下
在这里插入图片描述
翻页的话在i处是断不住的,更加验证了是webpack,需要重新加载页面
断住了之后进入e方法内部
可以看到是一个标准的webpack的构造器,代码如下

function c(t) {
    if (r[t])
        return r[t].exports;
    var n = r[t] = {
        i: t,
        l: !1,
        exports: {}
    };
    return e[t].call(n.exports, n, n.exports, c),
    n.l = !0,
    n.exports
}

在控制台输出发现共加载了253个函数
在这里插入图片描述
按照往常的方式我们可能会把这个文件完整的复制过来,直接运行,但是会发现调用到的函数不全,是因为这个网站把一部分函数通过webpackJsonp放到了别的文件里
在这里插入图片描述
这就需要另辟蹊径,我们先把整体代码拿到本地,进行两处的修改

  1. 给代码头部添加!防止报错
    在这里插入图片描述

  2. 删除所有调用的函数
    在这里插入图片描述
    那么现在就开始补调用的函数
    我们在webpack构造器处发现r原本应该是传入的那些函数(也可叫模块),现在给置为空对象,再定义一个空对象
    在这里插入图片描述
    然后在构造器的if判断出打上条件断点wp[t] = e[t], false,之后放行在控制台输出看下总共调用了多少函数,调用多少就补多少
    在这里插入图片描述
    发现调用了47个,但是实际应该是48个,因为在我们使用条件断点的时候已经加载了7d92,但是48个函数补起来也比较麻烦,可以直接使用命令Object.entries(wp).map(([key, value]) => “${key}”: ${value}).join(", ")进行代码自吐,wp是一个object对象,使用Object.entries使其变成一个数组,在使用数组的map方法对数组内的每个元素进行解构赋值操作并返回一个新的数组,再通过join方法进行字符串拼接
    在这里插入图片描述
    直接右击复制字符串内容,插入到我们的代码中即可,别忘记补“7d92”放到最上面
    编辑器里格式化下可以看到比较清楚
    在这里插入图片描述
    之后还是做以下操作:

  • 定义window = global;
  • 在构造器下进行导出 window.duan = c;
  • 外部调用window.duan

测试下看到可以得到正确的结果
在这里插入图片描述
代码太长了,就不往文章里贴了

<think>我们正在处理一个Web渗透测试场景,目标是提取Webpack打包的代码并还原其中的加解密算法。以下步骤将结合引用内容中提到的工具和技术(如AST反混淆、Webpack解包等)进行。 ### 1. **获取Webpack打包代码** - **浏览器开发者工具**: 在渗透测试中,首先通过浏览器(如Chrome)的开发者工具(`Sources`面板)获取Webpack打包后的JavaScript文件。通常,这些文件被压缩成一行,需要格式化。 - 右键点击代码 → 选择"Format"(或{}图标)进行美化。 - **网络抓取**: 使用Burp Suite或浏览器Network面板捕获页面加载时请求的JS文件,保存到本地分析。 ### 2. **解包Webpack模块** Webpack将模块封装在闭包中,结构为: ```javascript (function(modules) { // Webpack运行时逻辑 __webpack_require__(0); // 入口模块 })({ "./src/encrypt.js": function(module, exports) { // 加解密算法逻辑 } }); ``` - **解包工具**: 使用`webpack-unpack`工具提取模块: ```bash npm install -g webpack-unpack webpack-unpack bundle.js > unpacked.json ``` 生成JSON文件,包含所有模块的路径和代码。 ### 3. **定位加解密模块** - **关键词搜索**: 在解包后的模块中搜索关键词: - 算法名:`AES`、`DES`、`RSA`、`crypto`、`encrypt`、`decrypt`。 - 字符串特征:如`encrypt(`、`decrypt(`、`Cipher`、`createCipheriv`。 - **依赖追踪**: 从入口模块(通常为`0`或`./src/index.js`)开始,通过`__webpack_require__`调用关系追踪到加解密模块。 ### 4. **反混淆处理(关键步骤)** 引用[2]提到:92%的网站使用混淆技术,需通过AST(抽象语法树)还原代码- **反混淆工具**: - **de4js**(在线工具):处理字符串加密、控制流扁平化。 - **Babel AST**(编程处理):使用JavaScript编写脚本还原变量名和逻辑。 ```javascript // 示例:使用Babel解析AST并还原字符串加密 const parser = require("@babel/parser"); const traverse = require("@babel/traverse").default; const generate = require("@babel/generator").default; const code = `const key = atob("U2VjcmV0S2V5");`; const ast = parser.parse(code); traverse(ast, { CallExpression(path) { if (path.node.callee.name === "atob") { const value = path.node.arguments[0].value; const decoded = Buffer.from(value, "base64").toString(); path.replaceWithSourceString(`"${decoded}"`); // 替换为明文 } } }); console.log(generate(ast).code); // 输出: const key = "SecretKey"; ``` - **控制流还原**: 针对控制流扁平化(如`switch-case`跳转),使用工具如**JStillery**自动重构分支逻辑。 ### 5. **动态调试验证** - **浏览器断点调试**: 在Chrome DevTools中: 1. 定位到加解密函数。 2. 设置断点,触发加解密操作(如提交表单)。 3. 观察输入输出、密钥、IV等参数。 - **Hook关键函数**: 注入脚本Hook加密函数,记录参数: ```javascript // 覆盖原函数,打印调用参数 const originalEncrypt = window.crypto.subtle.encrypt; window.crypto.subtle.encrypt = function(algo, key, data) { console.log("Encrypt called:", algo, key, data); return originalEncrypt.apply(this, arguments); }; ``` ### 6. **提取算法并移植** - **独立模块提取**: 将反混淆后的加解密函数及其依赖(如密钥生成、填充函数)提取为独立JS文件。 - **环境适配**: 若算法依赖浏览器环境(如`Web Crypto API`),需替换为Node.js的`crypto`模块: ```javascript // 浏览器代码(原始) async function encrypt(data, key) { return await crypto.subtle.encrypt({ name: "AES-GCM" }, key, data); } // Node.js适配 const crypto = require("crypto"); function encrypt(data, key) { const cipher = crypto.createCipheriv("aes-256-gcm", key, iv); return Buffer.concat([cipher.update(data), cipher.final()]); } ``` - **测试验证**: 使用已知明文和密钥验证移植后算法的正确性。 ### 7. **自动化工具辅助** - **红队平台整合**: 引用[1]提到的工具如**Viper**(图形化红队平台)可集成自定义脚本,自动化解包和反混淆流程。 - **SQL注入辅助**: 引用[3]中的SQLMap技巧可用于探测Webpack配置文件的路径(如`/static/webpack.config.js`),获取源码结构信息。 ### 注意事项 - **法律合规**:仅测试授权目标,避免侵权。 - **混淆对抗**:开发者可能使用Webpack的`eval`模式(如`eval-source-map`),此时需结合SourceMap文件还原源码。 --- ### 相关问题 1. **如何区分Webpack打包代码中的第三方加密库和自定义加密模块?** 2. **反混淆后如何重构被扁平化控制流的加密函数?** 3. **Webpack的`eval-source-map`配置对反编译有何影响?如何利用?** 4. **提取的算法如何在非浏览器环境(如Python)中实现?** [^1]: 横向移动工具如impacket、wmiexec-Pro等可用于渗透测试中的横向移动。 [^2]: AST反混淆技术是还原混淆代码的关键,涉及控制流还原、变量反命名、字符串解密等。 [^3]: SQLMap等工具在Web渗透中用于探测SQL注入漏洞。</think>### Web渗透测试中提取Webpack代码并还原加解密算法的完整流程 #### 1. **获取Webpack打包代码** [^1] - **浏览器开发者工具提取**: 1. 访问目标网站,按`F12`打开开发者工具 2. 在`Sources`面板定位Webpack入口文件(通常为`main.[hash].js`或`app.[hash].js`) 3. 格式化代码(点击`{}`图标) 4. 保存完整JS文件 - **网络流量捕获**: ```bash # 使用Burp Suite或Mitmproxy捕获JS文件 mitmdump -w traffic.mitm # 捕获所有流量 grep "webpack" traffic.mitm # 过滤Webpack文件 ``` #### 2. **解包Webpack模块结构** [^2] Webpack典型结构: ```javascript /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ /***/ "./src/encrypt.js": (() => { // 加解密算法在这里 /***/ }), /***/ 0: (() => { // 入口模块 __webpack_require__("./src/encrypt.js"); /***/ }) /******/ }); /******/ })(); ``` **解包工具**: | 工具 | 命令/用法 | 用途 | |------|-----------|------| | **webpack-unpack** | `npx webpack-unpack bundle.js > modules.json` | 提取所有模块 | | **AST Explorer** | 在线工具:https://astexplorer.net | 可视化分析代码结构 | | **Babel Parser** | `parser.parse(code, {sourceType: 'module'})` | 编程式解析AST | #### 3. **定位加解密模块** - **特征搜索**: ```bash grep -E 'encrypt|decrypt|crypto|Cipher|AES|RSA' modules/* ``` - **动态调试**: 1. 在Chrome DevTools中对以下API设断点: - `crypto.subtle.encrypt/decrypt` - `CryptoJS.AES.encrypt` - `window.atob/btoa` 2. 触发加解密操作(如表单提交) 3. 通过调用栈回溯到Webpack模块 #### 4. **反混淆处理** [^2] **常见混淆技术及解决方案**: ```mermaid graph LR A[混淆类型] --> B[字符串加密] A --> C[控制流扁平化] A --> D[变量名混淆] B --> E[AST解析自动解密] C --> F[控制流重构] D --> G[变量重命名] ``` **AST反混淆示例**(处理字符串加密): ```javascript // 原始混淆代码 const key = _0x12ab('0x12f'); // AST转换后 const key = "SecretKey123"; ``` **推荐工具**: - **de4js**:https://lelinhtinh.github.io/de4js/(在线解混淆) - **Babel AST**:编程式还原代码结构 - **JStillery**:处理高级控制流混淆 #### 5. **算法还原与移植** - **提取独立模块**: ```javascript // 提取后的加解密模块 const CryptoUtils = { encrypt(data, key) { // 还原后的加密逻辑 return crypto.subtle.encrypt({name: "AES-GCM"}, key, data); }, decrypt(encrypted, key) { // 还原后的解密逻辑 return crypto.subtle.decrypt({name: "AES-GCM"}, key, encrypted); } } ``` - **环境适配**: ```javascript // 浏览器环境 -> Node.js适配 if (typeof window === 'undefined') { const crypto = require('crypto'); // 重写浏览器特定API } ``` #### 6. **渗透测试应用场景** 1. **解密敏感数据**:还原客户端加密的认证令牌 2. **参数篡改**:绕过前端校验直接构造加密请求 3. **漏洞利用**:识别弱加密实现(如固定IV、弱密钥) 4. **协议分析**:逆向私有API通信协议 **示例攻击流程**: ```mermaid sequenceDiagram participant A as 攻击者 participant W as Web应用 A->>W: 捕获Webpack代码 A->>A: 反混淆提取算法 A->>W: 构造加密请求 W->>A: 返回敏感数据 ``` #### 7. **注意事项** 1. **法律合规**:仅测试授权目标 2. **混淆对抗**:使用最新AST解析库应对新型混淆 3. **环境差异**:处理浏览器特有API(如Web Crypto API) 4. **完整性验证**:使用测试向量验证算法正确性 --- ### 相关问题 1. **如何区分Webpack打包代码中的第三方加密库和自定义加密模块?** 2. **反混淆后如何重构被扁平化控制流的加密函数?** 3. **Webpack的`eval-source-map`配置对反编译有何影响?如何利用?** 4. **提取的算法如何在Python中实现以集成到渗透测试工具链?** [^1]: 横向移动工具如impacket、wmiexec-Pro等可用于渗透测试中的横向移动。 [^2]: AST反混淆技术是还原混淆代码的关键,涉及控制流还原、变量反命名、字符串解密等。 [^3]: SQLMap等工具在Web渗透中用于探测SQL注入漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值