渗透测试高级技巧(三):被前端加密后的漏洞测试
字数 1250 2025-08-20 18:17:07
渗透测试高级技巧:前端加密漏洞测试教学文档
1. 前端加密登录场景分析
1.1 典型加密登录流程
-
用户界面到JS层:
- 用户在界面输入用户名和密码
- 数据以JSON格式传递给JS层处理
-
JS层加密处理:
- JS接收到原始JSON数据
- 使用AES ECB模式进行加密
-
客户端到服务器传输:
- 发送加密后的数据到服务器
-
服务器处理:
- 服务器接收加密数据并进行解密
- 查询数据库获取用户信息
- 验证用户凭据
- 准备响应数据并进行加密
-
服务器到客户端响应:
- 发送加密的响应数据回客户端
-
客户端处理响应:
- JS层解密服务器响应
- 将解密后的结果显示在用户界面
2. 基础解密技术
2.1 AES ECB解密方法
raw = codec.DecodeBase64(`zqBATwKGlf9ObCg8Deimijp+OH1VePy6KkhV1Z4xjiDwOuboF7GPuQBCJKx6o9c7`)
result = codec.AESECBDecrypt(`1234123412341234`, raw,"")
dump(result)
2.2 通用解密函数实现
decryptData = (packet) => {
body = poc.GetHTTPPacketBody(packet)
params = json.loads(body)
raw = codec.DecodeBase64(params.data)~
key = codec.DecodeHex(params.key)~
result = codec.AESECBDecrypt(key, raw, nil)~
return string(result)
}
3. MITM中间人攻击中的明文查看
3.1 修改数据包存储流程
hijackSaveHTTPFlow = func(flow /* *yakit.HTTPFlow */, modify /* func(modified *yakit.HTTPFlow) */, drop/* func() */) {
request = codec.StrconvUnquote(flow.Request)~
newRequest = decryptData(request)
flow.Request = codec.StrconvQuote(newRequest)
modify(flow)
}
4. 自动化加密发送
4.1 加密函数实现
encryptData = (packet, key) => {
body = poc.GetHTTPPacketBody(packet)
result = string(codec.AESECBEncrypt(key, body, nil)~)
data = {
"data": codec.EncodeBase64(result),
"key": codec.EncodeToHex(key),
}
body = json.dumps(data)
return string(poc.ReplaceBody(packet, body /*type: []byte*/, false))
}
5. 全站加密场景处理
5.1 AES CBC加密/解密实现
// 解密函数
decrypt = packet => {
body = poc.GetHTTPPacketBody(packet)
obj = json.loads(body)
if "iv" in obj && "key" in obj && "message" in obj {
iv = codec.DecodeHex(obj.iv)~
key = codec.DecodeHex(obj.key)~
msg = codec.DecodeBase64(obj.message)~
newBody = string(codec.AESCBCDecrypt(key, msg, iv)~)
return poc.ReplaceBody(packet, newBody, false)
}
return packet
}
// 加密函数
encrypt = packet => {
body = poc.GetHTTPPacketBody(packet)
iv = randstr(16)
key = randstr(16)
msg = string(body)
enc := codec.AESCBCEncryptWithPKCS7Padding(key, msg, iv /*type: []byte*/)~
newBodyObj = {
"iv": codec.EncodeToHex(iv),
"key": codec.EncodeToHex(key),
"message": codec.EncodeBase64(enc),
}
newBody = json.dumps(newBodyObj)
packet = poc.ReplaceHTTPPacketBody(packet /*type: []byte*/, newBody)
return packet
}
5.2 Web Fuzzer热加载配置
// 请求前自动加密
beforeRequest = func(req) {
return encrypt(req)
}
// 响应后自动解密
afterRequest = func(rsp) {
return decrypt(rsp)
}
5.3 MITM存储前解密
hijackSaveHTTPFlow = func(flow /* *yakit.HTTPFlow */, modify /* func(modified *yakit.HTTPFlow) */, drop/* func() */) {
req = codec.StrconvUnquote(flow.Request)~
flow.Request = codec.StrconvQuote(decrypt(req))
rsp = codec.StrconvUnquote(flow.Response)~
flow.Response = codec.StrconvQuote(decrypt(rsp))
modify(flow)
}
6. 实战靶场分析
6.1 被加密请求的SQL注入靶场
-
特征:
- 使用AES ECB加密
- 固定密钥"1234123412341234"
- 数据包中包含"data"和"key"字段
-
测试流程:
- 通过MITM捕获加密请求
- 使用解密函数查看明文
- 修改明文构造SQL注入
- 使用加密函数重新加密发送
6.2 全站加密靶场
-
特征:
- 使用AES CBC加密
- 随机key和随机初始偏移量
- 使用Pkcs7Padding
- 数据包中包含"iv"、"key"和"message"字段
-
测试流程:
- 配置Web Fuzzer热加载自动加解密
- 直接使用明文进行测试
- 配置MITM存储前解密
- 实现无缝的加密通信测试
7. 关键知识点总结
-
加密算法识别:
- 通过查看前端JS代码确定加密算法和密钥
- 常见加密模式:AES ECB、AES CBC等
-
解密技术:
- 使用Yaklang的codec模块实现解密
- 处理Base64和Hex编码的数据
-
MITM中间人技术:
- 使用hijackSaveHTTPFlow修改存储前的数据包
- 实现加密流量的明文查看
-
自动化测试技术:
- 通过beforeRequest/afterRequest实现自动加解密
- 保持测试工具与加密系统的兼容性
-
全站加密处理:
- 处理包含iv/key/message的复杂加密格式
- 实现请求和响应的双向加解密
8. 工具使用技巧
-
Yakit热加载:
- 快速修改数据包处理逻辑
- 无需修改工具核心代码
-
Web Fuzzer配置:
- 结合热加载实现加密通信测试
- 保持测试过程的透明性
-
MITM数据存储:
- 存储解密后的明文数据
- 便于后续分析和报告生成
9. 进阶思考
-
动态密钥处理:
- 分析密钥生成算法
- 预测或获取动态密钥
-
非对称加密场景:
- 处理RSA等非对称加密
- 获取或伪造公私钥
-
混合加密系统:
- 分析多层加密机制
- 逐层解密的技术实现
-
自动化测试框架:
- 构建通用的前端加密测试框架
- 支持多种加密算法的插件化设计