文章目录
目标网址: aHR0cHM6Ly93d3cuemhpcGluLmNvbS93ZWIvZ2Vlay9qb2I/cXVlcnk9JUU1JThEJThFJUU0JUI4JUJBJmNpdHk9MTAwMDEwMDAw
本文仅供参考学习,如有侵权,联系作者删。
分析必要参数
抓包目标网址
用 无痕 或者 清除所有cookies后,刷新页面(记得打开Preserve log)
使用 search 定位 到数据的请求包
寻找必要参数 – curl 尝试法
copy curl
先随便拿一个做一个模版。
推荐两个 curl 转 requests 网站
https://curlconverter.com/python/(第一次访问比较慢)
https://spidertools.cn/#/curl2Request(功能比较全)
复制代码直接运行
将curl转换出来的 requests代码直接运行,结果如下:
根据网站headers和cookies逐一排查
完整的请求:
headers 包含 accept,accept-language,cache-control,pragma,priority,referer…user-agent,…
coookise 包含 __g,wd_guid,historyState,Hm_lvt_194df3105ad7148dcf2b98a91b5e727a,…, _ _ zp_stoken _ _等等参数。
headers参数排除
一般观察 除了 UA 以外还有没有其他的有规律的字符串(有规律包括,16或者32为字符串(md5加密),AES加密的基本格式等,做多了就知道了)
显然没有,将headers 除 UA外所有的参数注释,依然会成功,如图:
- 说明headers没有加密参数。
cookies参数排除
cookies就比较重要了,建议一个一个值去排除,一个一个注释,然后运行,如果不出来值,就说明这个值可能存在问题(因为可能刚好测试到这个值,其他的cookies失效了,所以需要多刷新几次页面,复制curl,进行参数对比),或者用fidder的请求,去实现也行。
一个一个参数测试的步骤省略,最终确定,如果有**zp_stoken**这个值,就能够请求成功,如果没有,就请求失败。
- 这一步就已经确认了 加密参数 为__zp_stoken__。
参数定位(hook)
既然是cookies里面的,直接hook。(如果有不明白hook原理的,可以质询,如果问的人多,就专门写一期hook的讲解)
hook代码:
let cookieCache = "";
Object.defineProperty(document, "cookie", {
set: function (val) {
console.log("Hook set cookie => ", val);
if (val.indexOf("__zp_stoken__") !== -1) {
debugger;
}
cookieCache = val;
return val;
},
get: function () {
return cookieCache;
}
});
注意:先清除所有cookies再刷新页面,防止干扰
还有一件事,因为访问页面后,他会有两次页面刷新才会出现,每次刷新,都会更新所有函数,所以会将hook也更新掉,需要断点到第二次页面之后哦~
hook到的结果:
找堆栈
根据堆栈,一步一步找生成的位置。
很明显,如图所示
code = new ABC().z(seed, parseInt(ts) + (480 + new Date().getTimezoneOffset()) * 60 * 1000)
- 只要拿到 new ABC().z 这个方法 和 seed 和ts 就能出结果了。
ts 和 seed
是否还记得我们失败请求的返回结果:
没错,这里的seed和ts就是这两个,只要继续往上跟栈就能够发现,这里就不继续了,直接出结果了。
new ABC().z
如果你拿到这个现在会怎么办?扣代码?补环境?
这两个方法都可以解决,但是今天要讲的是 秒解法,RPC
有谁还不知道rpc怎么用的吗,如果有需要可以咨询,如果人多就单独出一期教程。
流程:
- 将 new ABC().z 方法 赋值给window全局
- 打开rpc软件
- 在浏览器上开接口
- python远程调用
秒了~
结果:
下课!!!