目录
声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,相关网址和数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!若有侵权,请联系删除!
前言
- 网址:94ca6772640973d1ef3bcdbfbfd139f5
- 加密接口:3e0eb11c3e9b9b02d928daeeda83b26c
抓包分析
不能避免的第一步,先按F12打开控制台。因为这个网站可以翻页,所以我们可以点击下一页进行接口触发
然后找到带有数据的接口
很明显,数据就藏在data里。接下来,我们依次对请求头->查询参数->响应->cookie进行分析
1->请求头
点开标头,找到请求标头,可以看到其中Signature、Token、X-Token都是一些不常见的参数,并且可以惊奇的发现是不带cookie的哈哈哈,也是非常的友好啊,直接就是省去一步,接下来分析这三个参数·
- Signature:多找几个接口观察请求头可以发现它竟然是不变的,那么它就是写死的
- Token:可以看到它的值为null,多找几个接口观察请求头可以发现也是如此,所以它也是写死的
- X-Token:多找几个接口观察请求头可以发现,它是在动态变化的,所以百分之九十九点九它要进行逆向分析
2->查询参数
上面同样的套路,可以发现flag是不变的,而page明显是翻页的页码,per_page也是不变的,timestamp是时间戳,这个要进行逆向
3->响应和cookie
前面分析已经知道,cookie是不用带的,所以不用管,而响应的数据里也没有进行加密,也不用管,又省事啦
所以,本次逆向目标参数:X-Token、timestamp
逆向分析
X-Token参数
加密位置定位的方式有很多种,因为X-Token参数名比较少见,所以可以通过关键字搜索来定位,用shift+ctrl+f打开搜索,输入X-Token
很好,可以发现只有一个文件出现了这个参数,接下来我们点进去,打上断点,重新触发接口,如果能够断住,那么就说明我们定位成功了
可以看到成功断住了,并且前面有我们要的timestamp,继续跟X-Token参数,进入到B方法中,打上断点
可以看到,这是一个md5算法,但不知道是不是标准的,此时我们可以调用这个方法用‘1’进行测试
可以发现,这个算法加密的结果和标准算法加密的结果一致,那它就是一个标准的md5算法,省下了扣代码的步骤,接下来只需要分析传递的参数就完事了,回到一开始的断点
可以看到这里的e就是传递的参数,我们现在分析一下它:
e = 'api/product/getproductsearch?flag=top&page=4&per_page=12×tamp=1714562258107&key=6rnrdpjjv6wz2sspxqeibesov1itxddc'
// api/product/getproductsearch? -> 接口
// flag=top&page=4&per_page=12×tamp=1714562258107 -> 参数
前面两部分是可以直接得到的,接下来看一下后面那部分key
这里的Xi是前面写死的,所以我们也可以直接写死,到这里,可以说逆向已经完成了,接下来看一下代码的实现
Js实现
var crypto = require('crypto-js')
let timestamp = (new Date).getTime()
e = 'api/product/getproductsearch?flag=top&page=4&per_page=12×tamp=1714562258107&key=6rnrdpjjv6wz2sspxqeibesov1itxddc'
console.log(crypto.MD5(e).toString());
成功加密
Python调用
这里只展示部分代码
import requests
import execjs
with open('./2.加密.js', 'r', encoding='utf-8') as f:
js_code = execjs.compile(f.read())
headers = {
}
url = "pass"
params = {
"flag": "top",
"page": "2",
"per_page": "12",
"timestamp": "1714298967230"
}
result = js_code.call('get_data', 2)
params['timestamp'] = result['timestamp']
headers['x-token'] = result['pwd']
response = requests.get(url, headers=headers, params=params)
print(response.text)
print(response)
正确返回数据