这里无法直接使用浏览器抓包,因为相同url的包会被覆盖掉,直接上 fiddler:
你如果用requests直接去请求的话,就会看到上图那一大坨混淆过后的js代码,使用的是sojson.v6
版本的混淆
分析一下正常的请求流程,第二个请求很关键,主要是构建正确的 wzwschallenge
参数,然后拼接url,才能拿到返回的 set-cookie
网站使用的是 CWAP-WAF
服务,随手百度了一下,是中国电子云
的一个防火墙服务
那么 wzwschallenge从哪里来呢,看了一下,网站没有其他的js请求,那么肯定就是从开头那一大坨混淆后的js代码里生成的,混淆后的代码太难看了,用AST插件还原一波
定位到这里
分析了一下,主要是和 _0x13698a、_0xcff1b8
两个函数有关,两个函数代码量也不大,我就直接用python还原算法了,当然扣下来直接运行js代码也行
代码整理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| import re import requests
from urllib.parse import quote
def get_confirm_label(seed: str, number: str): a = 0 for s in seed: a += ord(s) a *= int(number) a += 111111 return "WZWS_CONFIRM_PREFIX_LABEL" + str(a)
def get_challenge(label): seed = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" length = len(label) challenge = "" i = 0
while i < length:
a = ord(label[i]) & 255 i += 1 if i == length: challenge += seed[a >> 2] challenge += seed[(a & 3) << 4] challenge += "==" break
b = ord(label[i]) i += 1 if i == length: challenge += seed[a >> 2] challenge += seed[(a & 3) << 4 | (b & 240) >> 4] challenge += seed[(b & 15) << 2] challenge += "=" break
c = ord(label[i]) i += 1 challenge += seed[a >> 2] challenge += seed[(a & 3) << 4 | (b & 240) >> 4] challenge += seed[(b & 15) << 2 | (c & 192) >> 6] challenge += seed[c & 63]
return challenge
def main(): bank_url = "http://www.pbc.gov.cn/zhengcehuobisi/125207/125217/125925/index.html" session = requests.session() raw_text = session.get(bank_url).text href = re.search(r"_0x500dd8='(.+?)';", raw_text).group(1) seed = re.search(r"_0x14e579='(.+?)';", raw_text).group(1) number = re.search(r"_0x351708='(.+?)';", raw_text).group(1) label = get_confirm_label(seed, number) challenge = get_challenge(label) print("生成的wzwschallenge为:" + challenge) redirect_url = f"http://www.pbc.gov.cn{href}?wzwschallenge={challenge}" print("拼接后的url为:" + redirect_url) res = session.get(redirect_url) print(res.content.decode()[:500])
if __name__ == '__main__': main()
|
运行,成功拿到正常的网页: