1. 项目概述与核心挑战
最近在复盘一个挺有意思的实战项目,核心目标是用Python去逆向一个前端JS,搞定一个集成了AES加密和MD5签名验证的“靶场”。这听起来像是CTF或者一些安全挑战里的常见场景,但在实际的爬虫、数据接口分析甚至是一些自动化测试里,这种组合拳也经常遇到。简单来说,就是前端在发送关键数据(比如登录凭证、查询参数)时,不是明晃晃地传过去,而是先用AES加密内容,再用MD5对整个请求包(或者特定字段)生成一个签名,一起发给后端。后端收到后,先校验MD5签名是否正确,确认请求没被篡改,然后再用AES解密拿到原始数据。这套机制的目的很明确:防篡改(MD5签名)和防窥探(AES加密)。
对于我们这些需要从外部与这个接口交互的人来说,难点就来了。你不能直接模拟一个请求,因为你不懂加密密钥和签名算法,请求根本过不了验证。所以,逆向的目标就是: 从那个前端JavaScript代码里,把AES加密的密钥、模式、填充方式,以及MD5签名的具体生成规则(哪些参数、按什么顺序拼接、有没有加盐)给完整地还原出来 。然后用Python实现一套一模一样的逻辑,这样我们就能构造出合法的请求,跟后端正常对话了。这个过程,就是典型的“JS逆向”。
2. 逆向环境搭建与工具链选择
工欲善其事,必先利其器。逆向JS不是靠肉眼硬看,得有一套顺手的工具。我的环境主要围绕浏览器和代码分析工具展开。
2.1 浏览器开发者工具:第一战场
Chrome DevTools 是我们的主战场。关键的几个面板:
- Sources面板 :核心中的核心。所有加载的JS文件都在这里。你可以直接搜索关键词(如 encrypt , AES , CryptoJS , MD5 , sign 等),快速定位到相关代码段。设置断点(Breakpoint)是动态调试的起点。
- Network面板 :记录所有网络请求。重点关注那个触发了加密和签名的请求(通常是XHR或Fetch)。查看它的 Headers (尤其是 Content-Type 和可能存在的自定义签名头)和 Payload (查看发送的加密后数据和签名值)。对比多次请求,观察哪些参数是变化的,这对推断签名规则至关重要。
- Console面板 :可以执行JavaScript代码片段。一旦我们找到了疑似加密或签名的函数,可以在这里尝试调用它,传入已知的明文,观察输出是否与Network里捕获的密文一致。这是验证函数功能最快的方法。
注意:很多网站会进行代码混淆(Obfuscation),变量名都变成了 a , b , c , _0x1a2b3c 这种无意义的字符,函数逻辑也被打乱。这时Sources面板里的 Pretty-print (美化)功能能稍微恢复一些可读性,但对付强混淆还是得靠经验和工具。
2.2 辅助分析工具
- Node.js环境 :有时候,我们需要在脱离浏览器的环境下运行找到的JS函数。如果目标代码依赖了 CryptoJS 这样的库,我们可以用 npm install crypto-js 安装,然后写个测试脚本快速验证。比在浏览器Console里反复操作更高效。
- Python环境准备 :我们的最终实现语言。需要安装加解密相关的库。 pip install pycryptodome requests
- pycryptodome :这是 PyCrypto 的继任者,功能强大且维护良好,提供了AES、MD5等算法的完整实现。
- requests :用于最终发送模拟的HTTP请求。
2.3 逆向思路确立
面对一个未知的加密系统,我通常会遵循一个“由外到内,动静结合”的思路:
3. 核心加密与签名算法逆向解析
这个靶场的核心防御有两层,我们一层层剥开。
3.1 AES加密层逆向
在JS代码里搜索 AES <



