『文件上传漏洞』File Upload Vulnerabilities
基本概念
-
定义
由于服务器对文件上传路径变量过滤不严,并且对用户上传的文件后缀以及文件类型限制不严,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。
-
攻击条件
- 上传的文件能够被Web容器解释执行。上传后的目录是Web容器能覆盖的路径。
- 用户能够在Web上访问这个文件
- 上传的文件被安全检查、格式化、图片压缩等功能改变了内容,则攻击不成功
-
绕过文件上传检查功能
1)通过判断文件后缀名完成上传文件安全检查:黑客可以手动修改上传过程的post包,在文件名后添加一个
%00
字节,截断某些函数对于文件名的判断。例子:假设一个web应用仅允许上传 JPG ,例如可以通过手工修改post包,构造文件
xxx.php[\0].jpg
。对于Web应用来说,只会检查文件名的后缀是否符合要求,但是当文件上传到服务器后,服务器端的某些函数在处理文件名时,会将空字节之后的部分截断,因此最终存储在服务器上的文件变成了xxx.php
。攻击者可以利用这个文件执行任意PHP代码,达到攻击目的。2)判断上传文件的文件头:黑客可以伪造一个合法的文件头,把真实的PHP代码附在合法的文件头之后。但是注意这里文件的后缀需要是
.php
,因为后续仍然需要php来解释该文件,如果文件后缀名不是.php
的话web服务器不会解析。
Web服务器功能漏洞
web服务器本身存在很多的功能特性,而这些功能特性可以被利用成漏洞进行攻击
-
Apache文件解析问题
- 场景:在
Apache 1.x
和Apache 2.x
环境中,当Apache遇到不认识的扩展名时(没有定义在其/conf/mime.types
文件中),将会从后向前解析,直到碰到认识的扩展名。 - 例子:例如文件名为1.php.aa,首先解析aa扩展名,发现不认识继续向前面遍历,最终识别为1.php。
- 漏洞利用:Apache 并不认识 rar ,如果一个应用中要求用户上传rar,用户上传
webshell.php.rar.rar
,可以通过安全检查,但实际容器中解析为PHP文件执行
- 场景:在
-
IIS文件解析问题
- 场景:IIS是微软开发的一种web应用程序托管服务,曾出现过文件上传检查等问题
-
利用上传文件钓鱼
黑客上传了一个bmp文件去正常的网站。然后传播这个合法图片的URL。
其实这个bmp文件中包含了恶意代码,指向钓鱼网站。
防御
- 文件上传的目录设置为不可执行
- 只要web容器无法解析目录下的文件,即使攻击者上传了脚本文件,服务器也不会执行
- 判断文件类型:结合使用MIME Type,后缀检查
- 黑名单并不可行,使用白名单的方式
- 通过压缩函数处理图片,破坏图片中的HTML代码
- 使用随机数改写文件名和文件路径
- 在某些环境下,用户可以上传文件但并不能访问。可以使用随机数改写文件名和路径,使得用户无法访问到这个文件
- 单独设置文件服务器的域名
- 由于存在同源策略,一系列的客户端攻击失效。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 isoda's Blog!