2.9文件上传漏洞
1.两个著名的文件上传漏洞
1)IIS 6.0文件上传漏洞
- 在建立一个目录名为a.asp,该目录下所有文件均可被解析为asp文本。
- 建立文件a.asp;1.jpg,分号将会被截断,仍旧作为a.jsp被解析。
设想如果恶意用户写了一段具有破坏性质的asp脚本,命名为a.asp;1.jpg,上传到网站服务器上,然后运行这个文件,不就可以达到攻击的目的了。
2)Apache文件上传漏洞
在Apache1.X和2.X中,建立一个文件为1.php.rar,由于rar文件没有在%APACHE_HOME%/conf/mime.types定义,所以会被误认为是1.php文件。和IIS 6.0文件上传漏洞一样,如果恶意用户写了一段具有破坏性质的php脚本,命名为1.php.rar,上传到网站服务器上,然后运行这个文件,也就可以达到攻击的目的。
2.绕过前端检查
有如下HTML代码。
<form action="http://doUpload.jsp"method="post" enctype="multipart/form-data"> 请选择要上传的文件<input type="file" name="upfile"size="50"> <input type="button"value="提交" id="submit"onsubmit="checkFileType()">
点击【提交】按键,运行javascript函数checkFileType(),只有后缀为jpg、png、gif、bmp格式的文件才可以上传。黑客写了一段具有破坏性质的jsp代码,命名为1.jpg。1.jpg这个文件可以绕过前端javascript函数checkFileType()检查,这个时候用类似于Burn Suite的截包工具把这个HTTP请求截获,改名为1.jsp,如30所示。
30 上传文件绕过前端检查
发送修改好的请求包,这样一个名为1.jsp带有恶意代码的文件就被上传到服务器上。
3. 文件上传的防护方法
由上面的例子可以看出,仅仅在前端进行防护是远远不够的,重要的是在后端进行防护检验。
1)黑名单法
BlackList=array('asp','asa','aspx');
对于黑名单而言,不允许上传在黑名单里面的文件。用这种方法好像可以解决文件上传问题,但是这种方法是不推荐的,主要因为。
- 容易遗漏:使用黑名单,对有些文件类型是很容易遗漏的。
- Windows大小写不敏感:如果服务器是Windows,这里定义了'asp','asa','aspx',如果用户上传的是1.ASP文件是否可以接受?
2)白名单法
WhiteList=array('jpg','png','bmp','gif');
上面程序是一个典型的白名单,只允许白名单里面的文件被上传。使用这种方法是相对比较安全的。
另外,检查文件类型不要仅仅通过文件后缀去判断,对于后端建议采用基于MIME属性去判断。下面代码是JAVA获得文件属性的一种方法。
importjavax.activation.MimetypesFileTypeMap; import java.io.File; class GetMimeType { public static void main(String args[]) { File f = newFile("gumby.gif"); System.out.println("Mime Type of" + f.getName() + " is " + newMimetypesFileTypeMap().getContentType(f)); // expected output : // "Mime Type of gumby.gif isimage/gif" } }
3)其他措施
处理检查文件类型,还可以使用以下三个方面进行加固。
- 确保上传的目录是不可执行的:如果被上传上来的文件是不可以运行的,中途即使被截获修改了名称也是无所谓的。
- 上传后修改文件名:对于上传上来的文件修改文件名,比如可以把类似于mysql.ini文件改名为1.ini,从而使其失去作用。
- 单独设置文件服务器的域名。设置单独的文件服务域名是一种不错的选择,这样类似于XSS注入也受到了一定控制。