文件上传漏洞的原理、危害及防御

一. 什么是文件上传漏洞

Web应用程序通常会有文件上传的功能, 例如在 BBS发布图片 , 在个人网站发布ZIP 压缩 包, 在办公平台发布DOC文件等 , 只要 Web应用程序允许上传文件, 就有可能存在文件上传漏 洞.

什么样的网站会有文件上传漏洞?

大部分文件上传漏洞的产生是因为Web应用程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护, 后面我们会讲 到一些常见的解析漏洞, 最后还有一些不常见的其他漏洞, IIS PUT 漏洞等 .

二. 文件上传漏洞的危害

上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者甚至 可以直接上传一个webshell到服务器上 .

三. 常见的解析漏洞

1.IIS 解析漏洞

IIS6.0 在解析文件时存在以下两个解析漏洞 .

①当建立 *.asa  、*.asp 格式的文件夹时 , 其目录下的任意文件豆浆被 IIS 当作 asp 文件 来解析 .

② 在 IIS6.0 下 , 分 号 后面 的 扩 展 名 不 会 被 解 析 , 也 就 是 说 当 文 件 为 *.asp;.jpg

时,IIS6.0 同样会以 ASP脚本来执行 .

2.Apache 解析漏洞

Apache 1.x Apache 2.x 中存在解析漏洞 , 但他们与 IIS 解析漏洞不同 .

Apache 在解析文件时有一个规则 : 当碰到不认识的扩展名时 , 将会从后向前解析 , 直到 碰到认识的扩展名位置 , 如果都不认识 , 则会暴露其源码 . 比如 :

1.php.rar.xx.aa

Apache 首先会解析 aa 扩展名 , 如果不认识则接着解析 xx 扩展名这样一直遍历到认识 的扩展名为止 , 然后再将其进行解析 .

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服务器的解析漏洞 .

4.Nginx <8.03 空字节代码执行漏洞

影响版本 :0.5,0.6,0.7<=0.7.65 0.8<=0.8.37

Nginx 在图片中嵌入 PHP代码 , 然后通过访问 xxx.jpg%00.php 可以执行其中的代码 .

5. 其他

windows  环境下, xx.jpg[ 空格 ] 或 xx.jpg. 这两类文件都是不允许存在的 , 若这样命 名,windows 会默认除去空格或点 , 攻击者可以通过抓包 , 在文件名后加一个空格或者点绕过 黑名单 . 若上传成功 , 空格和点都会被 windows 自动消除 , 这样也可以 getshell.

如果在 Apache 中 .htaccess 可被执行 . 且可被上传 . 那可以尝试在 .htaccess 中写入 :

SetHandlerapplication/x-httpd-php

然后再上传名称为 shell.jpg 的 webshell, 这样 shell.jpg 就可解析为 php 文件 .

四. 文件上传漏洞的防御方法

很多开发者仅仅通过使用 javascript 来防御非法文件上传这样验证对于一些普通用户防 止上传错误还可以 , 对专业的技术人员来说 , 这是非常低级的验证攻击者可以通过非常多的 方法来突破前端验证  , 下面举两个例子 :

1. 使用 FireBug

FireBug 是一款开源的浏览器插件 , 它支持 Firefox,Chrome 等浏览器 . 它可以让 Web 发者轻松地调试  HTML、javascirpt   AJAX、 CSS等前端脚本代码  . 正是因为 FireBug 功能强 大, 所以也成为了黑客的必备利器   .

如何使用 FireBug 绕过客户端检测 .

当单击提交按钮后 ,Form 表单将会触发 onsubmit 事件 ,onsubmit 事件将会调用 checkFile 函数 .checkFile 函数将会检测文件扩展名是否合法 , 并返回一个布尔值 , 如果 checkFile 函数返回 true, 则表单提交 , 反之则拦截要上传的文件 . 知道这一点后 , 可以用 FireBug 将 onsubmit 事件删除 , 这样就可以绕过 javascript 函数验证 .

2. 中间人攻击

中间人攻击和使用 FireBug 的方法完全不同 ,FireBug 是删除客户端的 javascript 验证 , 而使用 Burp Suite 等抓包软件则是按照正常的流程通过 javascript 验证 , 然后在传输中的 HTTP层做修改 .

首先把木马文件的扩展名字改为一张正常图片或文档的扩展名 , 如 jpg 扩展名在上传 时使用 Burp  拦截上传数据 , 再将其中的扩展名 jpg  修改成 jsp, 就可以绕过客户端验证 .

通过以上例子  , 大家可以看出前端脚本验证是一种非常不可靠的验证方式  , 不管是对文 件上传 、XSS还是别的漏洞来说都是如此 , 当然这并不是说完全不需要做前端验证而是要把 前端验证和服务器端验证相结合   .

我们来看服务端检测 , 在上传文件时 ,  大多开发者会对文件扩展名检测 , 验证文件扩展名 通常有两种方式 : 黑名单和白名单 .

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

为什么黑名单过滤是一种不安全的方式呢 ?

比如一个 Web服务器为 IIS6.0,Web 语言为 asp 的网站 , 假定开发者使用了黑名单过滤 ,

过滤了 asp、 asa、 cer 等文件格式 , 那么可以尝试以下几种方式来绕过 : 1. 大小写 , 比如 AsP、 cER等.

2. 被忽略的扩展名 ,IIS6.0 会把 cdx 格式的文件当成 asp 来解析 .

3. 配合解析漏洞 , 上传 asp;.jpg 格式文件 .

4. 如果 Web服务器开启了其他语言的支持 , 比如可以解析 php 文件 , 那么可以上传 php

格式的木马 .

5. 利用 Windows 系统自动去除 . 和空格的特性 , 如上传扩展名 asp. 格式的文件来绕过 .

通过以上几个例子可以看出 , 黑名单过滤的可靠性并不高 , 白名单过滤相对来说较为可靠.

白名单与黑名单的机智恰恰相反 , 黑名单是定义不允许上传的扩展名 , 白名单则是定义允许 上传的扩展名 , 虽然采用白名单可以防御未知风险 , 但是不能完全依赖白名单 , 因为白名单不 能完全防御上传漏洞 , 例如各种解析漏洞等 , 白名单仅仅是防御上传漏洞的第一步 . 通常会结 合其他验证方式来使用 , 虽然不能完全防御文件上传漏洞 , 但也基本上规避了绝大部分风险.。

其他几种文件上传漏洞防御方法 :

1. 检查文件上传路径 ( 避免 0x00 截断、 IIS6.0 文件夹解析漏洞、目录遍历 )

2. 文件扩展名检测 ( 避免服务器以非图片的文件格式解析文件 )

3. 文件 MIME验证 ( 比如 GIF 图片 MIME为 image/gif,CSS 文件的 MIME为 text/css 等 ) 3. 文件内容检测 ( 避免图片中插入 webshell)

4. 图片二次渲染 ( 最变态的上传漏洞防御方式 , 基本上完全避免了文件上传漏洞 )

5. 文件重命名 ( 如随机字符串或时间戳等方式 , 防止攻击者得到 webshell 的路径 )

另外值得注意的一点是, 攻击者上传了webshell之后需要得到webshell 的路径才能通过工 具连接 webshell, 所以尽量不要在任何地方 ( 如下载链接等 ) 暴露文件上传后的地址, 在这里 必须要提一点就是有很多网站的上传点在上传了文件之后不会在网页上或下载链接中暴露 文件的相对路径, 但是在服务器返回的数据包里却带有文件上传后的路径 .

 

posted @ 2018-06-13 21:25  _H0f  阅读(22777)  评论(0编辑  收藏  举报