Pass-01 --- 前端 JS 验证
-
漏洞: 仅在前端通过 JS 检查文件扩展名,服务端无验证
-
绕过: 禁用浏览器 JS / 修改前端代码 / 直接抓包改包
-
防御: 服务端必须独立做文件类型校验,不可信任前端验证
Pass-02 --- MIME 类型验证(Content-Type)
-
漏洞: 仅检查
$_FILES['file']['type'](由客户端控制) -
绕过: 抓包修改
Content-Type: image/jpeg -
防御: 使用
finfo_file()或exif_imagetype()检测文件真实内容
Pass-03 --- 黑名单扩展名过滤
-
漏洞: 黑名单禁止
asp|aspx|php|jsp -
绕过: 使用可执行替代后缀:
.php5/.phtml/.pht/.shtml/.inc -
防御: 使用白名单 机制,只允许
jpg|png|gif;配置 Web 服务器禁止非白名单后缀执行
Pass-04 --- .htaccess 绕过
-
漏洞: 黑名单禁止常见脚本后缀,但允许上传
.htaccess -
绕过: 上传
.htaccess内容AddType application/x-httpd-php .jpg,再传图片马 -
防御: 禁止上传
.htaccess/.user.ini/*.conf等配置文件
Pass-05 --- .user.ini 绕过
-
漏洞: 黑名单禁止
.htaccess,但允许.user.ini -
绕过: 上传
.user.ini内容auto_prepend_file=shell.jpg,再传图片马 -
防御: 禁止上传
.user.ini,关闭 CGI/FastCGI 下的auto_prepend_file指令
Pass-06 --- 大小写绕过
-
漏洞: 黑名单为小写
php,未做大小写归一化 -
绕过: 上传
shell.pHp/shell.Php/shell.pHP -
防御: 使用
strtolower()或str_ireplace()统一转为小写后比对
Pass-07 --- 空格绕过
-
漏洞: 黑名单匹配精确后缀,Windows 自动去除尾部空格
-
绕过: 上传
shell.php(php 后加空格) -
防御: 使用
trim()去除首尾空格后再校验
Pass-08 --- 点号绕过
-
漏洞: 黑名单匹配精确后缀,Windows 自动去除尾部
. -
绕过: 上传
shell.php.(末尾加点) -
防御: 使用
rtrim($filename, '.')去除尾部点号
Pass-09 --- ::$DATA 流绕过
-
漏洞: Windows NTFS 文件流特性,
::$DATA之后的内容被忽略 -
绕过: 上传
shell.php::$DATA -
防御: 过滤
::$DATA、:等特殊 NTFS 流标记;在 Linux 服务器运行
Pass-10 --- 双写绕过
-
漏洞:
str_replace('php', '', $filename)仅替换一次 -
绕过: 上传
shell.pphphp(替换后恢复为.php) -
防御: 递归替换(循环执行替换直到无变化),或改用
str_ireplace+ 递归
Pass-11 --- GET 方式 %00 截断
-
漏洞: PHP < 5.3.4,URL 中
%00截断字符串 -
绕过: 白名单后缀
.jpg,构造路径shell.php%00.jpg -
防御: 升级 PHP 到 >= 5.3.4;对路径做
basename()过滤
Pass-12 --- POST 方式 %00 截断
-
漏洞: POST 参数同样存在 %00 截断(需 hex 00)
-
绕过: 抓包将路径修改为
shell.php[hex:00].jpg -
防御: 升级 PHP;路径拼接前做严格校验
Pass-13 --- 图片马 + 文件包含
-
漏洞: 允许上传图片,但存在文件包含漏洞可解析图片马
-
绕过: 图片尾部追加 PHP 代码,配合文件包含执行
-
防御: 分离图片内容与 PHP 代码(二次渲染);严格校验文件内容;修补文件包含漏洞
Pass-14 --- 图片马 + getimagesize()
-
漏洞: 通过
getimagesize()检测图片,但未检测代码注入 -
绕过: 制作图片马并保证
getimagesize()返回有效图片信息 -
防御: 对上传的图片做二次渲染,丢弃文件中所有非图片数据
Pass-15 --- 图片马 + exif_imagetype()
-
漏洞: 通过
exif_imagetype()检测图片,同上有漏洞 -
绕过: 同 Pass-14,制作图片马
-
防御: 二次渲染;使用纯净图片重新生成,不信任用户上传的原始数据
Pass-16 --- 图片马 + 二次渲染
-
漏洞: 对图片进行二次渲染,但渲染后仍可能保留部分 payload
-
绕过: 分析二次渲染前后差异数据,将马插入保留像素中
-
防御: 使用更彻底的图片净化策略(如 imagemagick 策略);对上传文件做内容策略检测(禁止包含
<?php等)
Pass-17 --- 代码执行(文件名注入)
-
漏洞: 将文件名拼接到代码中执行,未做严格过滤
-
绕过: 上传文件名包含可执行代码
shell.php;xxx.jpg -
防御: 重命名文件为随机字符串加白名单后缀;对文件名做严格过滤
Pass-18 --- 竞争条件
-
漏洞: 文件先保存到服务器,检查不合法后再删除,存在时间差
-
绕过: 持续访问该文件,在检查删除之前执行
-
防御: 先检查文件合法性再保存,使用临时目录 + 原子操作
Pass-19 --- 白名单 + 解析漏洞
-
漏洞: 只允许特定后缀,但拼接路径时去除最后
.之后的内容 -
绕过:
shell.php.jpg利用 Apache 解析漏洞(不认识.jpg向前识别.php) -
防御: 配置 Apache/Nginx 禁止多后缀解析;重命名文件为
时间戳+随机数.jpg
Pass-20 --- 数组绕过
-
漏洞:
$_FILES多维数组绕过isset()检查 -
绕过: 构造
file[name]="shell.php"数组格式上传 -
防御: 使用
is_array()检测参数类型;采用pathinfo()取真实扩展名
Pass-21 --- 文件头检测
-
漏洞: 检查文件头部字节(魔数)判断类型,但未检测后续代码
-
绕过: 在合法文件头后追加 PHP 代码(图片马)
-
防御: 配合二次渲染 + 内容扫描;使用白名单后缀防止执行