前端加解密对抗encrypt-labs
字数 2219 2025-08-22 12:23:19
前端加解密对抗实战教学文档
1. 前言与工具准备
1.1 项目背景
- 项目地址: https://github.com/SwagXz/encrypt-labs
- 作者: SwagXz
- 目标: 提供8种常见前端加密方式的实战练习环境,包括AES、DES、RSA等加密方式以及签名、防重放等安全机制
1.2 测试环境
- 混淆版地址: http://82.156.57.228:43899
- 无混淆版地址: http://82.156.57.228:43899/easy.php
- 默认凭证: admin/123456
1.3 必备工具
- Burp插件: autoDecoder (https://github.com/f0ng/autoDecoder)
- 支持AES、DES、SM4、SM2、RSA等加密方式
- 浏览器插件: Ctool (https://ctool.dev/)
- 提供更全面的加解密功能验证
2. 加密方式分析与对抗技术
2.1 第一关: AES固定Key加密
加密分析
- 加密参数:
encryptedData - 加密方式: AES-CBC模式,PKCS7填充
- Key:
1234567890123456 - IV:
1234567890123456
对抗方法
- 定位加密函数:
function sendDataAes(url) {
const formData = {
username: document.getElementById("username").value,
password: document.getElementById("password").value
};
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();
}
- autoDecoder配置:
- Key:
1234567890123456 - IV:
1234567890123456 - 正则表达式:
encryptedData=([^&]+)
- Key:
2.2 第二关: AES服务端动态Key
加密分析
- 特点: 先请求获取Key/IV,再发送加密数据
- Key/IV有效期: 客户端与服务端连接期间不变
对抗方法
- 先获取服务端返回的Key/IV
- 使用获取的Key/IV配置autoDecoder
- 保持会话不中断可重复使用同一Key/IV
2.3 第三关: RSA加密
加密分析
- 加密参数:
data - 公钥:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRvA7giwinEkaTYllDYCkzujvi
NH+up0XAKXQot8RixKGpB7nr8AdidEvuo+wVCxZwDK3hlcRGrrqt0Gxqwc11btlM
DSj92Mr3xSaJcshZU8kfj325L8DRh9jpruphHBfh955ihvbednGAvOHOrz3Qy3Cb
ocDbsNeCwNpRxwjIdQIDAQAB
-----END PUBLIC KEY-----
对抗方法
- 定位加密函数:
const encrypted = jsEncrypt.encrypt(data.toString());
- autoDecoder配置:
- 使用公钥进行加密
- 无法解密(无私钥)
- 可构造相同加密数据重放
2.4 第四关: AES+RSA混合加密
加密分析
- 流程:
- 生成随机16位AES Key和IV
- 用AES加密表单数据
- 用RSA加密AES Key和IV
- 发送
encryptedData(AES加密数据)、encryptedKey和encryptedIv
对抗方法
- 修改JS固定Key/IV:
// 修改前
const key = CryptoJS.lib.WordArray.random(16);
const iv = CryptoJS.lib.WordArray.random(16);
// 修改后
const key = CryptoJS.enc.Utf8.parse("1234567890123456");
const iv = CryptoJS.enc.Utf8.parse("1234567890123456");
- 使用固定Key/IV生成
encryptedData - 可忽略
encryptedKey和encryptedIv的修改
2.5 第五关: DES规律Key
加密分析
- 加密参数: 仅
password - Key规则: username补足8位(不足补6)
- IV规则: "9999"+username前4位
- 示例:
- username: admin
- Key: admin666
- IV: 9999admi
对抗方法
- 定位加密函数:
const key = CryptoJS.enc.Utf8.parse(username.padEnd(8, '6'));
const iv = CryptoJS.enc.Utf8.parse('9999' + username.slice(0, 4));
- autoDecoder配置:
- 根据username动态生成Key/IV
2.6 第六关: 明文加签(HMAC-SHA256)
签名分析
- 参数:
nonce(随机10位),timestamp,signature - 签名算法:
const dataToSign = username + password + nonce + timestamp;
const signature = CryptoJS.HmacSHA256(dataToSign, secretKey).toString(CryptoJS.enc.Hex);
- secretKey:
be56e057f20f883e
对抗方法
- Python发包脚本:
import hmac
import hashlib
def generate_signature(username, password, nonce, timestamp, secret_key):
data_to_sign = username + password + nonce + str(timestamp)
h = hmac.new(secret_key.encode('utf-8'), digestmod=hashlib.sha256)
h.update(data_to_sign.encode('utf-8'))
return h.hexdigest()
- 固定nonce可重复使用签名
2.7 第七关: 服务端动态签名Key
特点
- 先请求获取签名Key
- 使用获取的Key生成签名
- 发送登录请求时携带签名
对抗方法
- 实现两阶段请求:
- 第一阶段获取签名Key
- 第二阶段使用Key生成签名并发送
- 爆破时需要每次获取新Key
2.8 第八关: 防重放机制
加密分析
- 参数:
random(加密时间戳) - 加密方式: RSA加密当前时间戳
- 防重放: 服务端检查时间戳唯一性
对抗方法
- Python实现:
def rsa_encrypt(data, public_key):
key = RSA.import_key(public_key)
cipher = PKCS1_v1_5.new(key)
encrypted_data = cipher.encrypt(data.encode('utf-8'))
return b64encode(encrypted_data).decode('utf-8')
timestamp = str(int(round(time.time() * 1000)))
random = rsa_encrypt(timestamp, public_key)
- 每次请求生成新的时间戳加密值
3. 总结与实战建议
3.1 通用分析流程
- 抓包定位加密参数
- 在JS中下断点分析加密逻辑
- 确定加密算法和关键参数(Key/IV等)
- 选择对抗方法:
- 修改JS固定加密参数
- 使用工具自动加解密
- 编写自定义发包脚本
3.2 不同加密方式的对抗策略
| 加密类型 | 关键特征 | 对抗方法 |
|---|---|---|
| AES固定Key | 硬编码Key/IV | 直接使用固定Key解密 |
| AES动态Key | 先获取Key再加密 | 保持会话重用Key |
| RSA | 非对称加密,只有公钥 | 构造相同加密数据重放 |
| 混合加密 | AES+RSA组合 | 固定AES Key或Hook加密过程 |
| 规律Key | 根据输入生成Key | 分析生成规则动态计算 |
| 加签 | 参数+签名 | 重现签名算法 |
| 防重放 | 唯一性校验 | 保证每次请求参数唯一 |
3.3 进阶技巧
- JS Hook: 覆盖加密函数获取明文
- 反混淆: 对于混淆代码使用AST解析
- 自动化: 将分析过程整合到自动化测试工具
- 动态调试: 结合浏览器开发者工具动态修改运行时代码
通过系统掌握这些加密方式和对抗技术,可以有效提升在前端加密场景下的渗透测试能力。