url:https://www.cbaleague.com/data/#/teamMain?teamId=29124
分析过程
-
看流量包,返回数据全是加密的字符串,要做的就是解密回显数据。
-
由于这里的网址都比较特殊,里面都带有id号,所以通过url关键字去搜索不是一个很好的办法。
-
看initiators,里面有很多异步传输。
-
异步传输中,如果想对数据进行加解密,有一个比较常用的方法,拦截器(interceptors),此处我们可以通过搜索
interceptors
来定位。
-
总共有5处,一处一处判断。
- 第一处只是new了两个对象,肯定不是。
- 第二处,第三处中,
unshift
和push
函数是js中对字符串进行插入字符的函数,肯定也不是加密过程。
- 第四处是响应拦截器,第五处是请求拦截器,请求拦截器大概率是加密逻辑,响应拦截器大概率是解密逻辑,且不是js中的原生代码,要找的地方基本上没跑了。
-
由于是对响应数据进行解密,所以在响应拦截器中打断点,进行调试。
看看e
的值。
e.data
就是响应的加密数据,所以bx
函数就不需要看了,直接看$6e
函数。 -
定位函数。
-
在这段代码中可以看到关键词
AES
,不用想肯定是AES算法了。想要AES解密的话,需要知道key
,mode
,如果mode
是CBC
还需要知道iv
,如果mode
是ECB
就不需要知道iv
。打断点,看下key
,mode
,iv
是什么。
mode
为AES.ECB
,就不需要iv
了。
r
就是key
,r = tp.enc.Utf8.parse(t)
就是将t
进行utf8编码后赋值给r
。
-
AES算法的三要素都知道了,就可以编写python代码进行解密了。(这里还需要当心回显数据是经过base64编码的,所以在解密之前需要先进行base64解码)
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad, pad
import requests
import base64
url = "https://data-server.cbaleague.com/api/teams/29124/seasons/2023/players"
resp = requests.get(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, " \
"like Gecko) Chrome/123.0.0.0 Safari/537.36"})
mi_str = base64.b64decode(resp.text)
key = "uVayqL4ONKjFbVzQ".encode("utf-8")
aes_encrypt = AES.new(key=key, mode=AES.MODE_ECB)
plaintext = aes_encrypt.decrypt(mi_str)
plaintext = unpad(plaintext, 16)
print(plaintext.decode("utf-8"))
运行结果如下: