第一题
本题链接:http://match.yuanrenxue.com/match/1
1.分析请求
标红处为加密参数,全局搜索api/match/1,如下图:
将上图中黄色js代码复制到记事本,并整理出含有api/match/1的js代码块,代码美化后如下:
美化工具:http://tool.yuanrenxue.com/deobfuscator
上图为部分核心代码,可知m参数来源于oo0O0这个函数+window.f,故下一步就是找到它们,
同上一步在搜索oo0O0,然后美化如下:
发现这个方法内部定义了些变量,方法,但是它的最后两句很可疑,一是因为eval函数并且只有这儿用到了传来的mw参数,二是因为return ’ ', 让m只与window.f有关,于是乎大胆猜想是这个函数内部在修改window.f的值,在控制台打印window.f
果然就是加密的参数,在控制台打印atob(window[‘b’]),得到如下,一段被混淆的js代码
美化后得到一段很长的js代码,以下为部分核心代码截图:
终于找到window.f的生成参数,正常情况我们只需要扣js代码执行就完成了,但是可以看到mwqqppz这个参数在这段函数中从未定义过,就拿来用了,顿时陷入沉思,别急我们继续打印eval中的的参数:
由于用到的J函数于是在控制台执行J函数定义的相关代码:
接着依次打印:[J(‘0x0’, ‘]dQW’)] 和 J(‘0x1’, ‘GTu!’) 和 ‘\x27’
于是eval(atob(window[‘b’])[J(‘0x0’, ‘]dQW’)](J(‘0x1’, ‘GTu!’), ‘\x27’ + mw + ‘\x27’)),这段代码将可以改写为eval(’*mwqqppz*‘).replace(‘mwqqppz’,‘mw’) ),其中*代表其他代码,意思就是将代码字符中mwqqppz替换成mw,然后再用eval执行,如果对eval不熟的,自行查询eval用法哦。
至此终于明白就是将最开始的一个跟时间戳相关的参数(注意我说的是相关的参数,而不是时间戳)带到hex_md5中执行即可,可以使用node,也可以使用python的execjs库调用js,不过实测node要快一点
2.总结
核心:不是什么js混淆,二是敏锐的洞察力
第二题
1.分析请求:
可知cookie中m为加密的,如果你的cookie不只有m还有其他,直接去application中clear掉所有cookie,避免其他参数干扰,刷新再次访问。
与下面这个请求中就差一个cookie参数,应该是前面的请求返回值代码生成了cookie
2.postman请求
postman模拟这个不带cookie的请求,得到一段混淆代码:
用网站自带的工具:http://tool.yuanrenxue.com/decode_obfuscator美化代码:
搜索document[‘cookie’] 或者document.cookie,定位到加密处:
接下来就是扣相关的js代码获得加密参数m,带入到请求中
3.写在后面
这里为啥要用postman再去+模拟请求呢,因为这个请求chrome不能加载返回值啊,我就想看看它到底返回了啥,并且它是不带cookie的,万一它就返回一段加密的js呢
4.总结
核心:经验,洞察力,猜想力
第三题
1.没啥说的直接上代码
import requests
from collections import Counter
"""
猿人学第三题
"""
# 最恶心的一点是服务器会校验请求头顺序 还是有使用session保持会话
# headers = {
# 'Connection': 'keep-alive', # 这里和第二行换了位置
# 'Host': 'match.yuanrenxue.com',
# 'Content-Length': '0',
# # 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
# 'User-Agent': 'yuanrenxue.project',
# 'Accept': '*/*',
# 'Origin': 'http://match.yuanrenxue.com',
# 'Referer': 'http://match.yuanrenxue.com/match/3',
# 'Accept-Encoding': 'gzip, deflate',
# 'Accept-Language': 'zh-CN,zh;q=0.9'
# }
headers = {
'Host': 'match.yuanrenxue.com',
'Connection': 'keep-alive',
'Content-Length': '0',
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
'User-Agent': 'yuanrenxue.project',
'Accept': '*/*',
'Origin': 'http://match.yuanrenxue.com',
'Referer': 'http://match.yuanrenxue.com/match/3',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
# 利用字典统计申请号出现次数
dic = {}
url = "http://match.yuanrenxue.com/logo"
session = requests.session()
session.headers = headers
for page in range(1, 6):
session.post(url)
url2 = "http://match.yuanrenxue.com/api/match/3?page=" + str(page)
response = session.get(url2).json()
for data in response['data']:
value_ = data['value']
if value_ not in dic:
dic[value_] = 1
else:
dic[value_] += 1
print(dic)
print(Counter(dic).most_common(1)[0][0])
# 故答案为: 8717
2.总结
核心:使用requests的session来保持会话,而不是直接用requests去访问
第四题
1.分析请求
可以看到返回值的中一些值生成j_key,然后用jquery对象找到类名为j_key的值的元素并设置为隐藏,剩下的不就是所要的数字了吗,我们顺着这条思路走下去
2.分析页面结构
看到img标签数量不一