渗透测试高级技巧(二):对抗前端动态密钥与非对称加密防护
字数 1646 2025-08-10 10:14:26
渗透测试高级技巧:对抗前端动态密钥与非对称加密防护
1. 背景与概述
本文介绍如何应对前端加密中的复杂场景,特别是涉及动态密钥和非对称加密技术的防护措施。这些技术在现代Web应用中越来越常见,主要用于保护敏感数据(如登录凭证)不被轻易窃取。
2. 目标场景分析
2.1 典型加密流程
- 动态密钥获取:客户端首先请求
/get-key接口获取加密密钥 - 数据加密:使用获取的密钥加密表单数据
- 数据提交:将加密后的数据POST到服务器,可能不携带密钥本身
- 服务器解密:服务器使用存储的密钥解密数据
2.2 常见加密技术组合
- RSA/SM2非对称加密:用于加密传输对称密钥
- AES对称加密:用于加密实际传输的数据
- 混合加密方案:RSA-OAEP + AES的常见组合
3. 技术实现细节
3.1 加密技术限制
- RSA-OAEP加密长度限制:
- 最大明文长度 = (密钥长度/8) - OAEP填充长度
- SHA-256填充需要66字节额外空间
- 因此通常只用于加密AES密钥,而非大数据
3.2 实际案例流程
- 请求
/crypto/js/rsa/generator获取RSA密钥对 - 提取公钥(PublicKey)用于加密AES的KEY和IV
- 使用AES加密实际数据
- 将加密后的KEY和IV一起发送到服务器
4. 渗透测试解决方案
4.1 核心工具与函数
使用yaklang的热加载功能实现加密流程:
aesKey = "aaaaaaaaaaaaaaaa"
iv = "aaaaaaaaaaaa"
// AES-GCM加密函数
aesGCM = data => {
return codec.EncodeBase64(codec.AESGCMEncryptWithNonceSize12(aesKey, data, iv)~)
}
// RSA-OAEP加密函数
rsaOAEP_key = (pem) => {
return codec.EncodeBase64(codec.RSAEncryptWithOAEP(pem, aesKey)~)
}
rsaOAEP_iv = (pem) => {
return codec.EncodeBase64(codec.RSAEncryptWithOAEP(pem, iv)~)
}
4.2 Web Fuzzer序列配置
请求一:获取RSA公钥
- 设置数据提取器提取
publicKey - JQ表达式:
*(提取整个响应体) - 提取字段名:
publicKey
请求二:加密提交数据
- 使用热加载标签替换关键字段:
{
"data": "{{yak(aesGCM|abc)}}",
"iv": "aaaaaaaaaaaa",
"encryptedIV": "{{yak(rsaOAEP_iv|{{param(publicKey)}})",
"encryptedKey": "{{yak(rsaOAEP_key|{{param(publicKey)}})"
}
4.3 响应解密方案
方案一:使用Fuzzer序列解密
- 在请求一中添加
privateKey提取配置 - 在请求二中提取
encryptedIV、encryptedKey和data - 在请求三中使用解密函数:
// RSA-OAEP解密
oaepDec = (pem,data) => {
return string(codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(data)~)~)
}
// AES-GCM解密
dec = (key,data,iv) => {
return string(codec.AESGCMDecryptWithNonceSize12(key, codec.DecodeBase64(data)~, iv)~)
}
方案二:使用mirrorHTTPFlow函数
yaklang 1.2.7+提供的新功能:
mirrorHTTPFlow = (req, rsp, params) => {
// 获取私钥
pem = params.privateKey
// 解析响应体
_, body = poc.Split(rsp)
body = json.loads(body)
// 获取加密数据
data = body.data
ivEnc = body.encryptedIV
keyEnc = body.encryptedKey
obj = {}
// 解密IV和KEY
iv = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(ivEnc)~)~
key = codec.RSADecryptWithOAEP(pem, codec.DecodeBase64(keyEnc)~)~
// 解密数据
obj["data"] = codec.AESGCMDecryptWithNonceSize12(key, codec.DecodeBase64(data)~, iv)~
return obj
}
4.4 爆破功能实现
- 在请求二中设置变量
user和pass - 配置用户名字典:
admin|root - 配置密码字典:
admin|666666|88888888|admin123|123456 - 共产生2×5=10种组合
5. 关键技术与函数总结
5.1 加密函数
codec.AESGCMEncryptWithNonceSize12(key, data, iv):AES-GCM加密codec.RSAEncryptWithOAEP(pem, data):RSA-OAEP加密
5.2 解密函数
codec.AESGCMDecryptWithNonceSize12(key, data, iv):AES-GCM解密codec.RSADecryptWithOAEP(pem, data):RSA-OAEP解密
5.3 数据处理函数
codec.EncodeBase64(data):Base64编码codec.DecodeBase64(data):Base64解码json.loads(data):JSON解析
6. 最佳实践建议
- 硬编码测试:初始测试时可硬编码AES KEY和IV简化流程
- 响应处理:务必处理加密的响应数据以验证测试结果
- 序列利用:善用Web Fuzzer序列处理有上下文关联的请求
- 新特性应用:yaklang 1.2.7+的
mirrorHTTPFlow可简化响应处理
7. 总结
本文详细介绍了对抗前端动态密钥与非对称加密防护的渗透测试技术,重点包括:
- 混合加密(RSA+AES)场景的分析
- Web Fuzzer序列的配置与使用
- 响应数据的解密处理技巧
- 用户名密码爆破的实现方法
- yaklang热加载函数的具体应用
掌握这些技术后,测试人员能够有效应对大多数前端加密防护措施,提升渗透测试的效率和质量。