篇幅有限
完整内容及源码关注公众号:ReverseCode,发送 冲
题目
https://match.yuanrenxue.com/match/5
抓包
cookie有两种获取方式,一种是服务器返回,一种是本地js生成。
60秒后点击下一页弹窗cookie已失效,并刷新网页,导致之前设置的断点或者hook被清掉,重新发起请求。
https://match.yuanrenxue.com/api/match/5?m=1631326686273&f=1631326686000
m和f明显就是时间戳,cookie中Hm开头的是浏览器设置的,主要关注m
和RM4hZBv0dDon443M
的内容。通过搜索m的值发现从一开始没有返回突然就出现了该cookie,即本地js生成的cookie,也有可能chrome看不到某些请求的preview返回的数据,RM4hZBv0dDon443M
同理。
题目中表明了cookie只有50秒的有效期,不会再次生成了,因为如果每次请求都重新生成, 肯定是一直有效的了,大概是失效之后,带着该cookie重新reload网页请求时计算cookie才重新生成。
分析
每次刷新后只会刷新到第一页,搜索cookie已失效
,发现location.reload()
不论本地是否缓存js或css都会重新请求,彻底刷新。
搜索RM4hZBv0dDon443M又搜不到,有可能字符串拼接或混淆了,搜索m =
,m=
,m:
匹配条数太多,搜索cookie
出现位置也很多,再通过回溯定位request方法
该调用栈中只有m和f的定义,未出现cookie的定义位置
只好再次通过hook找到document.cookie在赋值前注入进去我们的js,直接注入是无法注入的,因为网页刷新会清除cookie,所以需要先找到在网页已经刷新但是还没有加载cookie发送请求之前的断点。
清除页面cookie,刷新页面后,进入该断点
1 | (function () { |
如果找不到该断点的时候,即部分请求一开始就加载了该cookie,可以通过fd正则匹配地址添加hook
过了多次debugger后直到遇到val有值的时候,根据右侧调用栈回溯
第二层时发现该js是动态生成的虚拟js,且RM4hZBv0dDon443M
被分割成一个一个字母,所以搜不到,而_0x4e96b4
就是window对象,
接下来再通过hook找到window._$ss
赋值的地方
1 | (function () { |
看到mode
,padding
31:04