文件上传总结
字数 1911 2025-08-12 11:33:35

文件上传漏洞全面总结与绕过技术

基础知识

文件上传功能常见于用户头像修改等场景,通常允许上传jpg、png、gif等图片格式,而禁止上传php、asp、jsp等脚本文件。

文件上传流程:前端 → 代理服务器(BurpSuite) → 后端

系统识别方法

  1. 最优方法:通过文件名大小写敏感性判断

    • Windows:不区分大小写
    • Linux:严格区分大小写
  2. 次选方法:通过ping命令的TTL值判断

    • Windows通常TTL=128
    • Linux通常TTL=64
    • 注意:可能因网络不通或人为设置导致不准确

代码审计视角

上传后的文件名通常由三部分组成:

上传后的文件名 = 预备路径 + 带随机数的文件名 + 文件后缀

审计时应关注:

  1. 哪些部分被拼接到最终文件名中
  2. 哪些函数能影响这些被拼接的部分

文件上传绕过技术

I. 前端JS检测绕过

特征

  • 上传非法文件时出现前端弹框提示
  • BurpSuite抓不到包(未发送到服务器)

绕过方法

  1. 开启BurpSuite抓包
  2. 将文件后缀改为jpg通过前端校验
  3. 在BurpSuite中将后缀改回php
  4. 上传到服务器

II. MIME类型校验绕过

MIME标准

  • 多用途互联网邮件扩展类型
  • HTTP协议通过Content-Type头标识数据类型

绕过方法

  1. 上传jpg文件
  2. 抓包修改Content-Type为允许的类型(如image/jpeg)
  3. 将文件后缀改为php后上传

III. 黑名单绕过技术

1. 大小写混淆

特征:黑名单过滤.php、.jsp、.asp等
绕过:使用.PHP、.pHP等变体

2. 特定后缀名

相关后缀:.php1-.php5、.phtml、.pht
原理:Apache配置中可能有.+\.ph(p[345]?|t|tml)正则

3. Windows文件名特性

特征

  • Windows自动去除文件名末尾的点和空格
  • 服务器可能先去除点再检测后缀

绕过

  • 使用xx.php. (末尾有点和空格)
  • 处理后变为xx.php

4. 双写::$DATA绕过

特征:服务器未完全过滤::$DATA
绕过

  • php$::DATA直接绕过
  • php::$DAT::$DATAA绕过正则过滤

5. %00截断

前提

  • PHP版本<5.3
  • magic_quotes_gpc=Off(默认On)

原理:%00(\0)在C语言中表示字符串结束
利用

  1. 修改GET传递的路径为/upload/test.php%00
  2. 上传合法图片
  3. 最终文件名为/upload/test.php

6. .htaccess文件重写

前提:Apache配置AllowOverride=All
利用

  1. 上传.htaccess文件定义解析规则
  2. 上传符合规则的文件(如jpg)
  3. 服务器将jpg按php解析

7. 服务器解析漏洞

Apache解析漏洞

原理:从右向左解析后缀
利用:上传xx.php.abc,Apache无法识别.abc则解析为php

IIS6.0解析漏洞

相关后缀:.asp、.asa、.cer、.cdx
漏洞1:以这些后缀结尾的目录下所有文件按asp解析
漏洞2:文件名中包含.asp;等时忽略后缀按asp解析

Nginx/IIS7.0/7.5解析漏洞

利用:上传xx.jpg,访问xx.jpg/x.php使jpg按php解析

IV. 条件竞争漏洞

原理

  1. 服务器先接收所有文件到临时目录
  2. 依次检查并删除不合格文件
  3. 正在访问的文件无法被删除

利用

  1. 使用BurpSuite Intruder模块
  2. 同时多次上传和访问文件
  3. 在删除前访问到文件使其保留
  4. 配合file_put_contents()留更多后门

V. 图片马技术

适用场景:脚本文件过滤严格时,配合文件包含漏洞使用

图片马制作方法

  1. 文本编辑器法

    • 用记事本打开图片插入代码
    • 缺点:图片可能无法显示
  2. DOS命令法

    copy /b xx.jpg + xx.php = xx.jpg
    
    • 二进制流合成,图片可正常显示
  3. 十六进制编辑器法

    • 在大片00字节处插入代码
    • 主要用于绕过二次渲染

二次渲染绕过

原理:服务器用imagecreatefromjpeg()等函数重组图片,破坏插入的代码

绕过步骤

  1. 上传正常图片并下载
  2. 用Hex Editor比较原图与渲染后图
  3. 找出字节码不变的位置插入代码
  4. 通常gif格式不变区域较多

防御建议

  1. 使用白名单而非黑名单
  2. 文件重命名(避免用户控制文件名)
  3. 限制文件类型和大小
  4. 对上传文件进行病毒扫描
  5. 存储上传文件于非Web目录
  6. 禁用危险函数(如php执行函数)
  7. 及时更新服务器软件

通过全面理解这些绕过技术和防御措施,可以有效提升Web应用的文件上传安全性。

文件上传漏洞全面总结与绕过技术 基础知识 文件上传功能常见于用户头像修改等场景,通常允许上传jpg、png、gif等图片格式,而禁止上传php、asp、jsp等脚本文件。 文件上传流程:前端 → 代理服务器(BurpSuite) → 后端 系统识别方法 最优方法 :通过文件名大小写敏感性判断 Windows:不区分大小写 Linux:严格区分大小写 次选方法 :通过ping命令的TTL值判断 Windows通常TTL=128 Linux通常TTL=64 注意:可能因网络不通或人为设置导致不准确 代码审计视角 上传后的文件名通常由三部分组成: 审计时应关注: 哪些部分被拼接到最终文件名中 哪些函数能影响这些被拼接的部分 文件上传绕过技术 I. 前端JS检测绕过 特征 : 上传非法文件时出现前端弹框提示 BurpSuite抓不到包(未发送到服务器) 绕过方法 : 开启BurpSuite抓包 将文件后缀改为jpg通过前端校验 在BurpSuite中将后缀改回php 上传到服务器 II. MIME类型校验绕过 MIME标准 : 多用途互联网邮件扩展类型 HTTP协议通过Content-Type头标识数据类型 绕过方法 : 上传jpg文件 抓包修改Content-Type为允许的类型(如image/jpeg) 将文件后缀改为php后上传 III. 黑名单绕过技术 1. 大小写混淆 特征 :黑名单过滤.php、.jsp、.asp等 绕过 :使用.PHP、.pHP等变体 2. 特定后缀名 相关后缀 :.php1-.php5、.phtml、.pht 原理 :Apache配置中可能有 .+\.ph(p[345]?|t|tml) 正则 3. Windows文件名特性 特征 : Windows自动去除文件名末尾的点和空格 服务器可能先去除点再检测后缀 绕过 : 使用 xx.php. (末尾有点和空格) 处理后变为 xx.php 4. 双写::$DATA绕过 特征 :服务器未完全过滤::$DATA 绕过 : php$::DATA 直接绕过 php::$DAT::$DATAA 绕过正则过滤 5. %00截断 前提 : PHP版本 <5.3 magic_ quotes_ gpc=Off(默认On) 原理 :%00(\0)在C语言中表示字符串结束 利用 : 修改GET传递的路径为 /upload/test.php%00 上传合法图片 最终文件名为 /upload/test.php 6. .htaccess文件重写 前提 :Apache配置AllowOverride=All 利用 : 上传.htaccess文件定义解析规则 上传符合规则的文件(如jpg) 服务器将jpg按php解析 7. 服务器解析漏洞 Apache解析漏洞 原理 :从右向左解析后缀 利用 :上传 xx.php.abc ,Apache无法识别.abc则解析为php IIS6.0解析漏洞 相关后缀 :.asp、.asa、.cer、.cdx 漏洞1 :以这些后缀结尾的目录下所有文件按asp解析 漏洞2 :文件名中包含 .asp; 等时忽略后缀按asp解析 Nginx/IIS7.0/7.5解析漏洞 利用 :上传xx.jpg,访问 xx.jpg/x.php 使jpg按php解析 IV. 条件竞争漏洞 原理 : 服务器先接收所有文件到临时目录 依次检查并删除不合格文件 正在访问的文件无法被删除 利用 : 使用BurpSuite Intruder模块 同时多次上传和访问文件 在删除前访问到文件使其保留 配合file_ put_ contents()留更多后门 V. 图片马技术 适用场景 :脚本文件过滤严格时,配合文件包含漏洞使用 图片马制作方法 文本编辑器法 : 用记事本打开图片插入代码 缺点:图片可能无法显示 DOS命令法 : 二进制流合成,图片可正常显示 十六进制编辑器法 : 在大片00字节处插入代码 主要用于绕过二次渲染 二次渲染绕过 原理 :服务器用imagecreatefromjpeg()等函数重组图片,破坏插入的代码 绕过步骤 : 上传正常图片并下载 用Hex Editor比较原图与渲染后图 找出字节码不变的位置插入代码 通常gif格式不变区域较多 防御建议 使用白名单而非黑名单 文件重命名(避免用户控制文件名) 限制文件类型和大小 对上传文件进行病毒扫描 存储上传文件于非Web目录 禁用危险函数(如php执行函数) 及时更新服务器软件 通过全面理解这些绕过技术和防御措施,可以有效提升Web应用的文件上传安全性。