Update 2017.3.3:其实重新整理这个就是因为一直想做一个有关与上传漏洞的测试平台,就像SQLiLAbs一样的,不过进度缓慢。。。

上传漏洞

上传漏洞是在正常的客户端和服务端上传文件过程的基础上产生的。

通常一个文件以 HTTP 协议进行上传时,将以 POST 请求发送至 web 服务器 web 服务器接收到请求后并同意后,用户与 web 服务器将建立连接,并传输 data

在这个过程中,如果没有对文件名等信息进行检测就会产生上传漏洞。

下面说下常见的文件上传检测,以及常见的绕过方式。

文件上传的检测和绕过

通常,针对上传文件的检测有两种:客户端检测、服务端检测。在安全性上,服务端检测安全性更高。

客户端检测与绕过方法

这里说的客户端通常指浏览器,当然也可能是其他平台的应用,如安卓,苹果等。

这里用浏览器端举例,来使用这种检测方式的 WEB 应用已经不是很多了。

在浏览器进行客户端检测使用JavaScript,由于JavaScript直接在页面上执行,文件上传之前就会有相应,一般遇见这种情况就可以判断是前端验证了。

现在市面上的浏览器大都支持查看修改网页源码的功能,这样就可以通过修改、删除JavaScript代码,轻松绕过前端的JavaScript检测。

或者使用Burpsuite等工具代理,绕过浏览器的过滤。

如果有还在使用这种检测方法的网站或者有使用JavaScript校验文件的开发者,强烈建议打消念头,这种检测方式形同虚设,bypass成本太低。

服务端检测与绕过方法

服务端对上传文件进行检测的方法有:

  • MIME检测
  • 目录路径检测
  • 文件扩展名检测
  • 文件内容检测

MIME检测与绕过

多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支援:非ASCII字符文本; 非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)。 这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。

简单地说,MIME就是区分多媒体文件的一种标准。其中经常见得就是在HTTP请求中夹带的Content-Type(内容类型),在这里重点说的也就是它。

如果尝试上传一个asp木马,服务器会收到一个含有Content-Type:application/octet-stream的请求,当服务器发现了这个文件类型并不安全时,就会拒绝文件上传。

如果服务端仅仅检测MIME类型的话很容易就会被bypass。

通过Burpsuite等工具抓包,修改Content-type为服务器允许的类型如:image/gif 进行绕过。

也有服务端会同时检查文件流的长度,也就是Content-length,如果上传文件的大小和这个值对不上,服务器也会拒绝文件上传。

所以在绕过的过程中,如果出现了Content-length时不要忘了修改文件大小。

目录路径检测与绕过

如题,这种检测方法是直接检测路径是否合法,这种检测方法通常使用阶段进行bypass,常见的截断字符如下

\0
?
%00

文件扩展名检测与绕过

文件名检测较为常见,检测方式分两种:

  • 黑名单检测
  • 白名单检测

黑名单,即通过设置不允许上传的文件扩展名进行文件检测。由于可能做到考虑不周稳we如果扩展名有所遗漏则会造成Bypass,所以黑名单安全性较低。

对于黑名单的绕过,有下面几种:

  • 名单绕过
  • 文件名绕过
  • 特殊文件名绕过
  • 截断绕过
  • 解析漏洞绕过

白名单,即通过设置可以上传的文件进行文件检测。白名单相比黑名单更加安全,但是也不是万无一失的常见的绕过方法就是解析漏洞。

下面详细总结常见的绕过方式

名单绕过

通过上传不同文件进行测试绕过黑名单,常见容易被忽略的文件名有

asa
cer

文件名大小写绕过

通过上传 Asp或者PhP等文件名进行绕过

特殊文件名绕过

针对windows系统特性,在文件名后加入. 这三种字符,windows系统会自动清除这些字符即可完成绕过。

解析漏洞

提到了文件上传,必不可少的要介绍下解析漏洞,Apache/IIS/Nginx 都曾经出现过解析漏洞,通常有解析漏洞,只要有上传点就能省略不少功夫。

Apache的解析漏洞比较像名单绕过,通过将要上传的文件命名为下面的形式:

test.php.rar.cer...

在存在漏洞的Apache的服务器上,Apache服务器会从最末尾的一种扩展名往前解析,当遇到可以解析的扩展名就会解析文件。

个人感觉IIS解析漏洞最经典,一般的文章将上传漏洞就会讲到IIS6.0的解析漏洞,常见的姿势有下面三种:

目录解析:

test.asp/test.jpg

IIS服务器会将test.asp目录内所有的文件当做asp文件进行解析,执行。

文件名解析:

test.asp;test.jpg

IIS服务器不会解析;后面的文件,进而执行前面的asp文件。

PHPCGI解析漏洞,这个漏洞影响了IIS7.0以及Nginx两个中间件。绕过姿势:

test.jpg/test.php

文件内容检测与绕过

针对上传漏洞,文件内容检测通常就是最后的防御方法了,通过对文件内容进行校验来判断文件是否安全。

文件幻数检测

幻数在许多操作系统的程序中很常见。幻数实现强类型数据并且是在程序运行时读取数据类型的控制程序的带内信令形式。许多文件都带有这样标示所包含数据的常量。在文件中检测这样的常数是区分文件简单有效的一种方式,并且这样可以进一步的运行时间信息。

用vim可以查看文件的幻数

vim -b file
:%!xxd

PNG:

magic_number-1

JPG:

magic_number-2


Monburan

好奇|爱折腾