刘仁珩 甘肃联通兰州分公司 甘肃兰州 730030
上传漏洞原理及防范
刘仁珩 甘肃联通兰州分公司 甘肃兰州 730030
件名称,因为许多Web应用都会修改上传文件的文件名称,那么这时就需要结合其他漏洞去获取到这些信息。如果不知道上传文件的存放路径和文件名称,即使你上传了也无法访问。
通常web 站点会有用户注册功能,而当用户登录之后大多数情况下都会存在类似头像上传、附件上传一类的功能,这些功能点往往存在上传验证方式不严格的安全缺陷,是在web 渗透中非常关键的突破口,只要经过仔细测试分析来绕过上传验证机制,往往会造成被攻击者直接上传web 后门,进而获取整个web业务的控制权,复杂一点的情况是结合web server 的解析漏洞来上传后门获取权限的。
通常一个文件以HTTP协议进行上传时,将以POST请求发送至web 服务器,web 服务器接收到请求并同意后,用户与web 服务器将建立连接,并传输data。
主流的文件上传检测方式有以下五种:
◎A 客户端 javascript 检测(通常为检测文件扩展名)
◎B 服务端 MIME 类型检测(检测Content-Type内容)
◎C 服务端目录路径检测(检测跟path 参数相关的内容)
◎D 服务端文件扩展名检测(检测跟文件extension 相关的内容)
◎E 服务端文件内容检测(检测内容是否合法或含有恶意代码)
1)客户端 javascript 检测
客户端检测通常在上传页面里含有专门检测文件上传的javascript代码,在文件被上传之前进行检测,最常见的就是检测上传文件的文件类型和大小是否合法。
2)服务端MIME类型检测
这类检测方法通过检查http包的Content-Type字段中的值来判断上传文件是否合法。
3)服务端文件扩展名检测
这类检测方法通过在服务端检测上传文件的扩展名来判断文件是否合法。
4)服务端目录路径检测
这类检测一般通过检测路径是否合法来判断。
5)服务端文件内容检测
这类检测方法相当对上面四种检测方法来说是最为严格的一种。它通过检测文件内容来判断上传文件是否合法。这里,对文件内容的检测主要有两种方法。A、通过检测上传文件的文件头来判断。通常情况下,通过判断前10个字节,基本就能判断出一个文件的真实类型。B、文件加载检测,一般是调用API或函数对文件进行加载测试。常见的是图像渲染测试,再严格点的甚至是进行二次渲染。
上面我们分析了主流的文件上传检测方式,下面我们就来看下如何绕过上面提到的文件上传检测方式。
3.1 客户端绕过
在对上传文件进行文件类型判断时,如果使用客户端脚本(javascript)来检测文件合法性,则程序必定会存在上传漏洞,由于客户端脚本仅作用于客户端环境,无法校验最终需要发送的数据,导致该种检测方法失效。
实例代码:
3.2 服务端绕过
在对上传文件类型使用服务端验证时,由于验证方式及代码逻辑存在漏洞,也会导致上传绕过。例如,在如下php文件类型检测脚本中,服务端通过MIME类型来检测文件合法性,则攻击者可以通过伪造MIME类型来达到欺骗应用程序上传非法文件的目的。
实例代码:
得到服务端的应答,服务端MIME检测方式被成功绕过。
在实际编码过程中,服务端绕过的例子不仅仅局限于MIME绕过,此处不做一一例举。
文件解析漏洞是指,由于文件自身在文件名解析方面存在的bug,导致正常合法文件被当作脚本文件来解析。如IIS解析漏洞、NGINX解析漏洞等。攻击者通常会利用上传模块上传一个文件名合法的webshell脚本,然后利用解析漏洞去执行。
4.1 1IIS 解析漏洞
IIS6.0 在解析asp 格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,那么这个目录下所有的文件都会按照asp 去解析,另一个是只要文件名中含有".asp;"会优先按asp 来解析。
IIS7.0/7.5 是对php 解析时有一个类似于Nginx 的解析漏洞,对任意文件名只要在URL后面追加上字符串"/任意文件名.php"就会按照php 的方式去解析。
4.2 Nginx 解析漏洞
nginx是一款高性能的web服务器,使用非常广泛,其不仅经常被用做反向代理,也可以非常好的支持PHP的运行。80sec发现其中存在一个较为严重的安全问题,默认情况下可能导致服务器错误的将任何类型的文件以PHP的方式进行解析,这将导致严重的安全问题,使得恶意的攻击者可能攻陷支持php的Nginx服务器。
目前Nginx 主要有这两种漏洞,一个是对任意文件名在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php 进行解析攻击。还有一种是对低版本的Nginx 可以在任意文件名后面添加%00.php 进行解析攻击。
通过对上传漏洞原理的了解,我们将从以下几个层面着手对其进行防护:
5.1 弃用客户端检测
由于客户端检测方式自身缺陷导致该检测方式容易被绕过,因此,在对上传文件类型进行验证时应避免使用客户端检测方式。
5.2 弃用MIME检测
由于MIME检测中MIME数据容易被伪造,因此,在对上传文件类型进行检测时应该弃用MIME检测。
5.3 文件名检测
使用白名单规定上传文件类型检测时应注意区分大小写。
5.4 文件内容检测
对所要上传的文件内容进行检测,判断其内容是否合法,是否符合上传文件类型要求。
[1] 王江为.基于ASP上传源码的漏洞分析及解决策略研究[M].安徽:电脑知识与技术,2012
[2] 张新杰.网络编程文件的上传漏洞以及解决方法[M].河北:价值工程,2012
[3] 白兴瑞.高校WEB站点的上传漏洞分析及防范[M].河北:衡水学院学报,2011