js逆向实战之中国男子篮球职业联赛官方网站返回数据解密
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"))
运行结果如下:
