文件上传漏洞靶机Writeup
字数 1411 2025-08-18 11:39:04

文件上传漏洞全面解析与防御指南

一、文件上传漏洞概述

文件上传漏洞是Web应用程序中常见的高危漏洞,攻击者通过上传恶意文件获取服务器控制权。本文详细分析多种文件上传绕过技术及防御措施。

二、实验环境准备

  • 操作系统:Windows 10
  • 服务器环境:WAMP (Windows + Apache + MySQL + PHP)
  • 必备工具:
    • Burp Suite抓包工具
    • 一句话木马文件
    • 文本编辑器

三、文件上传绕过技术详解

1. 前端JS验证绕过

漏洞原理:仅依赖前端JavaScript验证文件扩展名,未在服务端进行二次验证。

利用方法

  1. 审查网页源代码,查找允许的扩展名列表(如.jpg|.png|.gif
  2. 创建PHP木马文件,保存为允许的扩展名(如shell.jpg)
  3. 使用Burp Suite拦截上传请求
  4. 修改文件扩展名为.php后放行
<?php eval($_GET['cmdback']);?>

2. MIME类型验证绕过

漏洞原理:服务端仅检查Content-Type头信息。

利用方法

  1. 拦截上传请求
  2. 修改Content-Type为允许的类型(如image/gif
  3. 放行数据包

3. 黑名单验证绕过

漏洞原理:使用不完善的黑名单过滤特定扩展名。

绕过技巧

  • 使用非常见PHP扩展名:.php4, .php5, .phtml
  • 大小写变异:.PhP, .pHp
  • 特殊字符:.php., .php_, .php(空格)
  • Windows特性:.php::$DATA

4. .htaccess文件解析控制

利用方法

  1. 上传.htaccess文件内容:
<FilesMatch ".jpg">
    SetHandler application/x-httpd-php
</FilesMatch>
  1. 上传图片木马(使用copy命令合并):
copy 1.jpg/b + 1.php 2.jpg

5. %00截断技术

条件:PHP版本<5.3.4,magic_quotes_gpc关闭

GET请求利用

  • 上传路径参数:../upload/1.php%00
  • 实际上传文件名:2.jpg
  • 最终保存为:2.php

POST请求利用

  • 使用Hex编辑器修改为../upload/1.php[二进制00]

6. 双写扩展名绕过

漏洞原理:仅进行一次替换过滤

示例

  • 原始文件名:shell.pphphp
  • 过滤后:shell.php

7. 文件头检查绕过

方法

  1. 在真实图片文件头部插入恶意代码
  2. 确保文件头符合要求(如GIF89a)
  3. 配合解析漏洞或截断技术使用

四、防御措施

1. 文件扩展名处理

  • 使用白名单而非黑名单
  • 统一转换为小写:$file_ext = strtolower($file_ext)
  • 彻底去除特殊字符:$file_ext = str_ireplace('::$DATA', '', $file_ext)

2. 文件内容验证

  • 检查真实文件类型(使用finfo_file()
  • 验证图片文件完整性(尺寸、像素等)
  • 重写文件内容(如使用GD库重新生成图片)

3. 上传目录安全

  • 设置上传目录不可执行
  • 单独配置上传目录解析规则
  • 随机化上传文件名和路径

4. 服务器配置

  • 禁用危险解析规则
  • 及时更新Web服务器软件
  • 限制上传文件大小

5. 其他措施

  • 对上传文件进行病毒扫描
  • 记录所有上传操作日志
  • 返回信息加密处理

五、总结

文件上传漏洞主要源于:

  1. 未对用户上传内容进行严格过滤
  2. Web服务器解析漏洞配合

安全开发应遵循"不信任任何用户输入"原则,实施多层防御策略,从客户端到服务端建立完整的安全校验机制。

文件上传漏洞全面解析与防御指南 一、文件上传漏洞概述 文件上传漏洞是Web应用程序中常见的高危漏洞,攻击者通过上传恶意文件获取服务器控制权。本文详细分析多种文件上传绕过技术及防御措施。 二、实验环境准备 操作系统:Windows 10 服务器环境:WAMP (Windows + Apache + MySQL + PHP) 必备工具: Burp Suite抓包工具 一句话木马文件 文本编辑器 三、文件上传绕过技术详解 1. 前端JS验证绕过 漏洞原理 :仅依赖前端JavaScript验证文件扩展名,未在服务端进行二次验证。 利用方法 : 审查网页源代码,查找允许的扩展名列表(如 .jpg|.png|.gif ) 创建PHP木马文件,保存为允许的扩展名(如shell.jpg) 使用Burp Suite拦截上传请求 修改文件扩展名为.php后放行 2. MIME类型验证绕过 漏洞原理 :服务端仅检查Content-Type头信息。 利用方法 : 拦截上传请求 修改Content-Type为允许的类型(如 image/gif ) 放行数据包 3. 黑名单验证绕过 漏洞原理 :使用不完善的黑名单过滤特定扩展名。 绕过技巧 : 使用非常见PHP扩展名: .php4 , .php5 , .phtml 大小写变异: .PhP , .pHp 特殊字符: .php. , .php_ , .php(空格) Windows特性: .php::$DATA 4. .htaccess文件解析控制 利用方法 : 上传.htaccess文件内容: 上传图片木马(使用copy命令合并): 5. %00截断技术 条件 :PHP版本<5.3.4,magic_ quotes_ gpc关闭 GET请求利用 : 上传路径参数: ../upload/1.php%00 实际上传文件名:2.jpg 最终保存为:2.php POST请求利用 : 使用Hex编辑器修改为 ../upload/1.php[二进制00] 6. 双写扩展名绕过 漏洞原理 :仅进行一次替换过滤 示例 : 原始文件名:shell.pphphp 过滤后:shell.php 7. 文件头检查绕过 方法 : 在真实图片文件头部插入恶意代码 确保文件头符合要求(如GIF89a) 配合解析漏洞或截断技术使用 四、防御措施 1. 文件扩展名处理 使用白名单而非黑名单 统一转换为小写: $file_ext = strtolower($file_ext) 彻底去除特殊字符: $file_ext = str_ireplace('::$DATA', '', $file_ext) 2. 文件内容验证 检查真实文件类型(使用 finfo_file() ) 验证图片文件完整性(尺寸、像素等) 重写文件内容(如使用GD库重新生成图片) 3. 上传目录安全 设置上传目录不可执行 单独配置上传目录解析规则 随机化上传文件名和路径 4. 服务器配置 禁用危险解析规则 及时更新Web服务器软件 限制上传文件大小 5. 其他措施 对上传文件进行病毒扫描 记录所有上传操作日志 返回信息加密处理 五、总结 文件上传漏洞主要源于: 未对用户上传内容进行严格过滤 Web服务器解析漏洞配合 安全开发应遵循"不信任任何用户输入"原则,实施多层防御策略,从客户端到服务端建立完整的安全校验机制。