本文说明:学习笔记整理,仅供学习参考~~
云锁WAF是什么?
云锁 技术作为新型安全防护机制,通过其动态验证、行为监控等特性,为服务器安全提供了多维度的解决方案。尤其在处理DDoS攻击、密码爆破等高频安全事件时,展现出显著的技术优势。现代云锁 系统采用的指纹识别技术已突破静态特征值对比的局限。通过采集 设备硬件特征、操作系统行为模式、网络交互特征的三重数据维度,构建动态验证模型。云锁WAF采用双重验证机制 来识别真实浏览器与爬虫程序:

实战案例分析
示例一:烟草市场(云锁WAF)
目标网站 :中国烟草市场(etmoc.com)
防护类型:云锁WAF(双重跳转验证)
场景描述
该网站用于展示烟草产品信息,包含品牌、规格、价格、条码等详细数据。首次请求会触发云锁WAF的拦截页面。
实际请求流程
[爬虫] --GET--> http://www.etmoc.com/Firms/Product?Id=3602
|
v
[WAF] 返回验证页面(含YunSuoAutoJump脚本)
|
v
[爬虫] 解析JS,计算 security_verify_data=313932302c31303830
|
v
[爬虫] --GET--> http://www.etmoc.com/Firms/Product?Id=3602&security_verify_data=313932302c31303830
|
v
[WAF] 返回第二次跳转页面
|
v
[爬虫] --GET--> http://www.etmoc.com/Firms/Product?Id=3602
|
v
[WAF] 返回真实产品详情页面 ✓
第一阶段:初始拦截
当爬虫首次访问受保护页面时,云锁返回一段包含验证逻辑的HTML:
关键逻辑分析:
stringToHex函数 :将字符串转换为十六进制编码- 例如:
"1920,1080"→"313932302c31303830"
- 例如:
- 屏幕参数采集 :获取
screen.width和screen.height- 这是浏览器环境特有的属性,普通HTTP客户端无法直接提供
- Cookie设置 :将当前URL进行hex编码后存入
srcurlCookie- 用于后续验证请求来源的合法性
YunSuoAutoJump:自动跳转到带验证参数的URL
第二阶段:验证跳转
第一次验证通过后,云锁返回第二次跳转页面:
验证逻辑:
- 删除
srcurlCookie(一次性使用) - 跳转回原始请求页面
- 此时携带验证通过的Session Cookie,可正常访问
核心代码实现
python
import requests
import re
def string_to_hex(s):
"""云锁WAF的字符串转十六进制算法"""
return ''.join(format(ord(c), '02x') for c in s)
def bypass_waf(session, url):
"""
烟草市场WAF绕过
特点:双重跳转,需删除srcurl Cookie
"""
# 第一次请求获取验证页面
resp = session.get(url, headers=headers, timeout=30)
# 检查是否触发验证
if 'YunSuoAutoJump' not in resp.text:
return resp # 未触发
print('[WAF] 检测到云锁防护,正在绕过...')
# 模拟屏幕参数(固定分辨率1920x1080)
screen_data = "1920,1080"
verify_data = string_to_hex(screen_data)
# 设置srcurl Cookie(当前URL的hex编码)
srcurl = string_to_hex(url)
session.cookies.set('srcurl', srcurl, domain='www.etmoc.com')
# 构造验证URL
verify_url = f"{url}&security_verify_data={verify_data}"
resp = session.get(verify_url, headers=headers, timeout=30)
# 检查是否需要第二次跳转
if 'YunSuoAutoJump' in resp.text and 'security_verify_data' not in resp.text:
print('[WAF] 进行二次跳转...')
session.cookies.pop('srcurl', None) # 删除一次性Cookie
resp = session.get(url, headers=headers, timeout=30)
return resp
# 使用示例
if __name__ == '__main__':
session = requests.Session()
session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
# 绕过WAF获取页面
url = 'http://www.etmoc.com/Firms/Product?Id=3602'
response = bypass_waf(session, url)
# 后续数据解析...
print(f'页面长度: {len(response.text)}')
关键技术点
| 技术点 | 说明 |
|---|---|
stringToHex 还原 |
Python实现JS的字符串转十六进制 |
| Cookie管理 | srcurl需设置,验证后必须删除 |
| 双重跳转检测 | 通过 security_verify_data 是否存在判断阶段 |
| Session保持 | 使用 requests.Session() 维持Cookie状态 |
示例二:中国临床试验注册中心(阿里云WAF)
目标网站 :中国临床试验注册中心(chictr.org.cn)
防护类型:阿里云WAF(ACW ScV2 Cookie验证)
场景描述
该网站收录国内临床试验注册信息,包含试验方案、研究者、伦理审批等敏感医疗数据。使用阿里云WAF进行防护,需要计算 acw_sc__v2 Cookie值。
防护机制分析
阿里云WAF的验证流程:
[爬虫] --GET--> https://www.chictr.org.cn/showproj.html?proj=291127
|
v
[WAF] 返回拦截页面,包含arg1参数
<script>
var arg1='A1B2C3D4E5F6789...'; // 动态生成的十六进制字符串
</script>
|
v
[爬虫] 提取arg1,调用JS算法计算acw_sc__v2
|
v
[爬虫] --GET--> 原URL + Cookie: acw_sc__v2=计算结果
|
v
[WAF] 验证通过,返回真实页面 ✓
核心代码实现
python
import re
import execjs
import requests
# 预置XOR密钥(需从JS文件分析获取)
XOR_KEY = "3000176000856006061501533003690027800375"
# 加载阿里云WAF解密JS
with open('/JS_aliyunwaf.js', 'r', encoding='utf-8') as f:
JS_CODE = f.read()
def get_response(url):
"""
阿里云WAF绕过
特点:arg1参数 + XOR运算 + acw_sc__v2 Cookie
"""
session = requests.Session()
# 第一次请求获取验证页面
response = session.get(url, headers=headers, timeout=30)
text = response.text
# 判断是否需要解密
if text.startswith("<html>"):
print('[WAF] 检测到阿里云防护,开始解密...')
# 提取arg1参数(十六进制字符串)
arg1_match = re.search(r"var arg1='([0-9A-F]+)'", text)
if not arg1_match:
raise Exception('无法提取arg1参数')
arg1 = arg1_match.group(1)
# 调用JS计算acw_sc__v2
# JS函数签名:calculateAcwScV2(arg1, xorKey)
ctx = execjs.compile(JS_CODE).call('calculateAcwScV2', arg1, XOR_KEY)
print(f'[WAF] 计算acw_sc__v2: {ctx[:20]}...')
# 设置验证Cookie
session.cookies.set("acw_sc__v2", ctx)
# 第二次请求获取真实页面
response = session.get(url, headers=headers, timeout=30)
text = response.text
elif text.startswith("<!DOCTYPE html>"):
print('[WAF] 无需解密,直接返回')
return text
# 使用示例
if __name__ == '__main__':
url = 'https://www.chictr.org.cn/showproj.html?proj=291127'
try:
# 绕过WAF获取页面
html = get_response(url)
print(f'页面长度: {len(html)}')
# 后续数据解析...
except Exception as e:
print(f'请求失败: {e}')
JS解密算法核心(aliyunwaf.js)
javascript
// 阿里云WAF核心算法(简化版)
function calculateAcwScV2(arg1, xorKey) {
var result = "";
var arg2 = "arg2_value"; // 从页面提取的固定值
// 1. 对arg1进行XOR运算
for (var i = 0; i < arg1.length; i++) {
var charCode = parseInt(arg1.substr(i, 2), 16);
var xorChar = parseInt(xorKey.substr(i % xorKey.length, 2), 16);
result += String.fromCharCode(charCode ^ xorChar);
}
// 2. 添加时间戳或随机数(防止重放攻击)
result += Date.now().toString(36);
// 3. MD5或SHA1签名
return hex_md5(result);
}
关键技术点
- arg1参数提取:使用正则表达式从HTML中动态提取
- XOR密钥固定 :
xor_key在JS文件中硬编码,可长期有效 - JS引擎调用 :使用
PyExecJS库执行Node.js环境 - Cookie复用 :验证通过后,
acw_sc__v2可在一定时间内重复使用
两种WAF对比分析
| 特性 | 云锁WAF(示例一) | 阿里云WAF(示例二) |
|---|---|---|
| 验证方式 | 双重跳转 + Cookie | 单次验证 + Cookie |
| 关键参数 | security_verify_data |
arg1 + acw_sc__v2 |
| 算法复杂度 | 低(简单十六进制) | 中(XOR + 哈希) |
| Cookie生命周期 | 一次性,需删除 | 持久化,可复用 |
| 是否需要JS引擎 | 否(纯Python实现) | 是(execjs调用) |
| 逆向难度 | 低 | 中 |
法律与道德声明
本文所述技术仅用于合法的安全研究与授权测试,请遵守:
- 《网络安全法》相关规定
- 目标网站的 robots.txt 协议
- 获取明确授权后再进行大规模数据采集
未经授权的爬虫行为可能导致:
- 服务器负载异常(可能构成DDoS)
- 数据泄露风险
- 法律责任追究
参考链接
使用WAF阻止爬虫攻击_最佳实践_Web应用防火墙 WAF-华为云
破解云锁服务器安全软件的反爬机制(python)_yunsuoautojump-CSDN博客