JSRPC使用方式
- 逆向目标
- 逆向过程
- 逆向分析
- 1、什么是 websocket
- 2、websocket的原理
- 3、总体过程
- 3.1 环境说明
- 3.2 python服务端代码
- 3.3 python客户端代码
- 4、Sekiro-RPC
- 4.1 执行方式
- 4.2 客户端环境
- 4.3 参数说明
- 4.4 SK API
- 4.5 python代码调试
- 4.6 代码注入流程
- 逆向总结
逆向目标
网址:https://www.jizhy.com/44/rank/school
接口:https://www.jizhy.com/open/sch/rank-list
加密参数:
- sign
- app_id
逆向过程
此目标网站前面已经分析过了,感兴趣的可以去我的主页看下具体的分析过程 大学竞争力2021排行榜, 本篇文章只介绍 rpc
的使用
逆向分析
要使用 rpc
必然要先了解websocket
1、什么是 websocket
- WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)
- 它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的
- Websocket是一个持久化的协议
2、websocket的原理
- websocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间能建立一个类似tcp的连接,从而方便它们之间的通信
- 在websocket出现之前,web交互一般是基于http协议的短连接或者长连接
- websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"
3、总体过程
- 首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;
- 然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;
- 最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。
3.1 环境说明
pip install websockets
3.2 python服务端代码
import asyncio
import websockets
# 接收客户端消息并处理,这里只是简单把客户端发来的返回回去
async def recv_msg(websocket):
while True:
recv_text = await websocket.recv()
response_text = f"your submit context: {recv_text}"
await websocket.send(response_text)
# 服务器端主逻辑
# websocket和path是该函数被回调时自动传过来的,不需要自己传
async def main_logic(websocket, path):
await recv_msg(websocket)
# 把ip换成自己本地的ip
start_server = websockets.serve(main_logic, '127.0.0.1', 8000)
# 如果要给被回调的main_logic传递自定义参数,可使用以下形式
# 一、修改回调形式
# import functools
# start_server = websockets.serve(functools.partial(main_logic, other_param="test_value"), '10.10.6.91', 5678)
# 修改被回调函数定义,增加相应参数
# async def main_logic(websocket, path, other_param)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
3.3 python客户端代码
import asyncio
import websockets
# 向服务器端发送认证后的消息
async def send_msg(websocket):
while True:
_text = input("please enter your context: ")
if _text == "exit":
print(f'you have enter "exit", goodbye')
await websocket.close(reason="user exit")
return False
await websocket.send(_text)
recv_text = await websocket.recv()
print(f"{recv_text}")
# 客户端主逻辑
async def main_logic():
async with websockets.connect('ws://127.0.0.1:8000') as websocket:
await send_msg(websocket)
asyncio.get_event_loop().run_until_complete(main_logic())
4、Sekiro-RPC
了解了上述内容之后我们就可以进入主题了,RPC 在逆向中,简单来说就是将本地和浏览器,看做是服务端和客户端,二者之间通过 WebSocket 协议进行 RPC 通信,在浏览器中将加密函数暴露出来,在本地直接调用浏览器中对应的加密函数,从而得到加密结果,不必去在意函数具体的执行逻辑,也省去了扣代码、补环境等操作,可以省去大量的逆向调试时间。对于业务时间比较急着上的项目可以作为一种临时方案。
官网地址:https://sekiro.iinti.cn/sekiro-doc/
4.1 执行方式
首先要有 Java
环境,服务安装有三种方式,具体安装教程参考sekiro安装教程
4.2 客户端环境
链接
4.3 参数说明
- 使用原理:客户端注入到浏览器环境,然后通过
SekiroClient
和Sekiro
服务器通信,即可直接RPC
调用浏览器内部方法官方提供的SekiroClient
代码样例如下:
// 连接服务端
var client = new SekiroClient("ws://127.0.0.1:5612/business-demo/register?group=rpc-test&clientId="+Math.random());
// 业务接口
client.registerAction("register",function(request, resolve, reject){
resolve(request['params']);
})
-
group:业务类型(接口组),每个业务一个
group
,group
下面可以注册多个终端(SekiroClient
),同时group
可以挂载多个Action
; -
clientId:指代设备,多个设备使用多个机器提供
API
服务,提供群控能力和负载均衡能力; -
SekiroClient:服务提供者客户端,主要场景为手机/浏览器等。最终的
Sekiro
调用会转发到SekiroClient
。每个client
需要有一个惟一的clientId
; -
registerAction:接口,同一个
group
下面可以有多个接口,分别做不同的功能; -
resolve:将内容传回给服务端的方法;
-
request:服务端传过来的请求,如果请求里有多个参数,可以以键值对的方式从里面提取参数然后再做处理。
4.4 SK API
Sekiro
为我们提供了一些 API
-
查看分组列表:http://127.0.0.1:5612/business-demo/groupList
-
查看队列状态:http://127.0.0.1:5612/business-demo/clientQueue?group=test
-
调用转发:http://127.0.0.1:5612/business-demo/invoke?group=test&action=test¶m=testparm
4.5 python代码调试
# encoding: utf-8
"""
@author: 夏洛
@QQ: 1972386194
@file: 测试.py
"""
import requests
params = {"group": "rpc-test",
"action": "register",
"params": "测试文本"
}
res = requests.get("http://127.0.0.1:5612/business-demo/invoke",params=params)
print(res.text)
4.6 代码注入流程
-
定位到具体的加密位置
-
注入RPC代码,使用注册后的
js脚本
替换原来的脚本
注入后观察控制台,发现连接成功
-
python请求
使用上面提供的python
代码去请求
逆向总结
以上就是 jsrpc
的介绍,希望能帮到大家,欢迎大家留言共同探讨 sekiro
的更多用法