url:https://www.swguancha.com/home/city-detail?code=310100
分析过程
-
抓数据包,发现回显数据是加密字符串。
-
对于这种回显数据解密,大概率通过拦截器实现,搜索
interceptors
。
-
只需关注响应拦截器,一共两处。
- 第一处,只是对字符串的弹出和插入操作,不是。
- 第二处,可以看到
decrypt
和AES
关键字了,解密逻辑就在这里了。
-
打断点,刷新界面。
看下t.data
,key
,iv
和mode
的值。
t.data
就是数据包的回显数据。
key=n=u.enc.Utf8.parse(l)
,l
是在上面定义的常量。
mode
通过mode: u.mode.ECB
可得到是ECB模式。
iv
就不需要了。 -
编写python代码获取数据。
import requests
from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64
url = "https://app.swguancha.com/client/v1/cPublic/consumer/property/type/search?level=2"
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", "Referer": "https://www.swguancha.com/"})
mi_str = resp.text.replace(" ", "") # 响应数据有空格,需进行处理
key = "QV1f3nHn2qm7i3xrj3Y9K9imDdGTjTu9".encode("utf-8")
aes = AES.new(key=key, mode=AES.MODE_ECB)
ming_str = aes.decrypt(base64.b64decode(mi_str))
ming_str = unpad(ming_str, 16)
print(ming_str.decode("utf-8"))
运行结果如下
- 也可以通过python调用js的代码实现。
var CryptoJS = require("crypto-js");
var l = "QV1f3nHn2qm7i3xrj3Y9K9imDdGTjTu9";
function decrypt(t) {
var n = CryptoJS.enc.Utf8.parse(l)
, r = CryptoJS.AES.decrypt(t, n, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
, i = r.toString(CryptoJS.enc.Utf8)
, s = JSON.parse(i);
return s;
}
from functools import partial
import subprocess
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")
import requests
import base64
import execjs
url = "https://app.swguancha.com/client/v1/cPublic/consumer/property/type/search?level=2"
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", "Referer": "https://www.swguancha.com/"})
mi_str = resp.text.replace(" ", "") # 响应数据有空格,需进行处理
file_object = open("解密.js", mode="r")
exec_code = file_object.read()
exec_js = execjs.compile(exec_code)
res = exec_js.call("decrypt", mi_str)
print(res)
运行结果如下