Upload-labs通关手册
字数 1987 2025-08-29 08:32:24

Upload-labs 通关手册 - 全面文件上传漏洞实战指南

一、环境准备

运行环境要求

  • 操作系统:Windows 或 Linux
  • PHP版本:推荐 5.2.17(其他版本可能导致部分关卡无法突破)
  • PHP组件:php_gd2、php_exif(部分关卡需要)
  • Apache:以 module 方式连接

项目地址
https://github.com/c0ny1/upload-labs

二、基础文件上传漏洞类型及绕过方法

1. 前端验证绕过(第一关)

  • 漏洞特征:仅前端JavaScript验证文件类型
  • 绕过方法
    1. 禁用浏览器JavaScript
    2. 修改前端验证函数,允许上传php文件
    3. 使用Burp Suite拦截并修改上传请求

2. Content-Type验证绕过(第二关)

  • 漏洞特征:服务器仅检查Content-Type
  • 绕过方法
    修改HTTP请求头中的Content-Type为合法类型(如image/jpeg

3. 黑名单验证绕过(第三关)

  • 漏洞特征:使用黑名单过滤特定扩展名
  • 绕过方法
    使用非常见PHP解析扩展名:
    • .php3
    • .phtml
    • .phps
    • .php5

4. .htaccess文件利用(第四关)

  • 漏洞特征:黑名单未过滤.htaccess
  • 绕过方法
    1. 上传包含以下内容的.htaccess文件:
      SetHandler application/x-httpd-php
      
    2. 上传任意文件(如图片马)将被解析为PHP

5. 大小写绕过(第五关)

  • 漏洞特征:未统一处理扩展名大小写
  • 绕过方法
    使用大小写混合扩展名:
    • .Php
    • .pHp
    • .pHP

6. 空格绕过(第六关)

  • 漏洞特征:未去除扩展名中的空格
  • 绕过方法
    在扩展名后添加空格:
    • info.php

7. 点号绕过(第七关)

  • 漏洞特征:未处理扩展名末尾的点号
  • 绕过方法
    利用Windows特性(自动去除末尾点号):
    • info.php.

8. Windows特性绕过(第八关)

  • 漏洞特征:未过滤::$DATA
  • 绕过方法
    利用Windows NTFS流特性:
    • info.php::$DATA

9. 点+空格+点绕过(第九关)

  • 漏洞特征:路径拼接处理后的文件名
  • 绕过方法
    构造特殊文件名:
    • info.php. .(处理后变为info.php.

10. 双写绕过(第十关)

  • 漏洞特征:将黑名单扩展名替换为空
  • 绕过方法
    使用双写扩展名:
    • info.pphphp

三、高级绕过技术

11. %00截断(GET型)(第十一关)

  • 漏洞特征$img_path直接拼接,未过滤%00
  • 绕过方法
    在路径中使用%00截断:
    • info.php%00.jpg

12. %00截断(POST型)(第十二关)

  • 漏洞特征:POST参数未自动解码%00
  • 绕过方法
    1. 使用Burp Suite修改二进制数据
    2. 在适当位置插入十六进制00

13. 图片马绕过(第十三关)

  • 检测方式:读取文件前2个字节
  • 绕过方法
    1. 制作图片马:
      copy normal.jpg /b + shell.php /a webshell.jpg
      
    2. 需要配合文件包含漏洞利用

14. getimagesize()验证绕过(第十四关)

  • 检测方式:使用getimagesize()获取图片信息
  • 绕过方法
    直接上传有效的图片马

15. exif_imagetype()验证绕过(第十五关)

  • 检测方式:使用php_exif模块验证
  • 绕过方法
    上传符合标准的图片马

16. 二次渲染绕过(第十六关)

  • 检测方式:综合验证(扩展名、Content-Type、图像渲染)
  • 绕过方法
    1. 上传GIF图片马
    2. 对比渲染前后文件,找到不变部分插入代码

17. 条件竞争漏洞(第十七关)

  • 漏洞特征:上传→重命名→删除流程
  • 利用方法
    1. 使用Burp Suite持续发送上传请求
    2. 同时快速访问上传文件,在删除前执行

18. 重命名条件竞争(第十八关)

  • 漏洞特征:上传后重命名存在时间差
  • 利用方法
    持续快速上传,使系统来不及重命名

19. move_uploaded_file() %00截断(第十九关)

  • 漏洞特征:CVE-2015-2348
  • 利用方法
    在POST参数save_name中使用%00截断

四、防御建议

  1. 使用白名单而非黑名单验证文件扩展名
  2. 统一处理扩展名大小写
  3. 去除文件名中的特殊字符(空格、点号、::$DATA等)
  4. 禁止上传.htaccess等配置文件
  5. 对上传文件重命名(避免用户控制文件名)
  6. 将上传文件存储在非Web目录
  7. 使用随机生成的文件名
  8. 对图片文件进行二次渲染
  9. 使用安全的文件处理函数,避免%00截断

五、总结

Upload-labs靶场全面覆盖了从基础到高级的文件上传漏洞类型,通过实践这些关卡,可以深入理解文件上传漏洞的原理、利用方法和防御措施。掌握这些技术对于Web安全测试和防御至关重要。

Upload-labs 通关手册 - 全面文件上传漏洞实战指南 一、环境准备 运行环境要求 : 操作系统:Windows 或 Linux PHP版本:推荐 5.2.17(其他版本可能导致部分关卡无法突破) PHP组件:php_ gd2、php_ exif(部分关卡需要) Apache:以 module 方式连接 项目地址 : https://github.com/c0ny1/upload-labs 二、基础文件上传漏洞类型及绕过方法 1. 前端验证绕过(第一关) 漏洞特征 :仅前端JavaScript验证文件类型 绕过方法 : 禁用浏览器JavaScript 修改前端验证函数,允许上传php文件 使用Burp Suite拦截并修改上传请求 2. Content-Type验证绕过(第二关) 漏洞特征 :服务器仅检查Content-Type 绕过方法 : 修改HTTP请求头中的Content-Type为合法类型(如 image/jpeg ) 3. 黑名单验证绕过(第三关) 漏洞特征 :使用黑名单过滤特定扩展名 绕过方法 : 使用非常见PHP解析扩展名: .php3 .phtml .phps .php5 4. .htaccess文件利用(第四关) 漏洞特征 :黑名单未过滤.htaccess 绕过方法 : 上传包含以下内容的.htaccess文件: 上传任意文件(如图片马)将被解析为PHP 5. 大小写绕过(第五关) 漏洞特征 :未统一处理扩展名大小写 绕过方法 : 使用大小写混合扩展名: .Php .pHp .pHP 6. 空格绕过(第六关) 漏洞特征 :未去除扩展名中的空格 绕过方法 : 在扩展名后添加空格: info.php 7. 点号绕过(第七关) 漏洞特征 :未处理扩展名末尾的点号 绕过方法 : 利用Windows特性(自动去除末尾点号): info.php. 8. Windows特性绕过(第八关) 漏洞特征 :未过滤 ::$DATA 绕过方法 : 利用Windows NTFS流特性: info.php::$DATA 9. 点+空格+点绕过(第九关) 漏洞特征 :路径拼接处理后的文件名 绕过方法 : 构造特殊文件名: info.php. . (处理后变为 info.php. ) 10. 双写绕过(第十关) 漏洞特征 :将黑名单扩展名替换为空 绕过方法 : 使用双写扩展名: info.pphphp 三、高级绕过技术 11. %00截断(GET型)(第十一关) 漏洞特征 : $img_path 直接拼接,未过滤%00 绕过方法 : 在路径中使用%00截断: info.php%00.jpg 12. %00截断(POST型)(第十二关) 漏洞特征 :POST参数未自动解码%00 绕过方法 : 使用Burp Suite修改二进制数据 在适当位置插入十六进制00 13. 图片马绕过(第十三关) 检测方式 :读取文件前2个字节 绕过方法 : 制作图片马: 需要配合文件包含漏洞利用 14. getimagesize()验证绕过(第十四关) 检测方式 :使用getimagesize()获取图片信息 绕过方法 : 直接上传有效的图片马 15. exif_ imagetype()验证绕过(第十五关) 检测方式 :使用php_ exif模块验证 绕过方法 : 上传符合标准的图片马 16. 二次渲染绕过(第十六关) 检测方式 :综合验证(扩展名、Content-Type、图像渲染) 绕过方法 : 上传GIF图片马 对比渲染前后文件,找到不变部分插入代码 17. 条件竞争漏洞(第十七关) 漏洞特征 :上传→重命名→删除流程 利用方法 : 使用Burp Suite持续发送上传请求 同时快速访问上传文件,在删除前执行 18. 重命名条件竞争(第十八关) 漏洞特征 :上传后重命名存在时间差 利用方法 : 持续快速上传,使系统来不及重命名 19. move_ uploaded_ file() %00截断(第十九关) 漏洞特征 :CVE-2015-2348 利用方法 : 在POST参数save_ name中使用%00截断 四、防御建议 使用白名单而非黑名单验证文件扩展名 统一处理扩展名大小写 去除文件名中的特殊字符(空格、点号、 ::$DATA 等) 禁止上传.htaccess等配置文件 对上传文件重命名(避免用户控制文件名) 将上传文件存储在非Web目录 使用随机生成的文件名 对图片文件进行二次渲染 使用安全的文件处理函数,避免%00截断 五、总结 Upload-labs靶场全面覆盖了从基础到高级的文件上传漏洞类型,通过实践这些关卡,可以深入理解文件上传漏洞的原理、利用方法和防御措施。掌握这些技术对于Web安全测试和防御至关重要。