由Upload-labs的几关引发的思考
字数 1445 2025-08-26 22:11:51

Upload-labs 文件上传漏洞实战与思考

1. Windows 文件创建特性

1.1 .htaccess 文件创建问题

  • 在 Windows 上直接创建 .htaccess 文件会报错,因为系统将其视为无文件名的扩展名
  • 解决方法:
    • 方法一:创建 .htaccess.(Windows 会自动忽略最后的点)
    • 方法二:使用命令行 echo [内容] > .htaccess

1.2 Windows 文件名处理特性

  • 1.php. → 弹窗后变为 1.php
  • 1.php[空格] → 直接变为 1.php
  • 1.php[空格]. → 弹窗后变为 1.php
  • 注意:过多特殊字符组合可能导致系统异常,需重启解决

2. Upload-labs 关卡分析

2.1 黑名单绕过技术

Pass-05:大小写绕过

  • 源码缺少 strtolower() 转换
  • 构造后缀如 .phP 即可绕过

Pass-06:空格绕过

  • 源码缺少 trim() 去空格
  • 构造 ma.php[空格] 绕过

Pass-07:点号绕过

  • 源码缺少 deldot() 删除末尾点
  • 构造 ma.php. → 系统处理后变为 ma.php

Pass-09:路径拼接问题

  • 直接使用原始文件名拼接路径 $img_path = UPLOAD_PATH.'/'.$file_name
  • 可利用 Windows 特性构造特殊文件名绕过

2.2 其他配置文件利用

.user.ini 文件

  • .htaccess 适用范围更广(支持 Nginx/Apache/IIS 的 FastCGI PHP)
  • 可在目录下创建 .user.ini 修改 PHP 配置
  • 官方说明:PHP 会从执行文件目录向上扫描到 web 根目录

2.3 二次渲染绕过 (Pass-16)

源码分析

  • 使用 GD 库函数 (imagecreatefromjpeg/png/gif) 重新生成图片
  • 上传文件先保存,然后进行二次渲染

绕过方法

  • 使用专门工具生成绕过 GD 库渲染的图片马
  • 经验:
    1. 选择稍大的图片成功率更高
    2. Shell 代码越短成功率越高
    3. 可尝试多张不同图片
    4. 可将 GD 处理后的图片再次处理上传

2.4 getimagesize 绕过 (Pass-14)

  • getimagesize() 会验证图片有效性
  • 可结合 ImageMagick 特性绕过检测
  • 参考:P牛博客《当ImageMagick遇上getimagesize》

3. 关键函数与过滤机制

3.1 常见过滤函数

$file_name = deldot($file_name); // 删除末尾点
$file_ext = strrchr($file_name, '.'); // 获取扩展名
$file_ext = strtolower($file_ext); // 转换为小写
$file_ext = str_ireplace('::$DATA', '', $file_ext); // 去除::$DATA
$file_ext = trim($file_ext); // 首尾去空

3.2 strrchr() 函数特性

  • 从字符串最后出现的位置开始截取
  • 影响特殊构造的文件名处理结果

3.3 magic_quotes_gpc 影响

  • 开启时会对 %00 等特殊字符添加反斜线
  • 导致 %00 截断攻击失效

4. 防御建议

  1. 使用白名单而非黑名单
  2. 严格处理文件名:去点、去空格、大小写统一
  3. 避免直接使用原始文件名拼接路径
  4. 对上传内容进行二次渲染或校验
  5. 禁用危险服务器配置(如 .htaccess.user.ini 执行)
  6. 保持中间件和 PHP 版本更新

5. 参考资源

  1. Upload-labs 项目地址:https://github.com/c0ny1/upload-labs
  2. P牛博客:https://www.leavesongs.com/
  3. 绕过GD库渲染的WEBSHELL生成器
  4. 神秘的.user.ini文件解析
Upload-labs 文件上传漏洞实战与思考 1. Windows 文件创建特性 1.1 .htaccess 文件创建问题 在 Windows 上直接创建 .htaccess 文件会报错,因为系统将其视为无文件名的扩展名 解决方法: 方法一:创建 .htaccess. (Windows 会自动忽略最后的点) 方法二:使用命令行 echo [内容] > .htaccess 1.2 Windows 文件名处理特性 1.php. → 弹窗后变为 1.php 1.php[空格] → 直接变为 1.php 1.php[空格]. → 弹窗后变为 1.php 注意:过多特殊字符组合可能导致系统异常,需重启解决 2. Upload-labs 关卡分析 2.1 黑名单绕过技术 Pass-05:大小写绕过 源码缺少 strtolower() 转换 构造后缀如 .phP 即可绕过 Pass-06:空格绕过 源码缺少 trim() 去空格 构造 ma.php[空格] 绕过 Pass-07:点号绕过 源码缺少 deldot() 删除末尾点 构造 ma.php. → 系统处理后变为 ma.php Pass-09:路径拼接问题 直接使用原始文件名拼接路径 $img_path = UPLOAD_PATH.'/'.$file_name 可利用 Windows 特性构造特殊文件名绕过 2.2 其他配置文件利用 .user.ini 文件 比 .htaccess 适用范围更广(支持 Nginx/Apache/IIS 的 FastCGI PHP) 可在目录下创建 .user.ini 修改 PHP 配置 官方说明:PHP 会从执行文件目录向上扫描到 web 根目录 2.3 二次渲染绕过 (Pass-16) 源码分析 使用 GD 库函数 ( imagecreatefromjpeg/png/gif ) 重新生成图片 上传文件先保存,然后进行二次渲染 绕过方法 使用专门工具生成绕过 GD 库渲染的图片马 经验: 选择稍大的图片成功率更高 Shell 代码越短成功率越高 可尝试多张不同图片 可将 GD 处理后的图片再次处理上传 2.4 getimagesize 绕过 (Pass-14) getimagesize() 会验证图片有效性 可结合 ImageMagick 特性绕过检测 参考:P牛博客《当ImageMagick遇上getimagesize》 3. 关键函数与过滤机制 3.1 常见过滤函数 3.2 strrchr() 函数特性 从字符串最后出现的位置开始截取 影响特殊构造的文件名处理结果 3.3 magic_ quotes_ gpc 影响 开启时会对 %00 等特殊字符添加反斜线 导致 %00 截断攻击失效 4. 防御建议 使用白名单而非黑名单 严格处理文件名:去点、去空格、大小写统一 避免直接使用原始文件名拼接路径 对上传内容进行二次渲染或校验 禁用危险服务器配置(如 .htaccess 、 .user.ini 执行) 保持中间件和 PHP 版本更新 5. 参考资源 Upload-labs 项目地址:https://github.com/c0ny1/upload-labs P牛博客:https://www.leavesongs.com/ 绕过GD库渲染的WEBSHELL生成器 神秘的.user.ini文件解析