文件上传漏洞
概述
文件上传漏洞是指服务端未对客户端上传的文件进行严格的验证和过滤,导致用户可以上传一个可执行脚本,并且能通过脚本获得了执行服务器端命令的能力
危害
非法用户可以利用上传的恶意脚本文件控制整个网站,甚至控制服务器.这个恶意脚本文件,又被称为Webshell,也可将Webshell称为一种网页后门,Webshell脚本具有非常强大的功能,比如查看服务器目录,服务器中的文件执行系统命令
- 上传的文件是web脚本语言,服务器的web容器解释并执行了用户上传的脚本,导致代码执行;
- 上传的文件是flash的策略文件crossdomain.xml,黑客用以控制flash在该域下的行为(其他通过类似方式控制策略文件的情况类似)
- 上传文件是病毒,木马文件,黑客用以诱骗用户或管理员下载执行
- 上传文件是钓鱼图片,或包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈
攻击实现的前提条件
首先上传的文件能被Web容器执行解释,所以文件上传后所在目录要是web容器所覆盖到的路径
其次,用户能从web上访问这个文件.如果文件上传了,但用户无法通过web访问,或者无法使得web容器解释这个脚本,那也不能称之为漏洞
最后,用户上传的文件若能被安全检查,格式化,图片压缩等功能改变了内容,则也可能导致攻击不成功
攻击方式
1.JS检测绕过攻击
JS检测绕过上传漏洞常见于用户选择文件上传的场景,如果上传文件的后缀不被允许,则会弹窗告知,此时上传文件的数据并为发送到服务端,只是在客户端使用javascript对数据包进行检测
这时,有两种方法绕过:
- 使用浏览器插件,删除检测文件后缀的JS代码,然后上传文件绕过即可
- 首先把需要的文件后缀改成允许上传的绕过js的检测,再抓包,把后缀名改成可执行文件的后缀名即可上传成功
2.文件后缀绕过攻击
文件后缀绕过攻击是服务端代码中限制了某些后缀的文件不允许上传,但是有些Apache是允许解析其他文件后缀的,例如在httpd.com中,如果配置中有
AddType application/x-httpd-php .php .phtml
则能够解析php和phtml文件
在apach的解析顺序中,是从右至左开始解析文件后缀,如果最右侧的扩展名不可识别,就继续往左判断,知道遇到可以解析的文件后缀为止,所以如果上传的文件名类似1.php.xxxx,因为后缀xxxx不可解析,所以向左解析后缀php
3.文件类型绕过攻击
如果服务端是根据客户端上传文件时,发送的数据包里的Content-Type值来判断文件类型,则修改Content-Type即可绕过服务端检测
服务端$_FILES["file"]["type"]
中的type就是客户端传的Content-type值,所以修改Content-Type可绕过$_FILES["file"]["type"]
PHP函数getimagesize()
可以获取图片的宽高等信息,如果上传的不是图片文件,那么getimagesize()
就获得不到信息,不允许上传,但是我们可以将一个图片和一个Webshell合并为一个文件,例如使用cat 1.image webshell.php >image.php
,此时使用getimagesize()
就可以获取图片信息,且webshell的后缀是php,也能被apache解析为脚本文件,通过这种方式就可以绕过getimagesize()
的限制
4.文件截断绕过攻击
截断类型:PHP%截断
截断原理:由于00代表结束符,所以会把00后面的所有字符删除
截断条件:php版本小于5.3.4,php的magic_quotes_gpc未Off状态
在多数情况下,截断绕过都是用在文件名后面加上HEX形式的%00来测试,例如filename='1.php%00.jpg'
,但是由于在php中,$_FILES["file"]["name"]
在得到文件名时.%00后的内容已经被截断,所以$_FILES["file"]["name"]
得到的后缀名是php,不是php%00.jpg
,因此不能通过if(in_array($file_ext,$ext_arr))
的检查
5.竞争条件攻击
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含Webshell脚本,如果包含则删除该文件.
这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者就可以利用这个时间差完成竞争条件的上传漏洞攻击
文件上传防御策略
- 文件上传目录设置为不可执行
- 只要web容器无法解析该目录下的文件,即使上传了脚本文件,服务器也不会受到影响
- 判断文件类型
- 判断类型时,结合使用MIME Type,后缀检查等方式
- 文件检查时使用白名单的方式
- 对于图片的处理可以使用压缩函数或者resize函数,用来破坏图片中可能存在的HTML代码
- 使用随机数改写文件名和文件路径
- 文件上传如果要执行代码,需要用户能访问到这个文件
- 使用随机数更改文件路径和文件名,极大增加了攻击成本
- 此外文件重命名可以使
.shell.php.rar
,crossdomain
这种文件所实施的攻击无法成功
- 单独设置文件服务器域名
- 由于浏览器的同源策略,一系列客户端攻击将失效
- 比如上传
crossdomain.xml
,上传包含JavaScript
的XSS
利用等问题将得到解决