漏洞原理
由于程序员在对用户文件上传功能实现代码上没有严格限制用户上传的文件后缀以及文件类型或者处理缺陷,而导致用户可以越过其本身权限向服务器上上传可执行的动态脚本文件:
简单的来说:
服务器端没有对客户端上传的文件进行严格验证或过滤,用户可以上传一个可执行的脚本文件,并通过此脚本获得了执行服务器端命令的能力.
漏洞危害
- 针对上传功能的Dos攻击
- 使上传文件在服务器上作为脚本执行
- 诱使用户下载恶意文件
- 越权下载文件
常见绕过攻击
针对常见的防御措施,介绍如下几个常见绕过攻击姿势
JS检测绕过攻击:
JS检测绕过上传漏洞常见于用户选择上传文件的场景,如果上传文件后缀不被允许,则会弹框告知,此时数据包并未到服务器而是在客户端浏览器进行js检测,此处服务端未做上传文件防御.这时有两种方式绕或客户端JavaScript检测:
- 使用浏览器的插件,删除勘测文件后缀的js代码
- 抓包修改上传文件后缀名
文件后缀绕过攻击:
文件后缀绕过攻击是服务端代码限制了某些后缀文件不允许上传,但是Apache是允许解析其他文件后缀的,例如,phtml等,可以结合解析器的解析顺序来进行绕过,apache解析顺序是从右到左(如果最右侧的扩展名不能解析,则往左判断,直到遇到可以解析的文件后缀为止)
文件类型绕过攻击:
抓包时可以发现上传php文件时,Content-Type的值为application/octet-stream,而上传jpg文件时类型为image/jpeg,如果服务端是通过Content-Type来判断上传文件的类型,那么就存在被抓包修改绕过的可能.
文件截断绕过攻击
截断类型:PHP%00截断
截断原理:由于00代表结束符,所以会把00后面的所有字符都截断
截断条件:PHP版本小于5.3.4,PHP的magic_quotes_gpc为OFF状态
竞争条件攻击
一些网站上传文件的逻辑是先允许上传任意文件,然后检查上传的文件是否包含Webshell脚本,如果包含则删除,这里存在的问题是文件上传成功后和删除文件之间存在一个短的时间差(因为要执行检查文件和删除文件的操作),攻击者可以利用这个时间差完成竞争条件的上传漏洞攻击
例如:
攻击者先上传一个webshell脚本1.php,1.php的内容是生成一个新的webshell脚本shell.php,1.php的代码如下:<?php fputs(fopen('../shell.php','w'),'<?php @eval($_POST[a]) ?>') ?>
当1.php上传成功后,客户端立即访问了1.php,则会在服务器端当前目录下生成shell.php,这时攻击者就利用时间差完成了webshell上传.
漏洞防御策略
1:通过设置白名单方式来判定上传文件后缀是否合法
2:对上传文件进行重命名
防范文件上传Dos攻击策略:
1:限制上传文件大小2:不仅对上传文件进行校验,还要对其它参数进行校验,考虑CPU使用时间及内存使用量等其他需要关注的资源.
3:切割文件
防范文件上传作为脚本执行策略:
1:不将用户上传的文件保存在公开目录中,浏览文件需要通过脚本(隐藏上传文件目录,上传了你找不到上传目录,你无法通过外部工具去链接)2:将文件扩展名限定为不可执行的脚本文件,为了避免将上传文件保存在公开目录,下载文件时需要经过下载脚本