破解响应加密:Python 与 JS 逆向结合的最佳实践
AirPython
共 5292字,需浏览 11分钟
·
2023-07-28 11:51
大家好,我是安果!
有些网站为了增强数据的安全性,针对接口的响应值做了一层加密,这样我们没法直接通过接口调用获取有效的数据
面对这种情况,我们需要分析源码,找到前端的解密逻辑,使用 Python 改写一下即可
本篇文章将通过一个简单的实例进行讲解
目标对象:
aHR0cHM6Ly93d3cuaGFuZ2hhbmdjaGEuY29tL2luZHVzdHJ5
具体操作步骤如下:
1-1 安装依赖
# 安装依赖
pip3 install pycryptodome
1-2 分析加密逻辑
打开目标网站,通过关键字搜索数据报告,发现响应中的 data 值是加密的
由于关键字 data 不易于全局查找解密逻辑,这里使用关键字 decrypt 在 Source 面板全局进行查询(Ctrl+Shift+F)
然后在上面搜索到的所有代码块处都新增一个断点,通过通过搜索再次触发一次请求,定位到下面的解密逻辑
我们发现解密使用的是: AES(对称加密),模式是 ECB,填充方式为 Pkcs7,另外密钥 key 通过调试也能拿到
1-3 AES 解密(Python)
首先,利用 Python 实现 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_]
然后,通过请求获取加密内容,调用上面的方法进行解密
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'
}
# 加密内容data
data = requests.request("GET", url, headers=headers, data=payload).json()['data']
# AES加密
key = '调试拿到的key'
aESObject = AESObject(block_size=16)
# 解密
data_de = aESObject.aes_decrypt('pkcs7', data, key, AES.MODE_ECB)
print(data_de)
PS:这里只针对填充方式为 Pkcs7 做了处理,如果为其他填充模式,可以自行进行改写
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
END
评论