使用JSRPC实现前端加密破解,自动化加密
字数 1122 2025-08-19 12:41:20
JSRPC实现前端加密破解与自动化加密教学文档
一、前言
前端加密是网站安全防护的重要手段,传统破解方法需要逆向JS代码、提取加密函数并补全运行环境。JSRPC(JavaScript Remote Procedure Call)提供了一种更高效的解决方案,通过远程调用浏览器中的JS加密函数,无需深入分析加密逻辑。
二、JSRPC核心原理
- 远程调用协议:本地代码通过WebSocket与浏览器建立连接
- 函数调用机制:直接调用浏览器中已加载的加密函数
- 环境优势:利用浏览器完整的JS执行环境,避免补环境问题
三、实现流程详解
1. 准备工作
- 识别加密参数(以人人网为例):
- appKey:固定值
- password:MD5加密
- callId:时间戳
- sig:需要破解的主要加密参数
2. 服务端实现
基础版本服务端代码
import sys
import asyncio
import websockets
async def receive_message(websocket):
while True:
send_text = input("请输入要加密的字符串:")
if send_text == "exit":
print("退出!")
await websocket.send(send_text)
await websocket.close()
sys.exit()
else:
await websocket.send(send_text)
response_text = await websocket.recv()
print("加密结果:", response_text)
start_server = websockets.serve(receive_message, "127.0.0.1", 8088)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
改进版服务端代码(支持多连接)
import asyncio
import websockets
connected = set()
async def server(websocket):
connected.add(websocket)
try:
async for message in websocket:
for conn in connected:
if conn != websocket:
await conn.send(message)
finally:
connected.remove(websocket)
start_server = websockets.serve(server, "127.0.0.1", 8088)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
3. 浏览器端JS改写
- 打开Chrome开发者工具(F12)
- 选择Sources → Overrides → Select folder for Overrides
- 创建并选择用于存放改写JS的文件夹
- 找到目标JS文件,右键选择Override content
- 添加WebSocket客户端代码:
(function () {
var ws = new WebSocket("ws://127.0.0.1:8088")
var secretKey = "bcceb522717c2c49f895b561fa913d10" // 关键密钥
ws.onmessage = function(evt) {
console.log("收到消息:" + evt.data);
var dataObject = JSON.parse(evt.data);
if (evt.data == "exit"){
ws.close();
}else{
ws.send(ze.getSign(dataObject,secretKey)); // 调用加密函数
}
}
})();
4. 自动化加密接口实现
import asyncio
import json
import websockets
from flask import Flask,request
app = Flask(__name__)
loop = asyncio.get_event_loop()
async def encode(message):
async with websockets.connect("ws://127.0.0.1:8088") as websocket:
await websocket.send(message)
return await websocket.recv()
def get_encrypt(message):
return str(loop.run_until_complete(encode(message)))
@app.route('/encrypt', methods=['POST'])
def encode_str():
if request.is_json:
data_dict = {}
data = request.get_json()
data_dict['user'] = data.get('user')
data_dict['password'] = data.get('password')
data_dict['appKey'] = data.get('appKey')
data_dict['sessionKey'] = data.get('sessionKey')
data_dict['callId'] = data.get('callId')
dataobject = json.dumps(data_dict)
return get_encrypt(dataobject)
if __name__ == '__main__':
app.run(port=5001)
四、实际应用流程
- 启动WebSocket服务端
- 启动Flask加密接口服务
- 在浏览器中加载目标网站并覆盖JS文件
- 通过Burp Suite构造请求:
- 将加密参数提交到本地加密接口(http://127.0.0.1:5001/encrypt)
- 接口返回加密结果
- 使用加密结果完成请求
五、相关工具推荐
-
Sekiro RPC框架
- 多语言支持
- 分布式架构
- 网络拓扑无关
- GitHub: https://github.com/yint-tech/sekiro-open
-
JsRPC项目
- 专门用于JS远程调用
- GitHub: https://github.com/jxhczhl/JsRpc
六、关键注意事项
- 密钥处理:确保浏览器端JS中正确设置了secretKey等关键参数
- 函数调用:准确识别并调用目标加密函数(如示例中的ze.getSign)
- WebSocket连接:保持服务端和客户端的端口一致
- 跨域问题:所有服务建议在localhost环境下运行以避免跨域限制
- 加密参数结构:确保传递给加密函数的数据结构与原网站一致
七、扩展应用
- 批量自动化测试:结合爬虫实现大规模数据加密
- 动态参数处理:处理时间戳等动态变化的参数
- 多站点适配:通过配置不同的加密函数和参数适应不同网站
通过以上方法,可以高效地破解前端加密而无需深入分析加密算法,显著提高渗透测试效率。