RPCNB
1、首先,先分析第20题,请求一下,看看需要什么东西
明显的sign,t也可以看得出来是时间戳
接着跟进,
定位到这里
可以看到t确定是时间戳,sign通过window.sign方法计算的,打一个断点,再次点击下一页
跟进这个方法,
看到 getStringFromWasm0 就知道是wasm了,扣具体太麻烦了,我们上RPC
首先搭建websocket的服务端
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, "localhost", 5000)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
这时候上我们的JS代码,连接我们的服务端,WebSocket的onopen方法是加载的时候调用的,onmessage方法是接收到参数后调用的,
观察到sign的生成方法为:
window.sign(window.page + '|' + t.toString()),
所以,我们改写成如下方法:
!(function () {
var ws = new WebSocket('ws://localhost:5000');
ws.onopen = function (evt) {
console.log('Connection open ...');
};
ws.onmessage = function (evt) {
console.log(evt.data)
t = Date.parse(new Date());
var sign = window.sign(evt.data.toString() + '|' + t.toString())
ws.send(sign);
};
})();
ws.send是将生成的参数返回给我们
我们将命令输入控制台:
可以发现正常Hook,这时候编写接受参数
import asyncio
import websockets
loop = asyncio.get_event_loop()
async def hello(message):
# 连接 websocket 并发送消息 获取相应
async with websockets.connect("ws://localhost:5000") as websocket:
await websocket.send(message)
return await websocket.recv()
def get_encrypt(message):
return str(loop.run_until_complete(hello(message)))
if __name__ == "__main__":
print(get_encrypt(str("1")))
我们测试一下
正常输出结果,我们查看一下浏览器
可以发现接受到了我们传递的参数 1,
这时候,就可以编写代码了,
import time
import requests
from client import get_encrypt #引入请求rpc的方法
count = 0
for page in range(1, 6):
sign = get_encrypt(str(page))
ts = str(int(time.time() * 1000))[:-3] + "000"
url = "https://match.yuanrenxue.com/api/match/20".format(page, sign, ts)
data = {
"page": page,
"sign": sign,
"t": ts,
}
payload = {}
headers = {
'User-Agent': 'yuanrenxue.project',
}
cookie = {
"sessionid": "你的sessionid"
}
response = requests.request("GET", url, headers=headers, params=data, cookies=cookie)
for tt in response.json()["data"]:
jishu = int(tt["value"])
count +=jishu
print(count)
我们测试一下
正常请求出结果,再看看浏览器
完成,此种方法对于部分网站还是比较实用的。但是真正锻炼技术的方法不仅仅是如此,此种方法只是单独为了拿到结果测试,不推荐使用此方法进行。