Web安全——上传漏洞

Web 应用程序通常会有文件上传的功能,只要 Web 应用程序允许上传文件,就有可能存在文件上传漏洞。
怎么确认 Web 应用是否存在上传漏洞呢?如果当文件上传时没有对文件的格式做验证,导致用户可以上传任意文件,那么这就是一个上传漏洞。


1. 解析漏洞

攻击者在利用上传漏洞时,通常会与 Web 容器的解析漏洞配合在一起。

① IIS 解析漏洞

IIS 6.0 在解析文件时存在以下两个解析漏洞。

1. 当建立 .asa、.asp 格式的文件夹时,其目录下的任意文件都将被 IIS 当做 asp 文件来解析
如:建立文件夹 parsing.asp,在该文件夹内新建一个文本文档 test.txt,其内容为 NOW()
NOW() 是 ASP 提供获取当前时间的函数,而 txt 是文本文档格式,正常情况下 IIS是不会去解析此类文件的,而应该是会直接显示其内容;但是当其在 parsing.asp 这种以 .asp 为后缀的文件夹下时,会被当做 ASP 脚本来解析。

② 当文件为 .asp;1.jpg 这种类型的文件时,IIS 6.0 同样会以 ASP 脚本来执行

说到 IIS 容器,就不得不说一个经典漏洞,漏洞名为 WebDav
WebDav 是一种基于 HTTP1.1 协议的通信协议,它扩展了 HTTP 协议,在 GET、POST、HEAD 等几个 HTTP 标准的方法以外添加了一些新的方法,使 HTTP 协议更加强大。

在开启 WebDav 扩展的服务器,如果支持 PUT、MOVE、COPY、DELETE 等方法,就可能会存在安全隐患。

下面简单描述一下基于 IIS 6.0 Web 容器的攻击方式:
① 通过 OPTIONS 探测服务器所支持的 HTTP 方法

OPTIONS / HTTP/1.1
Host: www.xxx.com

若是响应的数据包中的 Allow 头部中反悔了支持 PUT、MOVE、COPY、DELETE 等方法则可进行下一步。

② 通过 PUT 方法向服务器上传脚本文件

PUT /a.txt HTTP/1.1
Host: www.xxx.com
……

③ 通过 MOVE 或 COPY 方法改名

COPY /a.txt HTTP/1.1
Host: www.xxx.com
Destination: http://xxx.com/cmd.asp

通过以上三步就可以把一个攻击文件放到以 .asp 结尾的文件夹中,然后 IIS 6.0 则会把该攻击文件当做 asp 文件解析。导致攻击成功。

② Apache 解析漏洞

在 Apache 1.x 和 Apache 2.x 中存在解析漏洞:当碰到不认识的扩展名时,将会从后往前解析,直到碰到认识的扩展名为止,如果都不认识,则会暴露其源代码。

如:1.php.rar.xs.aa;Apache 首先会解析 aa 扩展名,如果不认识将会解析 xs 扩展名,这样一直遍历到认识扩展名为止,然后再将其解析。

在 Apache 安装目录下 /conf/mime.types 文件中有 Apache 详细的扩展名列表。

③ PHP CGI 解析漏洞

Nginx 曾经也被爆出两个解析漏洞。如:访问 http://www.xxx.com/1.jpg/1.php,此时的 1.jpg 会被当做 PHP 脚本来解析。

这就意味着攻击者可以上传合法的图片木马,然后在 URL 后面加上/xxx.php 就可以攻击成功。

这种漏洞其实不是 Nginx 独有的,在 IIS 7.0、IIS 7.5、Lighttpd 等 Web 容器中也出现了这样的解析漏洞。
这种解析漏洞后来被发现其实是 PHP CGI 漏洞。在 PHP 的配置文件中有一个关键选项:cgi.fi: x_pathinfo。
当在该选项在开启时访问 URL,如果访问http://www.xxx.com/x/txt/x.php ,若 x.php 是不存在的文件,那么 PHP 将会向前递归解析。


2. 绕过上传漏洞

程序员在防止上传漏洞时可以分为以下两种:

  • 客户端检测:客户端使用 JavaScript 检测,在文件未上传时就对文件进行验证;
  • 服务器端检测:服务器端脚本一般会检测文件的 MIME 类型,检测文件扩展名是否合法
绕过客户端检测

通常程序员会使用 JavaScript 对文件扩展名验证,如果不是白名单中的扩展名,那么 Form 表单将不会提交至服务器。

①使用 FireBug
FireBug 是一款开源的刘拉你插件,支持 FIrefox、Chrome 等浏览器,可以轻松地调试 HTML、JavaScript、AJAX、CSS 等前端脚本代码。

攻击方法:
如:当单击 “提交” 按钮后, Form 表单会出发 onsubmit 事件,onsubmit 事件将会调用 checkFile 函数,该函数会检测文件扩展名是否合法,并返回一个布尔值。如果返回的是 true 则表单提交,反之则不提交。我们可以使用 FireBug 将 onsubmit 事件删除,这样就可以绕过 JavaScript 函数验证。

② BurpSuite 的中间人攻击
使用 BurpSuite 按照正常的流程通过 JavaScript 验证,然后在传输中的 HTTP 层进行绕过。

若是在上传图片的地方上传攻击文件,那么首先把木马文件扩展名改为一张正常图片的扩展名,然后在上传时使用 BurpSuite 拦截上传数据,再将其中的扩展名修改为相应的后缀名,就可以绕过客户端验证。

注:在 HTTP 协议中有请求头 Content-Length,代表实体正文长度。当文件名修改后,也就意味着实体正文长度增加或减少了,此时就应该做相应的修改,否则可能会上传失败。

服务器端检测

在服务器端的检测主要有以下几种方式:白名单与黑名单扩展名过滤、文件类型检测、文件重命名等。

①白名单与黑名单验证
一:黑名单过滤
黑名单过滤是一种不安全的方式。黑名单定义了一系列不安全的扩展名,服务器端在接收文件后,会与黑名单扩展名对比,如果发现文件扩展名与黑名单里的扩展名匹配,则认为文件不合法。

有以下几种方式来绕过黑名单检测:

  • 从黑名单中找到 Web 开发人员忽略的扩展名,如:cer 等
  • 若没有对接收到的文件扩展名进行大小写转换操作,那么就可以根据大小写来绕过
  • 在 Windows 系统下,如果文件名以 “.” 或者空格作为结尾,系统会自动去除 “.” 与空格,利用此特性也可以绕过黑名单验证。如:上传 “asp.” 或者 “asp ”。

二:白名单过滤
白名单是定于允许上传的扩展名,拥有比给名单更好的安全防御机制。但是白名单也不能完全防御上传漏洞。
如:Web 容器为 IIS 6.0 的服务器中,若攻击者把木马文件名改为 a.asp;1.jpg 上传,此时的文件为 jpg 格式,是白名单中允许的,从而可以顺利通过验证,但是 IIS 6.0 会把该文件当做 asp 脚本程序来执行。

② MIME 验证
MIME 类型用来设定某种扩展名文件的打开方式,如 GIF 图片MIME 为 image/gif,CSS 文件 MIME 类型为 text/css。

可以使用 BurpSuite 修改 MIME 类型来绕过验证。
如:上传的攻击文件是 php 类型的,用 BurpSuite 拦截查看 MIME 类型,可以发现php 文件的 MIME 类型为 application/php,可以在 HTTP 请求中的 Content-Type 头中将类型更改为 image/jpeg 类型,就可以通过验证。


上传漏洞主要原因

上传漏洞最终的形成原因主要有以下两点:

  • 目录过滤不严:攻击者可能建立畸形漏洞
  • 文件为重命名:攻击者可以利用 Web 容器解析漏洞

猜你喜欢

转载自blog.csdn.net/weixin_43915762/article/details/87913172