白盒测试与代码审计-JS 数据逆向

声明:本文所有内容仅用于授权渗透测试与网络安全学习研究,禁止用于任何非法用途。

前言

在前后端分离的现代 Web 开发中,为了保证数据传输的安全性,敏感数据往往不会直接明文传输,而是经过加密处理。其中,AES(高级加密标准) 是最常用的对称加密算法之一。

本文将通过一个电影列表数据的靶场案例,演示如何从发现加密数据、定位解密代码、分析 AES 参数,到最终在控制台和工具中还原明文数据的全过程。


一、 理论基础:AES 解密五要素

在开始实战前,需要了解 AES 解密的核心逻辑。正如我们在理论部分所学,AES 解密并非只有一个"密码",它通常涉及以下五个关键要素:

  1. 数据 (data):被加密的密文。

  2. 密钥 (key):用于解密的钥匙。

  3. 初始向量 (iv):增加加密随机性的参数。

  4. 模式 (mode):加密的工作模式(如 CBC、ECB)。

  5. 填充 (padding):数据块不足时的填充方式(如 Pkcs7)。

特别注意模式的特征:

  • CBC 模式 :解密时一定需要 iv。

  • ECB 模式 :解密时一定没有 iv。

掌握这些理论,在逆向时就能有的放矢。


二、 寻找入口:发现加密数据

实战的第一步是确认目标数据是否被加密。

首先,打开靶场页面,可以看到页面上正常展示着电影列表数据,包括 ID、标题、主演等信息。这说明浏览器最终渲染的是明文。

为了探究数据传输过程,按 F12 打开开发者工具,切换到 Network(网络) 面板。刷新页面后,在请求列表中寻找获取数据的接口。通常这类接口会命名为 data.php、list.json 或 api 等。在这里,找到了 data.php 这个请求。

点击 data.php 查看响应内容(Response)。令人意外的是,这里并没有直接的中文电影名,而是一串乱码般的字符串。仔细观察返回的 JSON 结构,发现它包含了 code、key、iv 和 data 四个字段。

  • data:显然是加密后的密文。

  • key 和 iv:这直接印证了之前的理论------这是一个使用 CBC 模式 的 AES 加密,因为服务器把密钥和向量都下发给了前端。


三、 定位源码:搜索 CryptoJS

既然知道了是 AES 加密,下一步就是找到前端负责解密的 JavaScript 代码。

大多数现代网站不会手写 AES 算法,而是使用成熟的库,其中最著名的就是 CryptoJS 。 在开发者工具的 Sources(源代码) 面板中,按下 Ctrl + Shift + F 打开全局搜索框,输入关键词 CryptoJS。 搜索结果直接指向了 aes.js 文件。点击进入该文件,看到了熟悉的解密逻辑代码。

阅读 aes.js 的代码,可以清晰地看到解密流程:

  1. 调用 CryptoJS.AES.decrypt。

  2. 传入参数:ciphertext(密文)、keyWordArray(密钥)、iv(向量)。

  3. 配置对象中明确写着:mode: CryptoJS.mode.CBC 和 padding: CryptoJS.pad.Pkcs7。

这完全符合的理论预期:AES + CBC 模式 + Pkcs7 填充。


四、 提取参数:准备解密

找到了代码逻辑,需要从网络请求中提取出具体的参数值,以便进行模拟解密。

回到 data.php 的响应包,将所需的参数一一提取出来:

  • iv : MTIzNDU2Nzg5MEFCQ0RFRg==

  • key : e10adc3949ba59abbe56e057f2012345

  • mode : CBC

  • padding : Pkcs7

  • data: (那一大串 Base64 编码的密文)


五、 模拟执行:控制台还原数据

有了参数和逻辑,最快的方法是直接在浏览器控制台(Console)中运行解密代码。

由于 aes.js 中的解密函数可能封装在闭包里,可以尝试直接在控制台调用页面上暴露的全局函数,或者根据源码逻辑构造调用语句。 如图所示,在控制台输入类似 encrypt("密文", "密钥", "iv") 的语句(注:此处函数名可能因混淆而异,重点是传入这三个参数)。

按下回车,控制台打印出了一个包含 5 个对象的数组。展开查看,title 字段变成了"大话西游之大圣娶亲",actors 变成了"周星驰..."。 这说明成功利用前端逻辑还原了数据。


六、 工具验证:Ctool 插件解密

除了控制台,也可以使用浏览器插件或在线工具来验证解密结果,这在编写爬虫脚本时非常有用。

打开 Ctool 插件(或其他 AES 解密工具),切换到 AES 选项卡:

  1. 模式 :选择 CBC。

  2. 填充 :选择 Pkcs7。

  3. 密钥 (Key):粘贴提取出的 key。

  4. 偏移量 (IV):粘贴提取出的 iv。

  5. 密文:粘贴那一大串 data。

点击解密后,看到输出了一堆 \u5927\u8bdd\u897f... 格式的字符。这是 Unicode 编码 的中文。

接着,切换到 Ctool 的 编解码 -> Unicode 功能。 将刚才解密出来的 Unicode 字符串粘贴进去,点击"解码"。 原本看不懂的编码就变成了清晰的中文 JSON 数据


七、 总结

通过本次实战,我们完整体验了 JS 数据逆向的标准流程:

  1. 抓包分析 :发现响应数据包含 key、iv、data,判断为 AES CBC 模式。

  2. 源码审计 :全局搜索 CryptoJS 定位解密逻辑,确认算法细节。

  3. 参数提取:从网络请求中获取解密所需的五要素。

  4. 模拟还原:通过控制台或第三方工具(Ctool)成功还原明文。

相关推荐
吴声子夜歌1 小时前
Docker入门与实战——高级网络功能
网络·docker
艾莉丝努力练剑1 小时前
【AI大模型接入SDK】ChatServer HTTP接口模块实现总览
网络·c++·人工智能·网络协议·学习·http·架构
薛一半1 小时前
Redux实战:组件状态管理全解析
开发语言·前端·javascript·react.js
YH_Analytics2 小时前
2026 洁净室环境在线监测系统行业排名与份额对比销量与份额解析
大数据·网络·人工智能
Chenyu_3102 小时前
NUMA 基础:从 CPU、内存到 Node 的整体理解
linux·服务器·网络·缓存
对空六课3 小时前
两个统计平台数据不同:用同一时间窗和事件样本做差异定位
大数据·前端·网络·数据库
User_芊芊君子3 小时前
【JavaEE初阶 - 网络原理】网络分几层?从自定义协议聊到 DNS
java·网络·java-ee
白帽攻防录10 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全