前言
当我们遇到一些前端加密的时候,通常我们会去逆向JS,找到加密函数,然后使用burp插件或者python实现加密,这样我们还需要扣一些细节去补环境,下面介绍利用JSRPC的方法(只需要找到加密函数)实现加密
JSRPC就是远程调用协议,简单来说就是我们可以本地编写代码去调用浏览器的JS加密函数,我们就不需要去考虑函数的具体逻辑了
实现过程
这里经过测试,其中appKey是固定的,password为md5加密,callId是时间戳,我们只需要获取sig值就可以
经过测试后发现sig的加密函数在这里,我们只需要s和r.secretKey,s就是需要加密的字段,控制台可以直接打印出格式,后面的为固定值
我们先用编写一下服务端的代码,用来输入待加密的字符串,交给浏览器去加密并传回来打印
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()
弹出的界面选择允许就好
然后添加我们的websocket客户端代码,Ctrl+s保存就好
(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); // 将字符串转换为js对象
if (evt.data == "exit"){
ws.close();
}else{
ws.send(ze.getSign(dataObject,secretKey));//加密后发给服务端,dataObject就是s
}
}
}
)();
进行自动加密
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", 8089)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
import asyncio
import json
import websockets
from flask import Flask,request
app = Flask(__name__)
loop = asyncio.get_event_loop()
async def encode(message):
# 连接 websocket 并发送消息 获取相应
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)))
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)
这里启动好两个脚本,我们使用burp构造一下数据包来提交到加密接口即可实现自动加密,burp有个插件(autodecode)可以联合使用,具体可以自行百度
SEKIRO是一个多语言的、分布式、网络拓扑无关的服务发布平台,通过书写各自语言的handler将功能发布到中心API市场,业务系统通过 RPC的方式使用远端节点的能力
原文始发于微信公众号(起凡安全):使用JSRPC实现前端加密破解,自动化加密
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论