js逆向實戰之中國男子籃球職業聯賽官方網站返回資料解密

死不悔改奇男子發表於2024-04-27

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即可。

相關文章