Skip to content

文件上传漏洞

一、文件上传漏洞基础

1、文件上传漏洞概述

1)文件上传漏洞

有文件上传就可以测试是否有漏洞,关键看代码是否完备。

2)漏洞危害

自定义网站后门,获取网站权限,属于高危漏洞。

3)如何查找判断

黑盒查找:不知道源代码情况下,通过目录扫描和网站应用,以及通过网站后台、会员中心进行获取权限,需要自己判断。

白盒查找:通过源代码分析文件上传漏洞。

判断:通过抓包分析

4)注意事项

文件上传的区分归类,是编辑器还是第三方应用,还是其它的,再进行后续测试

2、文件上传地址的获取

  1. 网站搜索关键词
  2. 网站的目录扫描:铸剑
  3. 针对网站进行搜索upload关键词
  4. 网站应用功能:上传头像、图片、会员中心、上传视频

3、本地(前端)上传漏洞

upload-labs靶场:https://github.com/c0ny1/upload-labs

GitCode镜像站点:https://gitcode.net/mirrors/c0ny1/upload-labs

upload-labs Pass-1

1)发现不允许上传php

2)查看源代码

发现是前端js验证 --> 下载源代码

3)修改form表单

注释js验证脚本

抓包,添加action属性

4)本地提交上传

二、后端绕过

1、文件上传的验证

1)后缀名

黑名单验证,白名单验证

后缀名是直接的验证,黑名单是不允许那些格式的文件上传,白名单是只允许那些格式的文件上传,相对来说安全一些。

2)文件类型:MIME信息

content-Type的内容:不同文件类型所对应的值也不同,如GIF文件对应:image/gif,如果检测的是mime,可以通过修改来绕过验证。

3)文件头:内容头信息

用记事本打开文件,会发现不同类型的文件的头部的值不同。

如果存在nginx解析漏洞(nginx1.x最新版,php7.x最新版),可以在文件的尾部添加PHP代码,然后访问:文件路径/1.php执行上传的文件。

2、黑名单

1).htaccess解析

搭建:php-5.2.17+Apache

.htaccess原理:Apache中间件实现自定义文件解析的配置文件

xml
<FilesMatch "123">
SetHandler application/x-httpd-php
</FilesMatch>

创建.htaccess文件:如果文件匹配到相应文件(123.xxx),就会以PHP的文件类型去执行

  1. 上传.htaccess文件
  2. 上传123.jpg文件
  3. 访问123.jpg
  4. 123.jpg以php格式打开

2)大小写绕过

服务器没有大小写转换,并且win搭建 --> 文件名改为phP上传

3)点绕过

上传之前的2.phP文件并且抓包分析,将文件名的后缀添加一个.

原理:win下文件后缀名加上.,会强制自动清除掉,但是在数据包内可以修改,就可以绕过验证。服务器存储时会把空格自动清除掉,还原成可执行的PHP格式。

4)空格绕过

上传之前的2.phP文件并且抓包分析,将文件名的后缀添加一个空格。

原理:win下文件后缀名加上空格,会强制自动清除掉,但是在数据包内可以修改,就可以绕过验证。服务器存储时会把空格自动清除掉,还原成可执行的PHP格式。

5)::$DATA绕过

前提:windows下的PHP

原理:在window的时候如果"文件名+::$DATA"之后的数据当成文件流处理,不会被检测后缀名

6)配合解析漏洞

7)后缀双写

对于单次验证可以双写后缀:.phphpp --> .php

对于循环验证或者递归验证:无效

8)多后缀解析

利用.php3.php5.phtml解析绕过

前提:服务器开启了相应的解析

3、白名单

1)0x00截断

0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。这个可以用在对文件类型名的绕过上。

具体原理是 系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。

但要注意是文件的16进制内容里的00,而不是文件名中的00!就是说系统是按16进制读取文件(或者说二进制)

遇到ascii码为零的位置就停止,而这个ascii码为零的位置在16进制中是00,用0x开头表示16进制,也就是所说的0x00截断。

2)%00截断

%00是在URL地址方面的,%00为空格的URL编码。

%00是被服务器解码为0x00发挥了截断作用。

get方法在URL里面会自动的解码,而post不会解码

Released under the MIT License.