搜索

上传漏洞绕过 php

发表于 2026-10-17 02:26:42 来源:烟消火灭网

去年帮一个朋友的上传站做应急响应,进去一看,漏洞shell已经躺在/uploads/2024/里了。绕过文件名是上传shell.php.jpg,内容就是漏洞标准的一句话。服务器是绕过Nginx+PHP-FPM,按说这种双扩展名早该被拦了,上传但他们运维图省事,漏洞直接把.jpg加进了security.limit_extensions的绕过白名单——结果PHP-FPM把shell.php.jpg当成PHP给执行了。这漏洞跟PHP本身关系不大,上传是漏洞配置层面自己把门打开的。

上传绕过这事,绕过核心就一句话:前端校验全是上传纸糊的,后端如果只靠MIME和扩展名,漏洞基本上等于没校验。绕过我见过太多开发把accept="image/*"当安全措施,浏览器F12改个值就破了。真正能扛住的,是后端对文件内容做魔数检测,再配合随机重命名和存储目录禁止执行。

说几个实战里真能用的绕过路子。

MIME绕过是最低级的。抓包把Content-Type: application/x-php改成image/jpeg,后端如果只读这个头就放行。我测过某CMS,上传接口就判断了$_FILES['file']['type'],改完直接传上去,路径还回显在响应里。

扩展名黑名单的绕过花样最多。如果只禁了.php,可以试.php3、.php5、.phtml,老版本Apache的mod_mime可能还认。Windows环境下shell.php.或者shell.php (末尾空格)也常能过,因为系统会去掉尾部的点和空格。还有shell.php::$DATA这种NTFS数据流写法,传到服务器上实际文件名还是shell.php。

双写绕过针对的是那种只替换一次php的过滤器。比如代码里str_replace('php','',$filename),传shell.pphphp,替换掉中间的php后变成shell.php。这招对大小写不敏感的替换也有效,shell.PHP有时候能直接过。

%00截断在PHP 5.3.4之后基本废了,但有些老系统还在跑。上传路径可控的时候,shell.php%00.jpg会让后面的.jpg被截掉。现在更常见的是利用move_uploaded_file的第二个参数,如果路径拼接时用了用户可控的目录名,可以构造../跳出去。

.htaccess这招得看服务器。如果上传目录允许.htaccess,传一个内容为AddType application/x-httpd-php .jpg的文件,再传个shell.jpg,Apache就会把jpg当PHP解析。Nginx不吃这套,但Nginx有个坑:如果fastcgi_split_path_info配置不当,/upload/shell.jpg/x.php这种路径可能让PHP-FPM把shell.jpg当脚本执行。

图片马配合文件包含是另一种思路。把一句话写在图片的EXIF里,上传后通过本地文件包含漏洞去include这个图片。单独传图片马没用,得有个LFI点配合。我见过有人把<?php @eval($_POST['cmd']);?>塞进IDAT块后面,图片能正常显示,但直接访问不解析。

防御其实不复杂。后端用finfo_file()读真实MIME,白名单只放图片类型;文件名用md5(uniqid())加固定后缀重命名;存储目录给php_flag engine off或者干脆放独立域名下。别信任何客户端传过来的东西,$_FILES['file']['name']和['type']都是用户可控的。

最后提一嘴,很多人测上传只盯着PHP文件,其实传个.user.ini也能玩出花。里面写auto_prepend_file=shell.jpg,配合图片马,效果一样。PHP的坑从来不在语言本身,在配置和写代码的人怎么用它。

随机为您推荐
友情链接
版权声明:本站资源均来自互联网,如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

Copyright © 2016 Powered by 上传漏洞绕过 php,烟消火灭网   sitemap

回顶部