JsRpc+Yakit热加载实现明文编辑加密发包
字数 1146 2025-09-01 11:26:11
JsRpc + Yakit 热加载实现明文编辑加密发包技术文档
一、技术背景
在渗透测试过程中,前端请求数据加密已成为常见的安全防护措施,这给安全测试带来了以下挑战:
- 需要逆向JavaScript代码分析加密逻辑
- 传统方法需搭建复杂运行环境
- 加密算法提取困难
- 动态调试效率低下
JsRpc + Yakit热加载技术组合解决了这些问题,实现了:
- 明文编辑加密请求
- 实时修改并重新加密
- 无需完整逆向加密算法
- 高效动态调试
二、核心组件
1. JsRpc
- 基于WebSocket的JavaScript远程调用框架
- 核心功能:
- 浏览器环境与外部工具通信
- 拦截和修改加密函数
- 提供加密/解密服务接口
2. Yakit
- 集成化安全测试平台
- 热加载特性:
- 实时修改请求内容
- 自动重新加密
- 可视化编辑界面
三、技术实现步骤
1. 环境准备
# 安装Yakit
wget https://yakit.xxx.com/latest/yakit -O /usr/local/bin/yakit
chmod +x /usr/local/bin/yakit
# 启动Yakit
yakit start
2. JsRpc注入
// 示例注入代码
(function() {
const ws = new WebSocket("ws://localhost:8080/jsrpc");
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
if(data.method === "encrypt") {
const result = window.targetEncryptFunction(data.params);
ws.send(JSON.stringify({id: data.id, result: result}));
}
};
// 替换原加密函数
window.originalEncrypt = window.targetEncryptFunction;
window.targetEncryptFunction = function(params) {
return window.originalEncrypt(params);
};
})();
3. 热加载配置流程
- 在Yakit中创建新项目
- 配置WebSocket连接地址(ws://localhost:8080/jsrpc)
- 设置拦截规则:
- 目标URL匹配模式
- 加密函数名称
- 请求/响应处理钩子
4. 请求拦截与修改
# Yakit热加载处理脚本示例
def on_request(request):
if request.path == "/api/login":
# 获取明文数据
plain_text = jsrpc_call("decrypt", request.body)
# 修改明文
modified = plain_text.replace("test", "admin")
# 重新加密
request.body = jsrpc_call("encrypt", modified)
return request
四、关键技术点
1. 加密函数定位
-
方法:
- 搜索常见加密函数名(crypto, encrypt, AES等)
- XHR/fetch请求断点
- 调用栈分析
-
特征:
// 典型加密函数结构 function encryptData(data) { const key = "xxxxxxxx"; const iv = "xxxxxxxx"; return CryptoJS.AES.encrypt(JSON.stringify(data), key, {iv: iv}).toString(); }
2. WebSocket通信协议
-
请求格式:
{ "id": "uuid", "method": "encrypt|decrypt", "params": "data_to_process" } -
响应格式:
{ "id": "uuid", "result": "processed_data" }
3. 热加载处理流程
- 拦截加密请求
- 通过WebSocket发送到外部工具
- 在Yakit中编辑明文
- 调用JsRpc重新加密
- 发送修改后的请求
五、实战案例
案例:登录接口加密绕过
- 发现登录接口
/api/v1/login使用AES加密 - 注入JsRpc脚本拦截加密函数
- 捕获加密请求:
{"username":"user1","password":"123456"} - 修改为:
{"username":"admin","password":"admin123"} - 自动重新加密并发送
调试技巧
- 使用
console.log输出中间值 - 设置断点检查加密前后数据
- 保存不同版本的修改记录
六、常见问题解决
-
连接失败
- 检查WebSocket地址是否正确
- 验证CORS策略
- 确保注入脚本执行顺序正确
-
加密函数不生效
- 确认函数名称和上下文正确
- 检查原型链调用
- 验证函数是否被二次封装
-
性能问题
- 优化WebSocket消息大小
- 减少不必要的拦截
- 使用批量处理模式
七、高级应用
1. 自动化测试集成
import yakit
client = yakit.connect()
test_cases = [
{"input": "test1", "expected": "..."},
{"input": "test2", "expected": "..."}
]
for case in test_cases:
encrypted = client.jsrpc("encrypt", case["input"])
response = client.request("/api/test", body=encrypted)
decrypted = client.jsrpc("decrypt", response.body)
assert decrypted == case["expected"]
2. 多加密算法支持
// 多算法路由处理
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
let result;
switch(data.method) {
case "aes_encrypt":
result = aesEncrypt(data.params);
break;
case "rsa_encrypt":
result = rsaEncrypt(data.params);
break;
// ...
}
ws.send(JSON.stringify({id: data.id, result: result}));
};
八、安全注意事项
- 仅用于授权测试
- 测试完成后移除注入脚本
- 加密通信使用wss协议
- 敏感信息处理需谨慎
九、总结
JsRpc + Yakit热加载技术提供了一种高效处理前端加密请求的方案,相比传统方法具有以下优势:
- 无需完整逆向加密算法
- 实时交互式调试
- 支持复杂加密场景
- 集成化工作流
该技术特别适用于:
- 登录接口测试
- 敏感操作验证
- 加密协议分析
- 自动化安全测试