【js逆向学习】极志愿 javascript+python+rpc

逆向目标

网址: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 参数说明
  • 使用原理:客户端注入到浏览器环境,然后通过 SekiroClientSekiro 服务器通信,即可直接 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:业务类型(接口组),每个业务一个 groupgroup 下面可以注册多个终端(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&param=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 的更多用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗雅颂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值