爬虫实战五:云锁WAF机制

本文说明:学习笔记整理,仅供学习参考~~

云锁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:
关键逻辑分析:

  1. stringToHex函数 :将字符串转换为十六进制编码
    • 例如:"1920,1080""313932302c31303830"
  2. 屏幕参数采集 :获取 screen.widthscreen.height
    • 这是浏览器环境特有的属性,普通HTTP客户端无法直接提供
  3. Cookie设置 :将当前URL进行hex编码后存入 srcurl Cookie
    • 用于后续验证请求来源的合法性
  4. YunSuoAutoJump:自动跳转到带验证参数的URL
第二阶段:验证跳转

第一次验证通过后,云锁返回第二次跳转页面:
验证逻辑:

  1. 删除 srcurl Cookie(一次性使用)
  2. 跳转回原始请求页面
  3. 此时携带验证通过的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);
}
关键技术点
  1. arg1参数提取:使用正则表达式从HTML中动态提取
  2. XOR密钥固定xor_key 在JS文件中硬编码,可长期有效
  3. JS引擎调用 :使用 PyExecJS 库执行Node.js环境
  4. 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博客

相关推荐
电商API&Tina3 小时前
1688跨境寻源通API数据采集: 获得1688商品详情关键字搜索商品按图搜索1688商品
大数据·前端·数据库·人工智能·爬虫·json·图搜索算法
深蓝电商API3 小时前
爬虫数据API化:Flask快速搭建接口
爬虫·python·flask
骇客野人3 小时前
python爬虫例子,且处理反爬的网站也能爬
开发语言·爬虫·python
gameboy0313 小时前
【Python学习】网络爬虫-爬取豆瓣电影评论
爬虫·python·学习
前端小趴菜~时倾3 小时前
自我提升-python爬虫学习:day01
爬虫·python·学习
小白学大数据4 小时前
小说爬虫实战:《斗罗大陆》章节自动抓取与合并
开发语言·爬虫·python·数据分析
怪侠_岭南一只猿4 小时前
爬虫工程师学习路径 · 阶段五:数据存储与清洗(完整学习文档)
爬虫·python·学习
进击的雷神4 小时前
AJAX动态参数反爬、HTML嵌套网站提取、UPSERT增量更新、空值智能处理——沙特塑料展爬虫四大技术难关攻克纪实
爬虫·python·ajax·html
白菜__4 小时前
阿里V2滑块小程序版本
javascript·爬虫·网络协议·小程序·node.js