|
1 |
| -# JSONP 参数加密示例项目 |
| 1 | +# Script Hook辅助逆向jsonp参数加密 |
2 | 2 |
|
3 |
| -这是一个简单的示例项目,展示了如何在客户端使用 JSONP 请求时对参数进行加密,并在服务器端解密。项目使用了 `CryptoJS` 库来实现 AES 加密和解密功能,并通过 `Express` 框架搭建了一个简单的服务器来处理 JSONP 请求。 |
| 3 | +# 一、逆向目标 |
4 | 4 |
|
5 |
| -## 项目结构 |
| 5 | +这个页面上点击"发送JSONP请求"按钮的时候,会向后端发送一个jsop的请求上报数据: |
6 | 6 |
|
7 |
| -- **client.html**: 客户端页面,包含一个输入框和按钮,用户输入数据后,数据会被加密并通过 JSONP 请求发送到服务器。 |
8 |
| -- **server.js**: 服务器端代码,接收加密的 JSONP 请求,解密数据并返回响应。 |
9 |
| -- **package.json**: 项目的依赖配置文件,包含项目所需的依赖项。 |
| 7 | + |
10 | 8 |
|
11 |
| -## 如何运行 |
| 9 | +但是上报的数据参数是加密的: |
12 | 10 |
|
13 |
| -1. **克隆项目**: |
14 |
| - ```bash |
15 |
| - git clone <repository-url> |
16 |
| - cd <project-directory> |
17 |
| - ``` |
| 11 | + |
18 | 12 |
|
19 |
| -2. **安装依赖**: |
20 |
| - ```bash |
21 |
| - npm install |
22 |
| - ``` |
| 13 | +我们的目标就是搞清楚这个data的加密逻辑。 |
23 | 14 |
|
24 |
| -3. **启动服务器**: |
25 |
| - ```bash |
26 |
| - node server.js |
27 |
| - ``` |
| 15 | +# 二、下载 & 启动靶场 |
28 | 16 |
|
29 |
| -4. **打开客户端页面**: |
30 |
| - 在浏览器中打开 `client.html` 文件。你可以通过文件路径直接打开,或者使用一个本地服务器(如 `http-server`)来提供服务。 |
| 17 | +克隆仓库到本地: |
31 | 18 |
|
32 |
| -5. **使用示例**: |
33 |
| - - 在输入框中输入数据(或使用默认生成的随机数据)。 |
34 |
| - - 点击“发送 JSONP 请求”按钮,数据会被加密并发送到服务器。 |
35 |
| - - 服务器解密数据后,返回响应并在页面上显示结果。 |
| 19 | +```bash |
| 20 | +git clone [email protected]:JSREI/js-script-hook.git |
| 21 | +``` |
36 | 22 |
|
37 |
| -## 代码说明 |
| 23 | +进入靶场目录: |
38 | 24 |
|
39 |
| -### 客户端 (`client.html`) |
| 25 | +```bash |
| 26 | +cd js-script-hook/goat/jsonp-request-encrypt |
| 27 | +``` |
40 | 28 |
|
41 |
| -- **加密函数**: 使用 `CryptoJS.AES.encrypt` 对输入数据进行加密。 |
42 |
| -- **JSONP 请求**: 创建一个 `<script>` 标签来发送 JSONP 请求,请求完成后移除该标签。 |
43 |
| -- **回调函数**: 处理服务器返回的响应数据,并将其显示在页面上。 |
| 29 | +启动Server: |
44 | 30 |
|
45 |
| -### 服务器 (`server.js`) |
| 31 | +```bash |
| 32 | +node server.js |
| 33 | +``` |
46 | 34 |
|
47 |
| -- **解密函数**: 使用 `CryptoJS.AES.decrypt` 对接收到的加密数据进行解密。 |
48 |
| -- **JSONP 接口**: 接收加密的 JSONP 请求,解密数据后返回响应。 |
| 35 | +打开客户端页面: |
49 | 36 |
|
50 |
| -## 依赖项 |
| 37 | +``` |
| 38 | +client.html |
| 39 | +``` |
51 | 40 |
|
52 |
| -- **CryptoJS**: 用于加密和解密数据。 |
53 |
| -- **Express**: 用于搭建服务器和处理 HTTP 请求。 |
| 41 | +然后要破解的内容就在这个页面上。 |
54 | 42 |
|
55 |
| -## 注意事项 |
| 43 | +# 三、安装脚本 |
| 44 | + |
| 45 | +安装请参考项目主页的安装教程,此处不再赘述: |
| 46 | + |
| 47 | +``` |
| 48 | +https://github.com/JSREI/js-script-hook?tab=readme-ov-file#%E4%BA%8C%E5%AE%89%E8%A3%85 |
| 49 | +``` |
| 50 | + |
| 51 | +# 四、分析 |
| 52 | + |
| 53 | +先配置一下脚本: |
| 54 | + |
| 55 | + |
| 56 | + |
| 57 | +增加一个匹配所有URL的断点: |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | +然后回到页面上点击“发送JSONP请求”按钮,发现进入了断点,从右侧的调用栈往前追溯: |
| 62 | + |
| 63 | + |
| 64 | + |
| 65 | +发现这里是发起请求的地方,加密参数是外面传进来的参数: |
| 66 | + |
| 67 | + |
| 68 | + |
| 69 | +然后继续往前追溯调用栈,看到了传递参数的地方: |
| 70 | + |
| 71 | + |
| 72 | + |
| 73 | +然后这个`_0x1a2bData`是前面调用一个方法`_0x1a2b`生成的: |
| 74 | + |
| 75 | + |
| 76 | + |
| 77 | +看起来`_0x1a2b(data, _0x3c9d)`像是在调用一个加密函数,我们先看一下传递的参数,传递了两个参数,第一个参数就是页面上要往后端上报的数据: |
| 78 | + |
| 79 | + |
| 80 | + |
| 81 | +第二个参数是一个神秘的字符串,看起来像是一个秘钥,这个是在页面上写死的值: |
| 82 | + |
| 83 | + |
| 84 | + |
| 85 | +搞明白了两个参数是怎么来的之后,我们继续跟进去`_0x1a2b(_0x2a3f, _0x3c9d);`看看加密逻辑是什么,鼠标移动到`_0x1a2b`上等一会儿,会展示对应的函数的信息,跟进去函数地址: |
| 86 | + |
| 87 | + |
| 88 | + |
| 89 | +然后我们就跟到了这个函数的定义的地方,看起来是一个AES加密: |
| 90 | + |
| 91 | + |
| 92 | + |
| 93 | +加密函数的逻辑: |
| 94 | + |
| 95 | +```js |
| 96 | +// 加密函数 |
| 97 | +function _0x1a2b(data, _0x3c9d) { |
| 98 | + return CryptoJS.AES.encrypt(JSON.stringify(data), _0x3c9d).toString(); |
| 99 | +} |
| 100 | +``` |
| 101 | + |
| 102 | +至此逻辑分析完毕,我们能够很方便的去追溯主要就是因为能够打了script类型的断点,让我们能够从底下往上追溯,同时又能够结合运行时的变量的值来更快的理解逻辑,这就是这个[Script Hook](https://github.com/JSREI/js-script-hook)工具给我们带来的优势。 |
56 | 103 |
|
57 |
| -- **密钥管理**: 在实际项目中,密钥应妥善管理,避免硬编码在代码中。可以使用环境变量或其他安全方式来存储密钥。 |
58 |
| -- **安全性**: 虽然本示例展示了如何加密数据,但 JSONP 本身存在一些安全风险(如跨站脚本攻击),在实际应用中应谨慎使用。 |
59 | 104 |
|
60 |
| -## 许可证 |
61 | 105 |
|
62 |
| -本项目基于 MIT 许可证开源。 |
|
0 commit comments