文件上传漏洞之验证及绕过原理

120 阅读5分钟

文件上传漏洞小合集

  1. 什么是文件上传漏洞?

文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。

演示靶场为upload,下载源码,放phpstudy根目录即可。

这里自己搭建自己玩即可,今天主要分析绕过原理,不对靶场进行操作哦。

闯关教程:Web文件上传靶场 - 通关笔记

D1 文件上传漏洞验证及绕过

1、前端验证

前端验证其实就是形同虚设,它只是前端的JS脚本对上传文件做检测,如何判断是否为前端验证呢?在上传时使用burp抓包,没有数据包被拦截,说明为本地JS脚本验证。

绕过方法:直接修改JS代码或者禁用本地JS即可

2、后端验证

后端验证又分为黑名单,白名单,内容验证及其他验证。

D2 黑名单验证

黑名单验证就是规定死哪些后缀文件不能上传。

图片

这时候咋办呢,我们可以使用以下办法进行绕过,这里就挑几个典型的讲一下,简单的相信大家看名字也就懂了。

方法:1.特殊解析后缀;2.htaccess解析;3.大小写绕过;4.点和空格绕过;5.::$$DATA绕过;6.配合解析漏洞;7.双后缀绕过。

简单原理讲解:

1、特殊解析后缀

  例如可以尝试php5,phtml,htm等等文件后缀,探测服务器是否可以解析。

2、.htaccess解析

.htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。提供了针对目录改变配置的方法,即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

知道了它的用处,对我们文件上传有极大帮助,因为黑名单规定了脚本后缀文件不可上传,这时候我们可以新建一个.htaccess文件上传到服务器,

AddType application/x-httpd-php .jpg

将这句话写入,意思是将上传的jpg文件解析为php文件,所以我们只需上传带一句话的图片即可绕过黑名单。

3、点和空格绕过

这个方法主要是利用了系统的命名机制

在Windows中文件后缀名末尾有空格会自动去掉
例如:"phpinfo.php ",Windows会自动去掉末尾的空格变成"phpinfo.php"

可以自己在桌面新建一个文本测试一番即可。

4、::$$DATA绕过

这个方法还是利用了window系统的一个特性,

在window的时候如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。

例如:"phpinfo.php::$DATA"Windows会自动去掉末尾的::$DATA变成"phpinfo.php"

这样就绕过了限制的黑名单。

5、配合解析漏洞

中间件解析漏洞合集

https://ddz.red/jiexiloudong

这个自己下去好好看看,面试常问到

6、双后缀绕过

对于这种,一般是代码会将黑名单中的文件名剔除并上传,例如上传X.php,就会变成X,php被替换为空,这时候如果我们将文件名改为X.phphp上传,替换php后,文件变为X.php。

当然这种只是适用于单次替换或者两次替换等,对于循环替换的,这种方法是没办法绕过的。

D3 白名单验证/绕过

所谓白名单,就是定死了,你只能上传名单中的文件名,其他的一概不通过。

1、MIME绕过

MIM多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。

常见的MIME类型
  1.  text/plain(纯文本)text/html(HTML文档)text/javascript(js代码)application/xhtml+xml(XHTML文档)image/gif(GIF图像)image/jpeg(JPEG图像)image/png(PNG图像)video/mpeg(MPEG动画)application/octet-stream(二进制数据)application/pdf(PDF文档)
    

【MIME绕过原理】

部分Web应用系统判定文件类型是通过content-type字段,我们可以通过抓包,将content-type字段改为常见的图片类型,如image/gif,从而绕过校验。

图片

2、00截断绕白名单

参考文章:文件上传绕过之00截断

分析十分到位,借用这位大佬文件来分析解释00截断。

这里对00截断再补充以下,%00截断使用限制,php版本小于5.3以下,post%00需要url编码(get会自动解码,post不会自动解码)

D4 文件及其内容验证/绕过

1、文件头检测

不同文件文件头内容也是不一样的,如图

图片

我们可以将上传的php脚本文件的信息头改成允许上传的图片信息头即可绕过。

2.二次渲染

图片上传之后,通常会有一个图片放大缩小等操作,上传后你的图片已经不是你原来的那张图片了,这时候可以试试绕过二次渲染的方式。

参考文章:文件上传之二次渲染绕过

                 制作绕过二次渲染的图片马

操作流程较为繁琐,但认真看看还是很好理解。

3.条件竞争

这里也是利用了一个系统的特征,就是文件在重命名,编辑等使用的情况下,是不能使用删除移动等操作的。

这种利用的条件一般是上传文件后,文件会重命名且移动到其他文件夹,看起来没有问题,但是仔细一想,文件是不是会在原始文件夹下存在一点时间,只要我们持续上传的同时访问文件,利用系统特征,就可以使文件成功执行。

参考文章:文件上传 - 条件竞争上传 

4.getimagesize,exif_imagetype验证

php获取图片信息getimagesize,php自带函数。获取图片的类型,尺寸。

exif_imagetype() 读取一个图像的第一个字节并检查其签名。

这种验证就十分好绕过,两个函数说白了就是检测你上传的文件是不是图片,是非含有图片的特征,绕过也十分简单,在图片内容中加入一句话代码即可。

验证方式大致就是这么多,后期有其他的还是会继续更新的。

Snipaste_2025-08-13_11-10-04.png