文件上传漏洞详解1

什么是文件上传

文件上传是一个网站的常见功能,多用于上传照片、视频、文档等许多类型文件。

一般文件上传的流程如下:

前端选择文件进行提交。

浏览器形成POST Multipart报文发送到服务器。

服务器中间件接收到报文,解析后交给相关后端代码进行处理。

后端代码将上传的文件类容写入到临时文件中 (php特有)。

写入到文件中,文件名为提交的文件名或是以一定规则生成的文件名。

什么是文件上传漏洞

当文件上传点未对上传的文件进行严格的验证和过滤时,就容易造成任意文件上传,包括上传动态的文件(asp/php/jsp等等)。

如果上传的目标目录没有限制执行权限,导致所上传的动态文件(比如webshell、木马,病毒,恶意脚本)可以正常执行并且可以访问,即造成了文件上传漏洞。

总之,存在文件上漏洞的必要条件是:

存在上传点

可以上传动态文件

上传目录有执行权限,并且上传的文件可以执行。

可以访问到上传的动态文件

文件上传漏洞检测流程

为了防止恶意文件上传,上传文件到写入服务器要经过上图所示的一系列检验,而对于我们渗透测试人员就要想办法绕过这些检验。下面我们就来讲解这些绕过方法。

客户端检测绕过

客户端检测一般只检测扩展名

顾名思义,就是在文件被上传到服务端的时候,对于文件名的扩展名进行检查,如果不合法,则拒绝这次上传

在这里,还有一点是值得一提的,在检查扩展名是否合法的时候,有两种策略

黑名单策略,文件扩展名在黑名单中的为不合法,示例代码

白名单策略,文件扩展名不在白名单中的均为不合法

白名单策略是更加安全的,通过限制上传类型为只有我们接受的类型,可以较好的保证安全,因为黑名单我们可以使用各种方法来进行注入和突破

客户端进行的检测,可通过对客户端代码的一些修改或者直接拦截修改报文即可绕过,所以这种上传限制等于没有。

1.前端JAVAscript的检测一般是在事件当中,一般来说在 onsubmit事件当中。

对于这种检测我们只需要通过浏览器的审查元素功能,删除其中的检测函数即可,如下图我们删除红线标示的检查函数即可上传没有在白名单的文件

2.拦截报文修改绕过

首先选择正常的文件进行上传

然后通过burpsuite进行截包改包完成文件上传

这种方法前端检测绕过通用,无需理会具体的前端检测代码,直接绕过前端进行上传报文的修改并提交

如下图所示,我们只需要在上传文件前,把php文件扩展名改成白名单允许的扩展名,然后点击上传,然后通过burpsuite截包,然后把扩展名修改回来,即可绕过前端的检测。

服务器检测绕过

前端检测通过截包改包的方式可以绕过绝大部分检测,但服务器检测需要我们去猜测检测方法,具体检测了哪些点具体检测了哪些位置。

在服务器检测中一般会检测如下几个位置:

1.文件名或者说是文件扩展名。

2.MIME/TYPE(浏览会根据文件扩展名进行选择)。

3.文件类容。

MIME类型绕过

MIME(Multipurpose Internet Mail Extensions)是描述消息类容类型的因特网标准。

MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。

浏览器会自动根据上传文件的扩展名,对应到相应的类型上。

我们也只需要通过抓包,如下图把Content-Type:后面类容改成MIME TYPE 白名单类型即可绕过。

文件类容检测绕过

文件类容检测绕过一般分为检测文件是否是我们所期望的文件类型,也就是图片上传点上传的是否为图像,另一种就是检测文件中是否存在恶意类容。

首先我们来看文件是否为所期望的类型。

1.简单文件头检测

文件头是位于文件开头的一段承担一定任务的数据,一般都在开头部分。

文件头的起始部分中一般开头标记文件类型。如gif文件头为GIF89a或 GIF87a。

如下图所示代码为文件头检测函数,是通过文件头的起始部分进行匹配,是比较简单的文件类型检测方法。

这种简单的只对文件头进行匹配的方法,可以通过在上传的文件前追加合法的文件头进行绕过。

如下图所示,我们只需要在文件类容前面加上GIF89a即可饶过上传。

2.完整文件检测绕过

通过调用图像函数 (如getimagesize / imagecreatefromgif / imagecreatefrompng)进行检测文件是否为图像,需文件内容保持相对完整,所以无法通过追加文件头部起始字节的方法进行绕过。

针对这种检测可以将图片文件与欲上传文件进行合并来绕过检测。合并后的文件只要没有经过清洗或缩放等操作即可通过检测,并保持欲上传文件的完整。由于上传文件图片部分在解析为PHP时会以乱码显示,建议与尽量小的图片文件进行合并,否则会有大量的乱码。

可以通过copy命令进行合并

首先我们用windows自带画板工具生成1*1像素的GIF图片文件,取名为main.gif。

然后打开CMD,用下图命令把 main.gif和phpinfo.php文件合并,新文件名为phpinfo_gif.php。这样就可以绕过。

3.恶意文件类容检测

检测提交类容中是否包含webshell等数据。

推荐使用强混淆的weevely进行尝试,kali中自带。

https://github.com/sunge/Weevely

或尝试开源的webshell手机项目:

http://github.com/tennc/webshell

恶意文件常见关键字:

eval

base64_encode

assert

java.lang.Runtime

java.lang.ProcessBuilder

服务端绕过小技巧

1.文件参数多filename属性

文件上传过程中,如果存在waf拦截一些扩展名,可以通过尝试多个filename属性。

如下图左侧filename有两个filename属性,filename="phpinfo.png"; filename="phpinfo11.php",右侧显示phpinfo11.php上传成功。如果waf取值是filename="phpinfo.png",而服务器取值是filename="phpinfo11.php",哪么就可以绕过,这种情况主要针对于waf的取值与服务器的取值有差异进行。

2.目录可控时可以尝试目录穿越的方法

下图是一段配置文件,意思是在D:/www/liuxing/upload/目录下匹配到扩展名为php|php3|php4的文件则不能访问,也就是说我们将文件上传到这个目录下是无法进行执行的。

但是如果目录在可控的情况下,我们可以吧文件上传到别的没有被禁止路径下进行执行。

如下图我们输入../../,上传到前两级目录,就可以执行了。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180723G07LHC00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券