Upload-labs 20关通关笔记
字数 2264 2025-08-26 22:11:15

Upload-labs 20关通关教学文档

概述

Upload-labs是一个使用PHP语言编写的专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场,旨在帮助大家对上传漏洞有一个全面的了解。本教学文档详细解析了20关上传漏洞的绕过方法和技术要点。

环境要求

  • PHP/5.6.27
  • Apache/2.4.23
  • Windows环境

各关详细解析

Pass-01: JS检查绕过

漏洞点:前端JavaScript验证文件类型

绕过方法

  1. 禁用浏览器JavaScript
  2. 使用Burp Suite等工具修改上传包
  3. 直接修改前端HTML代码

Pass-02: Content-Type验证绕过

漏洞点:仅验证Content-Type

if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif'))

绕过方法

  1. 抓包修改Content-Type为image/jpegimage/pngimage/gif

Pass-03: 黑名单绕过

漏洞点:黑名单过滤不完整

$deny_ext = array('.asp','.aspx','.php','.jsp');

绕过方法

  1. 上传.phtml.phps.php5.pht等后缀(需Apache配置支持)
  2. 上传.htaccess文件(需满足条件):
    • mod_rewrite模块开启
    • AllowOverride All
    • 文件内容:
      <FilesMatch "shell.jpg">
      SetHandler application/x-httpd-php
      </FilesMatch>
      
  3. 使用Apache解析漏洞

Pass-04: .htaccess绕过

漏洞点:黑名单未包含.htaccess

$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");

绕过方法

  1. 上传.htaccess文件

Pass-05: 大小写绕过

漏洞点:未将后缀转换为小写

绕过方法

  1. 上传.Php.pHp等大小写混合后缀(仅Windows有效)

Pass-06: 空格绕过

漏洞点:未去除文件名末尾空格

绕过方法

  1. 上传.php (末尾带空格)

Pass-07: 点绕过

漏洞点:未去除文件名末尾点

绕过方法

  1. 上传.php.(末尾带点)

Pass-08: ::$DATA绕过

漏洞点:未处理NTFS备用数据流

绕过方法

  1. 上传.php::$DATA(仅Windows有效)

Pass-09: 点+空格+点绕过

漏洞点:move_upload_file直接使用用户可控文件名

绕过方法

  1. 上传.php. .(点+空格+点)

Pass-10: 双写绕过

漏洞点:敏感后缀替换为空

绕过方法

  1. 上传.pphphp(双写绕过)

Pass-11: 00截断(CVE-2015-2348)

漏洞点:move_uploaded_file中的save_path可控

影响版本

  • 5.4.x <= 5.4.39
  • 5.5.x <= 5.5.23
  • 5.6.x <= 5.6.7

绕过方法

  1. 使用00截断:/file.php\x00.jpg

Pass-12: POST型00截断

绕过方法

  1. 同Pass-11,但使用POST方式

Pass-13-16: 图片马绕过

Pass-13: unpack检测

检测方式:读取文件前2字节判断类型

绕过方法

  1. 制作图片马:copy smi1e.jpg /b + shell.php /a shell.jpg

Pass-14: getimagesize()检测

绕过方法

  1. 同Pass-13

Pass-15: exif_imagetype()检测

绕过方法

  1. 同Pass-13

Pass-16: 二次渲染绕过

检测方式:使用imagecreatefromgif/jpeg/png进行二次渲染

绕过方法

  1. 对于GIF:找到渲染前后不变的位置插入PHP代码
  2. 对于JPG/PNG:参考先知社区文章(https://xz.aliyun.com/t/2657)

Pass-17: 条件竞争

漏洞点:先保存文件再检查后缀

if(move_uploaded_file($temp_file, $upload_file)){
    if(in_array($file_ext,$ext_arr)){
        // 重命名
    }else{
        unlink($upload_file);
    }
}

绕过方法

  1. 利用条件竞争:在文件保存后但未删除前访问执行
  2. 使用Burp Suite不断发送上传包和请求包

Pass-18: 条件竞争(高级)

漏洞点:move操作在rename之前

绕过方法

  1. 同Pass-17,利用move和rename之间的时间差

Pass-19: /.绕过

漏洞点:move_uploaded_file会忽略文件末尾的/.

绕过方法

  1. 构造文件名如smi1e.php/.
  2. 也可使用00截断

Pass-20: 数组+/.绕过

漏洞点:文件名处理逻辑缺陷

$file_name = reset($file) . '.' . $file[count($file) - 1];

绕过方法

  1. 构造数组形式文件名:
    • $file[0] = 'smi1e.php/'
    • $file[2] = 'jpg'
  2. 最终生成smi1e.php/.,move_uploaded_file忽略/.后上传smi1e.php

解析漏洞总结

  1. Apache解析漏洞:

    • 文件名如test.php.xxx可能被解析为PHP
    • 多后缀名解析顺序问题
  2. IIS解析漏洞:

    • 目录解析:/xx.asp/xx.jpg
    • 文件名解析:xx.asp;.jpg
    • 畸形解析:xx.jpg/.php
  3. Nginx解析漏洞:

    • 文件名逻辑漏洞:xx.jpg%00.php
    • 配置错误导致的解析漏洞

防御建议

  1. 使用白名单而非黑名单
  2. 严格检查文件类型(MIME、文件头等)
  3. 重命名上传文件
  4. 限制上传目录执行权限
  5. 使用随机文件名
  6. 对上传文件进行二次渲染
  7. 设置合理的文件大小限制
  8. 及时更新服务器软件修补已知漏洞

后记

通过这20关的实践,可以全面掌握各种文件上传漏洞的利用和防御方法。在实际渗透测试中,需要根据目标环境灵活组合使用这些技术。

Upload-labs 20关通关教学文档 概述 Upload-labs是一个使用PHP语言编写的专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场,旨在帮助大家对上传漏洞有一个全面的了解。本教学文档详细解析了20关上传漏洞的绕过方法和技术要点。 环境要求 PHP/5.6.27 Apache/2.4.23 Windows环境 各关详细解析 Pass-01: JS检查绕过 漏洞点 :前端JavaScript验证文件类型 绕过方法 : 禁用浏览器JavaScript 使用Burp Suite等工具修改上传包 直接修改前端HTML代码 Pass-02: Content-Type验证绕过 漏洞点 :仅验证Content-Type 绕过方法 : 抓包修改Content-Type为 image/jpeg 、 image/png 或 image/gif Pass-03: 黑名单绕过 漏洞点 :黑名单过滤不完整 绕过方法 : 上传 .phtml 、 .phps 、 .php5 、 .pht 等后缀(需Apache配置支持) 上传 .htaccess 文件(需满足条件): mod_ rewrite模块开启 AllowOverride All 文件内容: 使用Apache解析漏洞 Pass-04: .htaccess绕过 漏洞点 :黑名单未包含 .htaccess 绕过方法 : 上传 .htaccess 文件 Pass-05: 大小写绕过 漏洞点 :未将后缀转换为小写 绕过方法 : 上传 .Php 、 .pHp 等大小写混合后缀(仅Windows有效) Pass-06: 空格绕过 漏洞点 :未去除文件名末尾空格 绕过方法 : 上传 .php (末尾带空格) Pass-07: 点绕过 漏洞点 :未去除文件名末尾点 绕过方法 : 上传 .php. (末尾带点) Pass-08: ::$DATA绕过 漏洞点 :未处理NTFS备用数据流 绕过方法 : 上传 .php::$DATA (仅Windows有效) Pass-09: 点+空格+点绕过 漏洞点 :move_ upload_ file直接使用用户可控文件名 绕过方法 : 上传 .php. . (点+空格+点) Pass-10: 双写绕过 漏洞点 :敏感后缀替换为空 绕过方法 : 上传 .pphphp (双写绕过) Pass-11: 00截断(CVE-2015-2348) 漏洞点 :move_ uploaded_ file中的save_ path可控 影响版本 : 5.4.x <= 5.4.39 5.5.x <= 5.5.23 5.6.x <= 5.6.7 绕过方法 : 使用00截断: /file.php\x00.jpg Pass-12: POST型00截断 绕过方法 : 同Pass-11,但使用POST方式 Pass-13-16: 图片马绕过 Pass-13: unpack检测 检测方式 :读取文件前2字节判断类型 绕过方法 : 制作图片马: copy smi1e.jpg /b + shell.php /a shell.jpg Pass-14: getimagesize()检测 绕过方法 : 同Pass-13 Pass-15: exif_ imagetype()检测 绕过方法 : 同Pass-13 Pass-16: 二次渲染绕过 检测方式 :使用imagecreatefromgif/jpeg/png进行二次渲染 绕过方法 : 对于GIF:找到渲染前后不变的位置插入PHP代码 对于JPG/PNG:参考先知社区文章(https://xz.aliyun.com/t/2657) Pass-17: 条件竞争 漏洞点 :先保存文件再检查后缀 绕过方法 : 利用条件竞争:在文件保存后但未删除前访问执行 使用Burp Suite不断发送上传包和请求包 Pass-18: 条件竞争(高级) 漏洞点 :move操作在rename之前 绕过方法 : 同Pass-17,利用move和rename之间的时间差 Pass-19: /.绕过 漏洞点 :move_ uploaded_ file会忽略文件末尾的/. 绕过方法 : 构造文件名如 smi1e.php/. 也可使用00截断 Pass-20: 数组+/.绕过 漏洞点 :文件名处理逻辑缺陷 绕过方法 : 构造数组形式文件名: $file[ 0 ] = 'smi1e.php/' $file[ 2 ] = 'jpg' 最终生成 smi1e.php/. ,move_ uploaded_ file忽略/.后上传 smi1e.php 解析漏洞总结 Apache解析漏洞: 文件名如 test.php.xxx 可能被解析为PHP 多后缀名解析顺序问题 IIS解析漏洞: 目录解析: /xx.asp/xx.jpg 文件名解析: xx.asp;.jpg 畸形解析: xx.jpg/.php Nginx解析漏洞: 文件名逻辑漏洞: xx.jpg%00.php 配置错误导致的解析漏洞 防御建议 使用白名单而非黑名单 严格检查文件类型(MIME、文件头等) 重命名上传文件 限制上传目录执行权限 使用随机文件名 对上传文件进行二次渲染 设置合理的文件大小限制 及时更新服务器软件修补已知漏洞 后记 通过这20关的实践,可以全面掌握各种文件上传漏洞的利用和防御方法。在实际渗透测试中,需要根据目标环境灵活组合使用这些技术。