当我们在进行Web应用渗透测试时,经常会遇到前端加密数据的情况。这种防护手段正变得越来越普遍,特别是金融、电商等对安全性要求较高的领域。传统的渗透测试方法在这里往往会失效——你明明发现了可能的注入点,但直接提交的测试payload却被前端加密逻辑处理得面目全非。
去年我测试某互联网金融平台时就遇到了典型场景:登录表单的用户名和密码字段都经过了RSA加密,连基本的SQL注入测试都变得异常困难。这就像你明明看到门锁就在眼前,却找不到锁孔在哪里。
首先需要明确的是,所有前端加密最终都要依赖JavaScript代码执行。我们的首要任务就是找出这些加密逻辑的具体实现。经过数十个项目的实战,我总结出三个最有效的定位方法:
全局搜索关键词法:在开发者工具的Sources面板中,搜索常见加密相关关键词:
javascript复制encrypt、crypto、RSA、AES、encode、publicKey
XHR断点追踪法:在Network面板找到提交请求后,通过"XHR/fetch Breakpoints"设置断点,逆向追踪参数生成过程。
事件监听法:使用Chrome的"Event Listener Breakpoints"监听表单提交事件,逐步回溯加密过程。
根据我的经验,前端加密主要有以下几种实现方式:
| 加密类型 | 识别特征 | 典型实现 |
|---|---|---|
| RSA公钥加密 | 会加载公钥文件,使用JSEncrypt等库 | new JSEncrypt().setPublicKey(key) |
| AES对称加密 | 有固定IV值,使用CryptoJS等库 | CryptoJS.AES.encrypt(data, key) |
| 自定义编码 | 非标准算法,常见encode/decode函数 | 自实现的字符替换/位移算法 |
特别提醒:遇到WebAssembly实现的加密要格外小心,逆向难度会指数级上升。这时建议优先尝试其他测试路径。
一旦定位到加密函数,最直接的方法就是在Console面板直接调用它。假设我们找到了名为encryptData()的函数:
javascript复制// 获取原始payload
let payload = "1' OR 1=1 -- ";
// 调用加密函数
let encrypted = encryptData(payload);
// 输出结果
console.log(encrypted);
这样就能获得加密后的测试字符串,可以直接用于Burp Suite等工具的重放攻击。
对于需要批量测试的场景,我推荐使用以下工具组合:
Python + PyExecJS:通过JavaScript引擎直接执行加密代码
python复制import execjs
with open('encrypt.js') as f:
ctx = execjs.compile(f.read())
encrypted = ctx.call('encryptData', "test payload")
Burp Suite的Custom Plugin:编写自定义插件自动加解密流量
Selenium自动化测试:完整模拟浏览器环境执行加密
当遇到每次请求都更换加密密钥的情况时,需要先提取密钥生成逻辑。常见模式包括:
解决方案是编写脚本先获取密钥,再执行加密。
有些系统会进行多次加密转换,比如:
code复制原始数据 → Base64 → RSA → 自定义编码
这时需要像剥洋葱一样逐层逆向,建议使用Chrome的Call Stack功能完整跟踪整个处理流程。
经常遇到加密函数被闭包包裹的情况。我的解决方案是:
越来越多的网站将加密逻辑放在WebWorker中实现。应对方法:
postMessage和onmessage模拟调用部分系统除了加密还会校验参数完整性(如签名、时间戳等)。这时需要:
在实际操作中必须注意:
我习惯在测试前准备好完整的测试用例文档,明确每个测试步骤的预期影响和回滚方案。对于金融等敏感系统,建议先在测试环境充分验证后再在生产环境进行有限测试。