文件上传、下载漏洞解析及靶场复现
一、文件上传漏洞
1.1 概述
文件上传漏洞指的是开发人员未对上传的文件类型进行严格的验证过滤,导致攻击者通过上传点上传恶意的可执行动态脚本,并通过此脚本文件获取执行服务器端命令的能力。
Web应用程序通常都会有文件上传功能,如上传头像和背景图片、上传PDF、Word等办公文件。攻击者通过上传恶意文件可能导致的安全问题通常有:
- 上传web脚本代码,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行;
- 上传Flash的策略文件crossdomain.xml,攻击者用以控制Flash在该域下的行为;
- 上传病毒、木马文件,攻击者引诱用户或者管理下载并执行;
- 上传钓鱼图片或者包含脚本的图片,在某些浏览器中会被作为脚本执行,用于钓鱼和欺诈。
不过通常情况下,文件上传漏洞一般认为是“上传Web脚本能够被服务器解析”,也就是获取Websell。而要通过文件上传漏洞获取Webshell需满足以下条件:
①上传的文件能够被Web容器解释执行,所以文件上传后所在的目录要是Web容器所覆盖到的路径。
②用户能够从Web页面上访问到这个文件,若用户无法通过Web访问,或者无法使用Web容器解释这个脚本,那么不能称之为漏洞。
③上传的文件若被安全检查、格式化、图片压缩等功能改变了内容后也会造成无法获取Webshell。
1.2 Web容器解析漏洞
1.2.1 IIS解析漏洞
ISS6.0在解析文件时存在以下两个解析漏洞:
1.当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被ISS当做asp文件来解析。
2.当文件为*.asp;1.jpg时,ISS 6.0同样会以ASP脚本来执行。分号后扩展名将不会被解析,实际解析的文件名为*.asp。
1.2.2 Apache 解析漏洞
在 Apache 1.x 和 Apache 2.x 中存在解析漏洞 ,但与 IIS 解析漏洞有所不同 :
Apache 在解析文件时有一个规则 ,当碰到不认识的扩展名时 ,将会从后向前解析 ,直到碰到认识的扩展名位置 。如果都不认识 ,则会暴露其源码 。如文件1.php.rar.xx.aa,Apache 首先会解析 aa 扩展名 ,如果不认识则接着解析 xx 扩展名 ,一直遍历到认识的扩展名为止 , 然后再将其进行解析。
1.2.3 PHP CGI 解析漏洞
在 PHP的配置文件中有一个关键的选项 : cgi.fi: x_pathinfo, 这个选项在某些版本是默认开启的 。在开启时访问 url,比如 :http://www.xxx.com/x.txt/x.php,x.php 是不存在的文件 ,所以 php 将会向前递归解析 ,于是便造成了解析漏洞 。 由于这种漏洞常见于 IIS7.0 、 IIS7.5 、 Nginx 等 Web服务器 ,所以经常会被误认为是这些 Web服务器的解析漏洞。.
1.3 常见的文件上传漏洞
1.3.1 前端上传检测绕过
例:从某一上传功能点上传一句话木马。
刚浏览选择准备上传的shell.php文件时,页面直接提示上传文件不符合,由此判断前端做的有上传限制。
查看前端代码,发现限制上传类型的onchange函数,直接将该函数删掉。
重新上传成功
通过给出的路径用蚁剑成功链接http://192.168.43.223/pikachu/vul/unsafeupload/uploads/shell.php,获取webshell。
1.3.2 文件类型绕过
首先介绍,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,是设定某种扩展名文件用某一种应用程序来打开的方式类型。即该扩展名文件被访问时,浏览器会自动使用指定的应用程序来打开。多用于一些客户端自定义的文件名以及一些媒体文件打开方式。
每个MINE类型由两部分组成,前面是数据的大类别,如audio、image等,后面定义具体的种类。例:image/jpg、txt/plain、application/rtf。所以通过修改文件上传数据包内的content-type可以绕过服务端上传限制。
例:上传shell.php一句话木马
点击开始上传,抓取数据包发现 Content-Type: application/octet-stream
修改Content-Type为 image/jpg。
放包,成功上传webshell。
1.3.3 文件内容绕过
getimagesize(string filename) 函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。所以要绕过getimagesize()函数文件头检测有两种方法,一是构造图片的文件头,即在一句话木马前面加上GIF89的标识。二是合成图片马进行上传。下面用图片马举例。
例:制作图片马上传成功,记住上传的路径。
需要注意的是,图片马上传之后需要利用文件包含漏洞去解析执行其中的脚本代码(可参考前面的博客:浅谈文件包含漏洞及靶场复现)
进入文件包含漏洞模块
提交查询抓包
构造pyload
放包,发现图片马已被解析。
用蚁剑链接url:http://192.168.43.223/pikachu/vul/fileinclude/fi_local.php?filename=../../unsafeupload/uploads/2021/02/05/236904601cfae770949682082280.jpg&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2,成功获取webshell。
1.3.4 上传.htacess文件绕过
通过上传.htacess文件来绕过上传限制的前提是Apache中的httpd.conf文件需要开启如下配置
Options FollowSymLinks
AllowOverride All
LoadModule rewrite_module modules/mod_rewrite.so
例:upload-labs pass4
通过提示发现已经对大多数文件扩展名进行了过滤。
上传.htacess文件,代码如下:
<FilesMatch "shell.jpg"> SetHandler application/x-httpd-php //将shell.jpg文件当做PHP文件来解析,若只上传这一句则表示将所有文件都当做PHP文件来解析 </FilesMatch>
再上传一个shell.jpg的图片马。(注意PHP+Apache版本5.4以上)
查看图片地址,用蚁剑链接成功。
文件上传漏洞的绕过姿势还有很多,以上只针对性的举例,更多的姿势可见:https://github.com/c0ny1/upload-labs
1.4 安全的文件上传
1.文件上传的目录设置为不可执行。即文件上传后放到独立的存储上,做静态文件处理。
2.判断文件类型,结合使用MIME Type、后缀检查等方式进行判断,也可添加白名单。
3.使用随机数改写文件名和文件路径。
5.单独设置文件服务器的域名。
二、文件下载漏洞
多数Web系统上都具有文件下载的功能,当我们点击下载这时前端会向后端发起一个下载请求,该请求内一般会包含下载的文件名称或路径。后端在收到该请求后,会执行相应的下载代码,这时后端会将所需下载的文件响应给浏览器,从而完成下载。
若攻击者精心构造一个下载路径,通过下载请求传至后端,后台如果没有相应的安全判断机制的话,则有可能直接将后台内的敏感信息、源代码等下载下来。所有与前端交互的数据都应当建起足够的验证策略。
例:点击下载其中一张图片。
抓取文件下载的请求包,发现参数kb.png
构造指定的下载路径和参数
放包,成功弹出下载unsafedownload.php源文件的response。