js逆向实战之中国男子篮球职业联赛官方网站返回数据解密

url:https://www.cbaleague.com/data/#/teamMain?teamId=29124

分析过程

  1. 看流量包,返回数据全是加密的字符串,要做的就是解密回显数据。
    image

  2. 由于这里的网址都比较特殊,里面都带有id号,所以通过url关键字去搜索不是一个很好的办法。
    image
    image

  3. 看initiators,里面有很多异步传输。
    image

  4. 异步传输中,如果想对数据进行加解密,有一个比较常用的方法,拦截器(interceptors),此处我们可以通过搜索interceptors来定位。
    image

  5. 总共有5处,一处一处判断。

  • 第一处只是new了两个对象,肯定不是。
    image
  • 第二处,第三处中,unshiftpush函数是js中对字符串进行插入字符的函数,肯定也不是加密过程。
    image
  • 第四处是响应拦截器,第五处是请求拦截器,请求拦截器大概率是加密逻辑,响应拦截器大概率是解密逻辑,且不是js中的原生代码,要找的地方基本上没跑了。
    image
  1. 由于是对响应数据进行解密,所以在响应拦截器中打断点,进行调试。
    image
    看看e的值。
    image
    e.data就是响应的加密数据,所以bx函数就不需要看了,直接看$6e函数。

  2. 定位函数。
    image

  3. 在这段代码中可以看到关键词AES,不用想肯定是AES算法了。想要AES解密的话,需要知道keymode,如果modeCBC还需要知道iv,如果modeECB就不需要知道iv。打断点,看下keymodeiv是什么。
    modeAES.ECB,就不需要iv了。
    image
    r就是keyr = tp.enc.Utf8.parse(t)就是将t进行utf8编码后赋值给r
    image

  4. 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"))

运行结果如下:
image

总结:这个网站采用的都是同一种算法,如果想要解密其他url的数据,只需要修改代码中的url即可。

posted @ 2024-04-27 17:50  死不悔改奇男子  阅读(20)  评论(0编辑  收藏  举报