Web安全之文件上传-WAF绕过-免杀
字数 2040 2025-08-11 21:26:39

Web安全之文件上传漏洞与WAF绕过技术详解

1. 文件上传漏洞概述

文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,导致用户可以越过权限向服务器上传可执行的动态脚本文件。常见场景包括头像上传、图片上传、OA办公文件上传等。

危害

  • 控制整个网站甚至服务器
  • 上传webshell后门
  • 查看服务器信息、目录和执行系统命令

2. 文件上传过程分析

客户端上传流程:

  1. 客户端选择文件并发送
  2. 服务器接收文件
  3. 网站程序进行判断
  4. 文件存储为临时文件
  5. 移动到指定路径

PHP上传示例代码:

if ($_FILES["file"]["error"] > 0) {
    echo "Error: " . $_FILES["file"]["error"];
} else {
    echo "Upload: " . $_FILES["file"]["name"];
    echo "Type: " . $_FILES["file"]["type"];
    echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb";
    echo "Stored in: " . $_FILES["file"]["tmp_name"];
}

上传错误代码:

  • 0: 上传成功
  • 1: 超过php.ini限制
  • 2: 超过HTML表单限制
  • 3: 文件部分上传
  • 4: 没有文件上传

3. 文件上传漏洞类型

3.1 直接文件上传漏洞

  • 无任何限制的高危漏洞
  • 攻击者可直接上传恶意文件

3.2 有条件上传漏洞

  • 简单前端认证可绕过
  • 文件头检测可绕过
  • 权限认证缺失
  • 逻辑缺陷导致绕过

4. 文件上传防御措施

  1. 权限认证:上传模块需认证,禁止匿名访问
  2. 目录设置:上传目录禁止脚本执行
  3. 白名单限制:只允许特定图片格式(jpg/png/gif)
  4. 后缀名限制:强制设置为图片格式

5. 文件上传攻击方法

  1. 寻找上传模块:头像、编辑器、媒体上传等
  2. 测试上传恶意文件(asp/php/aspx等)
  3. 分析返回信息判断限制方式
  4. 尝试各种绕过技术

6. 常见可执行文件后缀

asp asa cdx cer php aspx ashx jsp php3 php.a shtml phtml

过滤绕过技巧:

  • aspasp → asp
  • asaspp → asp
  • phpphp → php

7. 文件上传绕过技术详解

7.1 绕过前端JS检测

  • 方法1:删除网页校验代码(F12开发者工具)
  • 方法2:先上传合法后缀(jpg/gif/png),再抓包修改为php/asp/jsp

7.2 绕过Content-Type检测

  • 修改Content-Type为image/jpeg等图片类型

7.3 黑名单绕过

  • 使用非常见后缀:php3, php5, phtml
  • 需确保服务器配置解析这些后缀

7.4 .htaccess重写解析

  1. 上传.htaccess文件内容:
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
  1. 上传jpg图片马

7.5 大小写绕过

  • Php, pHP, pHP等变体

7.6 空格绕过

  • 在文件名后添加空格:shell.php

7.7 Windows特性绕过

  • 文件名后加点:shell.php.
  • Windows会自动忽略最后的点

7.8 NTFS数据流绕过

  • 添加::\(DATA:shell.php::\)DATA

7.9 Windows叠加特性

  • 上传9.php:.jpg生成空白文件
  • 再上传9.>>>或9.<<<

7.10 双写后缀绕过

  • 当代码替换黑名单字符时:pphphp → php
  • asaspp → asp

7.11 %00截断(GET)

  • 条件:PHP<5.3.4,GPC关闭
  • 示例:shell.php%00.jpg → shell.php

7.12 POST %00截断

  • POST中%00需URL解码为空白符

7.13 文件头检测绕过

  • 制作图片马:copy 1.jpg/b + 1.php 2.jpg
  • 常见文件头:
    • JPEG: FFD8FF
    • PNG: 89504E47
    • GIF: 47494638

7.14-16 图片检测函数绕过

  • getimagesize()
  • exif_imagetype()
  • 需配合文件包含漏洞

7.17 二次渲染绕过

  • 对比原图和渲染后图片
  • 在未被修改部分插入代码

7.18 条件竞争

  • 快速访问刚上传的文件
  • 利用上传和删除的时间差

7.19 文件名可控攻击

  • 结合包含漏洞使用图片马

7.20 move_uploaded_file截断

  • 利用save_name参数%00截断

7.21 数组验证绕过

  • 利用数组上传方式绕过检测

8. WAF绕过技术

8.1 常见绕过方式

  1. 数据溢出(脏数据)
  2. 符号变异(' " ;)
  3. 数据截断(%00,换行)
  4. 重复数据

8.2 具体绕过方法

脏数据绕过

  • 使文件名异常长,溢出WAF检测

符号变异

  1. 去掉filename的双引号
  2. 改为单引号
  3. 使用分号:x.jpg;.php
  4. 修改为:filename="Content-Type: image/jpeg;5.php"

数据截断

  1. 换行符截断
  2. %00截断(POST需URL解码)

FUZZ测试

  • 本地搭建环境测试各种payload
  • 找到可绕过WAF的特殊构造

9. Webshell免杀技术

免杀工具

  • 推荐工具:Webshell_Generate
  • GitHub地址:https://github.com/cseroad/Webshell_Generate/

免杀测试

  1. 生成webshell
  2. 使用杀毒软件(如火绒)测试
  3. 多轮迭代优化

10. 防御建议

  1. 使用白名单而非黑名单
  2. 重命名上传文件
  3. 限制上传目录执行权限
  4. 文件内容严格校验
  5. 及时更新WAF规则
  6. 定期安全审计

通过全面了解这些技术和防御措施,可以有效提升系统对文件上传漏洞的防护能力。

Web安全之文件上传漏洞与WAF绕过技术详解 1. 文件上传漏洞概述 文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,导致用户可以越过权限向服务器上传可执行的动态脚本文件。常见场景包括头像上传、图片上传、OA办公文件上传等。 危害 控制整个网站甚至服务器 上传webshell后门 查看服务器信息、目录和执行系统命令 2. 文件上传过程分析 客户端上传流程: 客户端选择文件并发送 服务器接收文件 网站程序进行判断 文件存储为临时文件 移动到指定路径 PHP上传示例代码: 上传错误代码: 0: 上传成功 1: 超过php.ini限制 2: 超过HTML表单限制 3: 文件部分上传 4: 没有文件上传 3. 文件上传漏洞类型 3.1 直接文件上传漏洞 无任何限制的高危漏洞 攻击者可直接上传恶意文件 3.2 有条件上传漏洞 简单前端认证可绕过 文件头检测可绕过 权限认证缺失 逻辑缺陷导致绕过 4. 文件上传防御措施 权限认证:上传模块需认证,禁止匿名访问 目录设置:上传目录禁止脚本执行 白名单限制:只允许特定图片格式(jpg/png/gif) 后缀名限制:强制设置为图片格式 5. 文件上传攻击方法 寻找上传模块:头像、编辑器、媒体上传等 测试上传恶意文件(asp/php/aspx等) 分析返回信息判断限制方式 尝试各种绕过技术 6. 常见可执行文件后缀 过滤绕过技巧: aspasp → asp asaspp → asp phpphp → php 7. 文件上传绕过技术详解 7.1 绕过前端JS检测 方法1:删除网页校验代码(F12开发者工具) 方法2:先上传合法后缀(jpg/gif/png),再抓包修改为php/asp/jsp 7.2 绕过Content-Type检测 修改Content-Type为image/jpeg等图片类型 7.3 黑名单绕过 使用非常见后缀:php3, php5, phtml 需确保服务器配置解析这些后缀 7.4 .htaccess重写解析 上传.htaccess文件内容: 上传jpg图片马 7.5 大小写绕过 Php, pHP, pHP等变体 7.6 空格绕过 在文件名后添加空格:shell.php 7.7 Windows特性绕过 文件名后加点:shell.php. Windows会自动忽略最后的点 7.8 NTFS数据流绕过 添加::$DATA:shell.php::$DATA 7.9 Windows叠加特性 上传9.php:.jpg生成空白文件 再上传9.>>>或9.<< < 7.10 双写后缀绕过 当代码替换黑名单字符时:pphphp → php asaspp → asp 7.11 %00截断(GET) 条件:PHP <5.3.4,GPC关闭 示例:shell.php%00.jpg → shell.php 7.12 POST %00截断 POST中%00需URL解码为空白符 7.13 文件头检测绕过 制作图片马:copy 1.jpg/b + 1.php 2.jpg 常见文件头: JPEG: FFD8FF PNG: 89504E47 GIF: 47494638 7.14-16 图片检测函数绕过 getimagesize() exif_ imagetype() 需配合文件包含漏洞 7.17 二次渲染绕过 对比原图和渲染后图片 在未被修改部分插入代码 7.18 条件竞争 快速访问刚上传的文件 利用上传和删除的时间差 7.19 文件名可控攻击 结合包含漏洞使用图片马 7.20 move_ uploaded_ file截断 利用save_ name参数%00截断 7.21 数组验证绕过 利用数组上传方式绕过检测 8. WAF绕过技术 8.1 常见绕过方式 数据溢出(脏数据) 符号变异(' " ;) 数据截断(%00,换行) 重复数据 8.2 具体绕过方法 脏数据绕过 使文件名异常长,溢出WAF检测 符号变异 去掉filename的双引号 改为单引号 使用分号:x.jpg;.php 修改为:filename="Content-Type: image/jpeg;5.php" 数据截断 换行符截断 %00截断(POST需URL解码) FUZZ测试 本地搭建环境测试各种payload 找到可绕过WAF的特殊构造 9. Webshell免杀技术 免杀工具 推荐工具:Webshell_ Generate GitHub地址:https://github.com/cseroad/Webshell_ Generate/ 免杀测试 生成webshell 使用杀毒软件(如火绒)测试 多轮迭代优化 10. 防御建议 使用白名单而非黑名单 重命名上传文件 限制上传目录执行权限 文件内容严格校验 及时更新WAF规则 定期安全审计 通过全面了解这些技术和防御措施,可以有效提升系统对文件上传漏洞的防护能力。