论文件上传绕过的各种姿势
字数 2238 2025-08-25 22:58:35

文件上传漏洞绕过技术全面指南

一、文件上传漏洞概述

1.1 基本概念

文件上传漏洞是指Web应用程序在允许用户上传文件时,未对上传文件的格式进行严格过滤,导致攻击者可以上传恶意文件(如webshell)到服务器上的安全漏洞。

1.2 危害等级

  • 高风险漏洞,危害大于SQL注入和XSS
  • 攻击者可上传webshell直接控制服务器
  • 可能导致服务器完全沦陷

1.3 常见存在场景

  • BBS图片上传功能
  • 个人网站文件分享
  • 办公平台文档上传
  • 任何允许用户上传文件的Web应用

二、Webshell基础知识

2.1 Webshell定义

以asp、php、jsp等网页文件形式存在的一种命令执行环境,也称网页后门。

2.2 常见分类

  • 按大小

    • 大马:功能完整的后门
    • 小马:一句话木马(如中国菜刀使用的)
  • 按脚本类型

    • JSP、ASP、ASPX、PHP

2.3 经典Webshell示例

<%Runtime.getRuntime().exec(request.getParameter("i"));%>
success!!!!<%eval request("cmd")%>
<?php echo shell_exec($_GET['cmd']);?>

<?php @eval($_POST['password']);?>  // 中国菜刀连接用

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

3.1 前端JS验证绕过

漏洞特征:仅在前端使用JavaScript验证文件类型

绕过方法

  1. 浏览器插件法

    • 使用开发者工具删除检测文件后缀的JS代码
    • 直接上传恶意文件
  2. 后缀名欺骗法

    • 将webshell后缀改为允许的格式(如.jpg)
    • 上传时抓包修改后缀为.php
  3. JS函数修改法

    • 在前端JS判断函数中添加允许上传php文件
    • 或直接删除验证函数

3.2 MIME类型验证绕过

漏洞特征:服务器通过Content-Type判断文件类型

绕过方法

  1. 上传php文件时抓包
  2. 将Content-Type修改为允许的类型(如image/jpeg)
  3. 放行数据包

3.3 黑名单绕过技术

3.3.1 非常规后缀名绕过

  • 原理:利用Apache解析顺序特性(从右到左解析)
  • 方法
    1. 配置Apache的httpd.conf:
      AddType application/x-httpd-php .php .php3 .phtml
      
    2. 上传.phtml或.php3后缀的webshell

3.3.2 .htaccess文件利用

  • 前提:Apache服务器,AllowOverride配置为All
  • 步骤
    1. 上传.htaccess文件内容:
      SetHandler application/x-httpd-php
      
    2. 上传任意文件都会被解析为PHP

3.3.3 大小写绕过

  • 适用场景:未统一大小写处理
  • 方法:使用.Php、.pHp等混合大小写后缀

3.3.4 空格绕过

  • 适用场景:未对后缀名去空格处理
  • 方法:在后缀名中加空格(如".php ")

3.3.5 点号绕过

  • 适用场景:未对后缀名去点处理
  • 方法:在后缀名末尾加点(如".php.")
  • Windows特性:会自动去掉最后的点

3.3.6 ::$DATA绕过

  • 适用场景:PHP+Windows环境
  • 方法:在文件名后加"::$DATA"
  • 原理:Windows会将"::$DATA"之后的数据当成文件流处理

3.3.7 双写绕过

  • 适用场景:使用str_ireplace等函数替换黑名单后缀
  • 方法:使用pphphp(替换掉php后剩下php)

3.4 白名单绕过技术

3.4.1 截断上传

  • %00截断
    • 条件:PHP版本<5.3.4,magic_quotes_gpc=off
    • 方法:filename="webshell.php%00.jpg"

3.4.2 图片马结合解析漏洞

  1. 制作图片马:
    • 在图片末尾添加PHP代码
  2. 结合服务器解析漏洞上传

3.5 竞争条件攻击

  • 原理:利用文件上传与安全检查的时间差
  • 方法
    1. 上传.php文件
    2. 在删除前快速访问执行

四、防御措施

4.1 安全验证策略

  1. 文件内容检测

    • 检查文件头/魔数
    • 重写文件内容
  2. 多维度验证

    • 后缀名白名单
    • MIME类型验证
    • 文件内容检测
  3. 存储安全

    • 上传目录禁止执行脚本
    • 随机化文件名
    • 隐藏存储路径

4.2 服务器配置

  1. Web服务器:

    • 关闭不必要的HTTP方法(如PUT)
    • 及时修复解析漏洞
  2. PHP配置:

    • 开启magic_quotes_gpc
    • 设置open_basedir限制

五、实战案例解析

案例1:前端JS验证绕过

  1. 将webshell.php改名为webshell.jpg
  2. 使用Burp Suite拦截上传请求
  3. 修改filename为webshell.php
  4. 放行数据包

案例2:.htaccess文件攻击

  1. 上传.htaccess文件内容:
    SetHandler application/x-httpd-php
    
  2. 上传包含PHP代码的图片文件
  3. 访问图片URL执行代码

案例3:双写绕过

  1. 上传文件名为webshell.pphphp
  2. 服务器替换掉php后剩下webshell.php
  3. 成功上传PHP文件

六、高级技巧

6.1 结合解析漏洞

  • IIS 6.0目录解析:/xx.asp/xx.jpg
  • IIS 6.0分号解析:xx.asp;.jpg
  • Nginx文件名逻辑漏洞:xx.jpg%00.php

6.2 特殊字符利用

  • 换行符绕过:filename="webshell.php\x0A.jpg"
  • 不可见字符:使用十六进制编码

6.3 条件竞争利用

  1. 编写脚本快速上传.php文件
  2. 同时运行脚本快速访问上传文件
  3. 在文件被删除前执行恶意代码

七、工具推荐

  1. 中国菜刀:经典webshell管理工具
  2. Burp Suite:拦截修改上传请求
  3. Webshell样本
    • PHP小马
    • JSP大马
    • 图片马生成器

八、总结

文件上传漏洞的绕过技术多种多样,防御需要采取多层次的安全措施。安全人员应充分了解各种绕过技术,才能设计出有效的防御方案。同时,保持系统更新、及时修复已知漏洞也是防御的关键。

文件上传漏洞绕过技术全面指南 一、文件上传漏洞概述 1.1 基本概念 文件上传漏洞是指Web应用程序在允许用户上传文件时,未对上传文件的格式进行严格过滤,导致攻击者可以上传恶意文件(如webshell)到服务器上的安全漏洞。 1.2 危害等级 高风险漏洞,危害大于SQL注入和XSS 攻击者可上传webshell直接控制服务器 可能导致服务器完全沦陷 1.3 常见存在场景 BBS图片上传功能 个人网站文件分享 办公平台文档上传 任何允许用户上传文件的Web应用 二、Webshell基础知识 2.1 Webshell定义 以asp、php、jsp等网页文件形式存在的一种命令执行环境,也称网页后门。 2.2 常见分类 按大小 : 大马:功能完整的后门 小马:一句话木马(如中国菜刀使用的) 按脚本类型 : JSP、ASP、ASPX、PHP 2.3 经典Webshell示例 三、文件上传绕过技术详解 3.1 前端JS验证绕过 漏洞特征 :仅在前端使用JavaScript验证文件类型 绕过方法 : 浏览器插件法 : 使用开发者工具删除检测文件后缀的JS代码 直接上传恶意文件 后缀名欺骗法 : 将webshell后缀改为允许的格式(如.jpg) 上传时抓包修改后缀为.php JS函数修改法 : 在前端JS判断函数中添加允许上传php文件 或直接删除验证函数 3.2 MIME类型验证绕过 漏洞特征 :服务器通过Content-Type判断文件类型 绕过方法 : 上传php文件时抓包 将Content-Type修改为允许的类型(如image/jpeg) 放行数据包 3.3 黑名单绕过技术 3.3.1 非常规后缀名绕过 原理 :利用Apache解析顺序特性(从右到左解析) 方法 : 配置Apache的httpd.conf: 上传.phtml或.php3后缀的webshell 3.3.2 .htaccess文件利用 前提 :Apache服务器,AllowOverride配置为All 步骤 : 上传.htaccess文件内容: 上传任意文件都会被解析为PHP 3.3.3 大小写绕过 适用场景 :未统一大小写处理 方法 :使用.Php、.pHp等混合大小写后缀 3.3.4 空格绕过 适用场景 :未对后缀名去空格处理 方法 :在后缀名中加空格(如".php ") 3.3.5 点号绕过 适用场景 :未对后缀名去点处理 方法 :在后缀名末尾加点(如".php.") Windows特性 :会自动去掉最后的点 3.3.6 ::$DATA绕过 适用场景 :PHP+Windows环境 方法 :在文件名后加"::$DATA" 原理 :Windows会将"::$DATA"之后的数据当成文件流处理 3.3.7 双写绕过 适用场景 :使用str_ ireplace等函数替换黑名单后缀 方法 :使用pphphp(替换掉php后剩下php) 3.4 白名单绕过技术 3.4.1 截断上传 %00截断 : 条件:PHP版本<5.3.4,magic_ quotes_ gpc=off 方法:filename="webshell.php%00.jpg" 3.4.2 图片马结合解析漏洞 制作图片马: 在图片末尾添加PHP代码 结合服务器解析漏洞上传 3.5 竞争条件攻击 原理 :利用文件上传与安全检查的时间差 方法 : 上传.php文件 在删除前快速访问执行 四、防御措施 4.1 安全验证策略 文件内容检测 : 检查文件头/魔数 重写文件内容 多维度验证 : 后缀名白名单 MIME类型验证 文件内容检测 存储安全 : 上传目录禁止执行脚本 随机化文件名 隐藏存储路径 4.2 服务器配置 Web服务器: 关闭不必要的HTTP方法(如PUT) 及时修复解析漏洞 PHP配置: 开启magic_ quotes_ gpc 设置open_ basedir限制 五、实战案例解析 案例1:前端JS验证绕过 将webshell.php改名为webshell.jpg 使用Burp Suite拦截上传请求 修改filename为webshell.php 放行数据包 案例2:.htaccess文件攻击 上传.htaccess文件内容: 上传包含PHP代码的图片文件 访问图片URL执行代码 案例3:双写绕过 上传文件名为webshell.pphphp 服务器替换掉php后剩下webshell.php 成功上传PHP文件 六、高级技巧 6.1 结合解析漏洞 IIS 6.0目录解析:/xx.asp/xx.jpg IIS 6.0分号解析:xx.asp;.jpg Nginx文件名逻辑漏洞:xx.jpg%00.php 6.2 特殊字符利用 换行符绕过:filename="webshell.php\x0A.jpg" 不可见字符:使用十六进制编码 6.3 条件竞争利用 编写脚本快速上传.php文件 同时运行脚本快速访问上传文件 在文件被删除前执行恶意代码 七、工具推荐 中国菜刀 :经典webshell管理工具 Burp Suite :拦截修改上传请求 Webshell样本 : PHP小马 JSP大马 图片马生成器 八、总结 文件上传漏洞的绕过技术多种多样,防御需要采取多层次的安全措施。安全人员应充分了解各种绕过技术,才能设计出有效的防御方案。同时,保持系统更新、及时修复已知漏洞也是防御的关键。