文件上传漏洞原理:在文件上传的功能处,若服务端脚本语言未对上传的文件进行严格验证和过滤,导致恶意用户上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这就是文件上传漏洞。
上传触发点:相册、头像上传、视频、照片分享、附件上传、文件管理器
上传漏洞的危害:直接上传后门,控制网站,得到web权限(服务器权限)。
造成文件上传漏洞的原因:
1.服务器配置不当
2.开源编辑器上传漏洞
3.本地文件上传限制被绕过
4.过滤不严格被绕过
5.文件解析漏洞导致文件执行
6.文件路径截断
上传漏洞的绕过方法:
1.本地禁用JS
2.修改后缀名
3.修改content-type
常见的媒体格式类型如下:
text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
以application开头的媒体格式类型:
application/xhtml+xml :XHTML格式
application/xml : XML数据格式
application/atom+xml :Atom XML聚合格式
application/json : JSON数据格式
application/pdf :pdf格式
application/msword : Word文档格式
application/octet-stream : 二进制流数据(如常见的文件下载)
application/x-www-form-urlencoded : 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
4.修改文件头
5.空格绕过
6.::$DATA绕过
7.大小写、双写、点绕过
8.配合中间件解析绕过
IIS6.0:文件夹目录解析 /xx.asp/xx.jpg "xx.asp"是文件夹名,这样只要在 xx.asp 目录下面的任意文件都会当脚本解析。
xx.asp;.jpg 通过上传功能传到网站目录,直接会当作 asp 脚本执行。
IIS 7.0、IIS7.5:默认 Fast-CGI 开启,直接在 url 中图片地址后面输入/1.php,会把正常图片当成 php 解析
Nginx:版本小于等于 0.8.37,利用方法和 IIS 7.0/7.5 一样,Fast-CGI 关闭情况下也可利用。空字节代码 xxx.jpg.php
Apache:上传的文件命名为:test.php.x1.x2.x3,Apache 是从右往左判断后缀
lighttpd:xx.jpg/xx.php 与上面一样
9.%00截断、0x00截断
10.MIME绕过
文件上传过WAF:
1.在数据包filename之前,手动加入大量垃圾数据(以分号结尾),造成数据溢出,防止waf匹配关键字,从而绕过waf防护。
2.使用符号变异的方法,来防止WAF匹配关键字,从而实现WAF绕过。
3.数据截断-防匹配(%00 ; 换行)
4.重复数据-防匹配(参数多次)
文件上传安全修复方案:
1.后端验证:采用服务端验证模式
2.后缀检测:基于黑名单、白名单过滤
3.MIME检测:基于上传自带类型检测
4.内容检测:文件头,完整性校验