Web安全——上传漏洞

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


1. 解析漏洞

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

① IIS 5.x / IIS 6.0 解析漏洞

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

2. 当文件为 .asp;1.jpg 这种类型的文件时,IIS 6.0 同样会以 ASP 脚本来执行
因为分号 ; 后面的不被解析,相当于被截断了。

3. .asp、.asa、.cer、.cdx 等文件后缀会被解析为 asp 脚本

4.说到 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 将会向前递归解析。

④ .htaccess 文件解析

若在 Apache 中的 .htaccess 文件且可被上传,那么若在其中写入:<FilesMatch "shell.jpg"> SetHandler application/x-httpd-php </FilesMatch>,然后再上传 shell.jpg 的木马,那么会被解析为 php 脚本。
因为该文件的意思是:将 shell.jpg 以 php 格式解析。


2. 绕过上传漏洞

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

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

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

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

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

②使用 FireBug 更改 js 本地验证的白名单
使用 FireBug 等工具在 js 本地验证代码中的白名单中加入原本不允许上传的文件后缀类型。

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

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

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

服务器端检测

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

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

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

  • 从黑名单中找到 Web 开发人员忽略的扩展名,如:cer、asa、cdx
  • 若没有对接收到的文件扩展名进行大小写转换操作,那么就可以根据大小写来绕过
  • 在 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 类型,就可以通过验证。

③ 双文件上传
可以在上传时使用 Burpsuite 抓包,然后发送到 Repeater 中,在其中添加需要上传的文件,就有可能绕过检测。因为在服务端可能只会检测第一个文件。


上传漏洞主要原因

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

  • 目录过滤不严:攻击者可能建立畸形漏洞
  • 文件为重命名:攻击者可以利用 Web 容器解析漏洞
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值