文件上传漏洞介绍
文件上传是现代互联网常见功能,
允许用户上次上传图片、视频、及其他类型文件,向用户提供的功能越多,Web受攻击风险越大。
上传文件时,如果未对上传文件进行严格验证和过滤,就容易造成文件上传漏洞,上传脚本文件(包括asp,aspx,php,jsp等)
恶意上传行为可能导致网站乃至整个服务器被控制。恶意的脚本文件又被成为WebShell,WebShell具有强大的功能,如查看服务器目录、服务器中文件、执行系统命令等。
JS检测绕过(前端检测)
检测原理
调用Js的selectFile()函数, 检测文件后缀
绕过方法:
1.删除本地浏览器js方法(禁用js)
2.修改文件后缀
文件后缀绕过
检测原理
通过函数pathinfo()获取文件后缀,将后缀转换为小写(strtolower)并判断是否为php
绕过方法
有些中间件 允许解析其他文件后缀的,如在httpd.conf配置文件中,配置如下代码,则能解析php、php3、phtml文件。所以上传一个后缀名为php3、phtml的文件即可。
绕过方法2
结合Apache文件解析机制,从后往前解析文件后缀,若后缀不可识别则继续判断直到遇到可解析的后缀为止,例如123.php.360,Apache解析机制会将其解析为php文件并执行
ps:不允许上传php文件,就上传php.360(笑)
文件类型绕过(白名单绕过)
MIME绕过:
检测原理
利用$_FILES['files'] ['type']判断图片格式是否为image/gif,image/jpeg,image/pjpeg,不是则不允许上传
绕过方法
$_FILES['files'] ['type'] 该值从请求数据包中Content-Type中获取,因此burp抓包修改这个标签值即可绕过
上传文件为php时,Content-Type值为application/octer-stream,上传文件为jpg格式的文件时Content-Type值是image/jpeg。
文件幻数检测绕过:
检测原理
利用getimagesize()函数,如果不能获取图片信息(表示该文件并非图片)则不能上传该文件
绕过方法
在脚本文件开头补充图片对应头部值(比如加上GIF89a)
89 50 4E 47 0D 0A 1A 0A (PNG头部),注意要选中十六进制转ascii
文件截断绕过
检测原理:
由于00代表结束符, PHP会把00之后的字符都删除
截断条件:PHP版本小于5.3.4.magic_quotes_gpc(魔术引号)处于off状态
适用情况:
上传的文件被重命名了,无法找到自己上传的文件
绕过方法:
GET方法中加入%00截断
POST方法中传入%00并解码
ps:截断绕过可以控制文件的上传路径
文件内容绕过
检测原理:
一些网站文件检测逻辑是先允许上传任意文件,然后检查文件内容是否包含可执行脚本,如果包含则删除。这里使用sleep()函数来模拟判断是否含有脚本所需要的时间
<?php
fputs(fopen('./shell.php','w'),'<?php phpinfo();?>')
?>
绕过方法:
利用成功上传至删除文件的时间差,上传一个.php文件,在未删除之前访问该php文件使其运行生成一个新的php文件,新文件不会被删除。