文件上传安全性分析

出自sebug security vulnerability(SSV) DB
跳转到: 导航, 搜索

目录

引言

要详细研究清楚怎么去绕过文件上传,就需要对文件上传的检测机制研究清楚,参照Acunetix和其他文章进行了阅读并大概做一个笔记。

检测机制及绕过

case1:Simple file upload form with no validation

这种情况就是直接使用php直接上传,不检测任何安全。

case2:Mime Type validation

通过$_FILES[‘uploadedfile’][‘type’] 检测属性。这样的是不安全的,可以伪造的。

case3:Block dangerous extensions

通过把一些后缀加入黑名单,然后获取文件后缀进行检测。 用户可以很容易的通过这种验证

A malicious user can easily bypass such check by uploading a file called “.htaccess”
which contains a line of code similar to the below:
AddType application/x-httpd-php .jpg

case4:Double extensions (part 1)

双重验证,但是是通过.来取得后缀的。 绕过方式,查看服务器软件怎么解析双重后缀的文件:

apache:

Therefore a file named ‘filename.php.123’
will be interpreted as a PHP file and will be executed.
This only works if the last extension (in our case .123)
 is not specified in the list of mime-types known to the web server.

这种情况,只允许第二个后缀是服务器无法解析的就可以成功。

这类攻击可以运用在基于黑名单过滤的系统中。

Case 5: Double Extensions (Part 2)

这类方式是程序员采用了白名单的方式进行上传过滤。 但是这种情况有时候也不是运行很好。 涉及到apache解析php的模式,有两种模式AddHandler 指令或者使用AddType指令: 使用AddHandler 指令:所有文件名中包含.php的文件都会被解析成php。(.php.jpg),如果你的配置文件中包含下面的指令就会存在漏洞。

AddHandler php5-script .php

case6:Check the image header

检测文件头

当只有image文件可以上传的时候,程序员一般使用函数getimagesize.来检测文件头。函数被调用的时候就会返回图像的文件头大小。如果文件是非法的,那么就会出错。一般程序员就会根据这个返回结果来检测图片的合法性。如果使用一般的伪造方法上传一个shell,那么就不会通过,这时候我们可以使用往正常的图片中添加额外代码实现这个功能。比如说comment属性里面。

然后结合解析漏洞就可以实现了。

case7:Protecting the upload folder with .htaccess

另外一种保证上传文件的安全性的办法就是使用文件夹的安全性限制,可以通过.htaccess文件来实现,限制文件夹的执行属性。通常.htaccess文件有下面的一些规则:

AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .htm .shtml .sh .cgi
Options –ExecCGI

上面的这种方法是另外一种黑名单的方式,但是这个限制本身都存在安全问题。在php参考手册中,在move_uploaded_file字段中,当文件存在的时候就会警告,会重写原来的文件。

正因为这样,.htaccess文件可以被重写或者覆盖。

case8:Client-side validation

另外一种方式就是客户端的文件检测,这种情况在ASP.NET程序中更常见,因为他提供了一些安全检测机制。

一般是通过正在匹配来实现的。

因为是在客户端进行的检测,所以可以顺利的绕过检测。

解决方案

从下面几个方面去解决文件上传问题。

placed in the parent directory.

deny from all
<Files ~ “^\w+\.(gif|jpe?g|png)$”>
order deny,allow
allow from all
</Files>

• Don’t rely on client-side validation only, since it is not enough. Ideally one should have both server-side andclient-side validation implemented.

Reference

Why-File-Upload-Forms-are-a-Major-Security-Threat.pdf

https://www.owasp.org/index.php/Unrestricted_File_Upload

个人工具
名字空间
变换
导航
工具箱