前端加密对抗常见场景突破
字数 1374 2025-08-22 12:23:19
前端加密对抗常见场景突破技术详解
前言
前端加密是现代网站常见的安全措施,相对于明文传输,加密数据增加了渗透测试的难度。本文将详细分析三种常见的前端加密场景及其突破方法:AES固定密钥加密、AES服务端获取密钥加密和RSA非对称加密。
一、AES固定密钥加密
1. AES加密基础
AES(Advanced Encryption Standard)是一种对称加密算法,特点如下:
- 加密和解密使用相同的密钥
- 常见的加密模式包括CBC、ECB等
- 需要初始化向量(IV)来增加安全性(在CBC模式下)
2. 实际案例分析
前端加密代码示例:
const jsonData = JSON.stringify(formData);
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const iv = CryptoJS.enc.Utf8.parse("1234567890123456");
const encrypted = CryptoJS.AES.encrypt(jsonData, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString();
请求示例:
POST /encrypt/aes.php HTTP/1.1
Host: qianduan:7952
Content-Type: application/x-www-form-urlencoded; charset=utf-8
encryptedData=nArXfVdnoe67UzojAPP2X%2B6qSiznLMBAI3a5Bi%2BzlNxdbZ%2FOS8HQ6QCw6cm3stZk
3. 突破方法
- 识别加密方式:通过前端代码分析确定使用AES加密
- 获取密钥和IV:从代码中提取固定密钥("1234567890123456")
- 使用工具解密:
- 配置AutoDecoder等工具
- 设置相同的密钥和IV
- 选择正确的加密模式(CBC)和填充方式(PKCS7)
- 爆破测试:
- 解密请求数据验证加密逻辑
- 构造明文字典进行加密
- 发送加密后的数据进行爆破
二、AES服务端获取密钥加密
1. 特点分析
- 密钥和IV从服务端动态获取
- 但通常密钥在会话期间保持不变
- 增加了静态分析的难度
2. 实际案例分析
前端代码关键部分:
async function fetchAndSendDataAes(url) {
let aesKey, aesIv;
try {
const response = await fetch("encrypt/server_generate_key.php");
const data = await response.json();
aesKey = CryptoJS.enc.Base64.parse(data.aes_key);
aesIv = CryptoJS.enc.Base64.parse(data.aes_iv);
} catch (error) {
console.error("获取 AES 密钥失败:", error);
return;
}
// 后续加密逻辑...
}
3. 突破方法
-
拦截密钥请求:
- 捕获
server_generate_key.php的响应 - 提取Base64编码的aes_key和aes_iv
- 捕获
-
工具配置:
- 修改正则表达式匹配加密数据字段
- 设置从服务端获取的密钥和IV
-
验证解密:
- 使用获取的密钥解密样本请求
- 确认加密模式(CBC)和填充方式(PKCS7)
-
爆破流程:
- 与固定密钥AES相同
- 注意保持会话以使用相同密钥
三、RSA非对称加密
1. RSA加密基础
- 使用公钥加密,私钥解密
- 公钥可以公开,私钥保密
- 常用于保护传输中的数据
2. 实际案例分析
前端代码示例:
const publicKey = `-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----`;
const encryptor = new JSEncrypt();
encryptor.setPublicKey(publicKey);
const encryptedData = encryptor.encrypt(dataString);
3. 突破方法
-
获取公钥:从前端代码中提取公钥
-
理解加密结构:
- 数据通常被转换为JSON格式后加密
- 例如:
{"username":"admin","password":"123456"}
-
工具配置:
- 在AutoDecoder中设置RSA公钥
- 配置加密前的明文格式
-
爆破流程:
- 使用公钥加密构造的明文数据
- 发送加密后的请求进行爆破
- 注意无法解密响应,只能通过结果判断
四、通用突破流程
-
前端代码分析:
- 查找加密相关函数(CryptoJS, JSEncrypt等)
- 确定加密算法、密钥获取方式
-
请求/响应分析:
- 捕获加密前后的数据
- 分析加密数据格式和传输方式
-
工具配置:
- 根据加密类型选择适当工具
- 精确配置密钥、IV、加密模式等参数
-
验证与爆破:
- 先验证加解密流程是否正确
- 然后进行自动化爆破测试
五、防御建议
- 避免使用固定密钥
- 为每个会话使用不同的密钥
- 结合多种加密方式
- 对关键操作增加二次验证
- 定期更新加密密钥
六、工具推荐
- AutoDecoder:自动化加解密工具
- Burp Suite:拦截和修改请求
- Chrome DevTools:前端代码分析
- CryptoJS/JSEncrypt:理解加密逻辑
通过以上方法,可以有效分析和突破常见的前端加密场景,但请注意这些技术应仅用于合法的安全测试目的。