文件上传漏洞
一、文件上传漏洞基础
1、文件上传漏洞概述
1)文件上传漏洞
有文件上传就可以测试是否有漏洞,关键看代码是否完备。
2)漏洞危害
自定义网站后门,获取网站权限,属于高危漏洞。
3)如何查找判断
黑盒查找:不知道源代码情况下,通过目录扫描和网站应用,以及通过网站后台、会员中心进行获取权限,需要自己判断。
白盒查找:通过源代码分析文件上传漏洞。
判断:通过抓包分析
4)注意事项
文件上传的区分归类,是编辑器还是第三方应用,还是其它的,再进行后续测试
2、文件上传地址的获取
- 网站搜索关键词
- 网站的目录扫描:铸剑
- 针对网站进行搜索upload关键词
- 网站应用功能:上传头像、图片、会员中心、上传视频
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中间件实现自定义文件解析的配置文件
<FilesMatch "123">
SetHandler application/x-httpd-php
</FilesMatch>
创建.htaccess文件:如果文件匹配到相应文件(123.xxx),就会以PHP的文件类型去执行
- 上传.htaccess文件
- 上传123.jpg文件
- 访问123.jpg
- 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不会解码