破解響應(yīng)加密:Python 與 JS 逆向結(jié)合的最佳實(shí)踐

大家好,我是安果!
有些網(wǎng)站為了增強(qiáng)數(shù)據(jù)的安全性,針對(duì)接口的響應(yīng)值做了一層加密,這樣我們沒法直接通過接口調(diào)用獲取有效的數(shù)據(jù)
面對(duì)這種情況,我們需要分析源碼,找到前端的解密邏輯,使用 Python 改寫一下即可
本篇文章將通過一個(gè)簡(jiǎn)單的實(shí)例進(jìn)行講解
目標(biāo)對(duì)象:
aHR0cHM6Ly93d3cuaGFuZ2hhbmdjaGEuY29tL2luZHVzdHJ5
具體操作步驟如下:
1-1 安裝依賴
# 安裝依賴
pip3 install pycryptodome
1-2 分析加密邏輯
打開目標(biāo)網(wǎng)站,通過關(guān)鍵字搜索數(shù)據(jù)報(bào)告,發(fā)現(xiàn)響應(yīng)中的 data 值是加密的

由于關(guān)鍵字 data 不易于全局查找解密邏輯,這里使用關(guān)鍵字 decrypt 在 Source 面板全局進(jìn)行查詢(Ctrl+Shift+F)

然后在上面搜索到的所有代碼塊處都新增一個(gè)斷點(diǎn),通過通過搜索再次觸發(fā)一次請(qǐng)求,定位到下面的解密邏輯
我們發(fā)現(xiàn)解密使用的是: AES(對(duì)稱加密),模式是 ECB,填充方式為 Pkcs7,另外密鑰 key 通過調(diào)試也能拿到

1-3 AES 解密(Python)
首先,利用 Python 實(shí)現(xiàn) AES 的解密邏輯
import requests
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
class AESObject(object):
def __init__(self, block_size=16):
self.__block_size = block_size
# AES解密
def aes_decrypt(self, padding: str, content: str, key: str, mode, *args):
key = key.encode('utf-8')
aes = AES.new(key, mode, *args)
content = base64.b64decode(content)
# 解密
content_raw = aes.decrypt(content).decode('utf-8')
if padding == 'zero':
return content_raw
pad_ = ord(content_raw[-1])
return content_raw[:-pad_]
然后,通過請(qǐng)求獲取加密內(nèi)容,調(diào)用上面的方法進(jìn)行解密
def get_info():
url = "https://**/hhc/industry/articleWithTags?filter=%7B%22title%22%3A%221%22%2C%22keyword%22%3A%221%22%2C%22sortType%22%3Anull%2C%22limit%22%3A9%2C%22skip%22%3A0%2C%22userId%22%3A4220972%7D"
payload = {}
headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Auth-Plus': '',
'Connection': 'keep-alive',
'Origin': 'https://**',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-site',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'clientInfo': 'web',
'clientVersion': '1.0.2',
'currentHref': 'https://**/industry',
'sec-ch-ua': '"Not.A/Brand";v="8", "Chromium";v="114", "Google Chrome";v="114"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'Cookie': '登錄后獲取的ck'
}
# 加密內(nèi)容data
data = requests.request("GET", url, headers=headers, data=payload).json()['data']
# AES加密
key = '調(diào)試拿到的key'
aESObject = AESObject(block_size=16)
# 解密
data_de = aESObject.aes_decrypt('pkcs7', data, key, AES.MODE_ECB)
print(data_de)
PS:這里只針對(duì)填充方式為 Pkcs7 做了處理,如果為其他填充模式,可以自行進(jìn)行改寫
如果你覺得文章還不錯(cuò),請(qǐng)大家 點(diǎn)贊、分享、留言 下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
END
