本文纯粹作学习探讨用,不作其他用途。
目标网站:某建筑市场监督网站
目标:获取5页数据
一、抓包
进入网站,打开F12,翻页,找到接口,但返回的是一串密文:
查看该调用堆栈,看到有value字样,点进去,再往上找,发现有类似“json.parse”的字样。
二、寻找加密函数
在网站加密过程中,一般可以通过查找:encrypt, decrypt, password, sign, json.parse等等,来定位到加密函数,我们在这边打个断点,看下是否会断下:
发现在这里确实断住了,而且t里面的data显示的和我们要破解的加密内容是类似的,猜测这个函数h就是加密函数:
进到函数h里面,发现了熟悉的aes身影:
这样就可以确定,h就是加密函数, 加密方式是AES,模式是CBC,偏移量是m,而我们要的结果就在return中:r.toString():
三:写代码
这个代码还是比较简单的,基本思路是:向网站发起请求,拿到加密的结果,用js逆向解密获得明文取得真实信息:
# 生成解密用的sdk
function jzsc_sdk(t) {
var cryptojs = require('crypto-js');
var f = cryptojs.enc.Utf8.parse("jo8j9wGw%6HbxfFn"),
m = cryptojs.enc.Utf8.parse("0123456789ABCDEF"),
e = cryptojs.enc.Hex.parse(t),
n = cryptojs.enc.Base64.stringify(e),
a = cryptojs.AES.decrypt(n, f, {
iv: m,
mode: cryptojs.mode.CBC,
padding: cryptojs.pad.Pkcs7
}),
r = a.toString(cryptojs.enc.Utf8);
return r.toString()
}
# 发起请求,获取真实信息
import requests
import execjs
def get_encrpyted_data(page):
session = requests.session()
url = f'https://jzsc.mohurd.gov.cn/api/webApi/dataservice/query/comp/list?pg={page}&pgsz=15&total=450'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
'Host': 'jzsc.mohurd.gov.cn',
'Referer': 'https://jzsc.mohurd.gov.cn/data/company'
}
encrypted_data = session.get(url=url, headers=headers).text
return encrypted_data
def get_decrpyted_data(encrypted_data):
with open('65_jzsc.js', 'r', encoding='utf-8') as f:
js_text = f.read()
decrpyted_data = execjs.compile(js_text).call('jzsc_sdk', encrypted_data)
return decrpyted_data
def main():
for p in range(5):
print(f'打印第{p+1}页数据')
encrpyted_data = get_encrpyted_data(p)
decrpyted_data = get_decrpyted_data(encrpyted_data)
print(decrpyted_data)
if __name__ == '__main__':
main()
四、结果展示