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"))
執行結果如下: