这里无法直接使用浏览器抓包,因为相同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()


运行,成功拿到正常的网页: