简介
File Upload,即文件上传漏洞,通常是由于对用户上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马,病毒,恶意脚本等获取服务器的webshell权限,并进而攻击控制服务器,因此文件上传漏洞带来的危害常常是毁灭性的。简单点说,就是用户直接或者通过各种绕过方式将webshell上传到服务器中进而执行利用。例如,如果你的服务器为php环境,用户上传了一个php一句话木马,并通过菜刀连接获取webshell,就可能对你的服务器文件进行篡改甚至执行命令。
文件上传校验方法
客户端javascript校验(一般只校验后缀名)
当客户端选择文件点击上传的时候,客户端还没有向服务器发送任何消息,前端的 js 脚本就对文件的扩展名进行检测来判断是否是可以上传的类型
服务端校验
- 文件头content-type字段校验 后端通过对上传文件的MIME类型进行黑白名单检测过滤
- 文件内容头校验
不同的文件都有不同的文件头,文件头就是为了描述一个文件的一些重要的属性,它告诉了打开并处理该文件的程序这些属性。有些上传接口会检测你上传的文件头信息以此来判断是否为正真的文件类型,比如 jpg 格式图片头部是 JFIF ,gif头部是GIF89a,png头部是%PNG。
- 校验文件大小
一些上传接口通过函数比如 getimagesize() 函数检测你上传的图片的大小是否是正常的图片大小,防止上传一句话木马。
- 后缀名黑名单校验
- 后缀名白名单校验
- 自定义正则校验
WAF设备校验
(根据不同的WAF产品而定)
绕过姿势
1)客户端校验
- 先将所上传文件扩展名改为符合脚本检测规范的拓展名,在上传时通过burpsuite抓包,将数据包中文件的拓展名还为原来的,以达到绕过的目的
- 在本地浏览器中直接禁用JS
2)文件头content-type字段校验
使用burpsurite或firebug等篡改http header中Content-Type的内容,即将Content-Type: application/php改为其他web程序允许的类型,如Content-Type: image/jpg,Content-Type: image/png,Content-Type: text/plain。
常见MIME类型:
text/plain(纯文本)
text/html(HTML文档)
text/javascript(js代码)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)
image/png(PNG图像)
video/mpeg(MPEG动画)
application/octet-stream(二进制数据)
application/pdf(PDF文档)
application/(编程语言) 该种语言的代码
application/msword(Microsoft Word文件)
message/rfc822(RFC 822形式)
multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
application/x-www-form-urlencoded(POST方法提交的表单)
multipart/form-data(POST提交时伴随文件上传的表单)
3)文件内容头校验
- 在上传的脚本的头部加上相应的文件头字节(php引擎会将 <?之前的内容当作html文本,不解释而跳过之,后面的代码仍然能够得到执行)
附一张各种格式文件内容头表
- 找一个符合上传过滤类型的文件与脚本文件合并制作图片木马,后将新文件上传,再结合文件包含漏洞getshell
4)校验文件大小
在上传数据里不断填充垃圾数据或制作图片木马进行绕过。
5)黑名单校验文件后缀名
寻找遗漏文件类型绕过
6)其他绕过方法
- 00截断
- 后缀名大小写绕过
- 条件竞争
- 解析漏洞
总结:上传绕过方法要灵活运用,不能死板,可以多种方法结合以达到上传效果
实验
实验环境:phpstudy2016
靶机:DVWA file upload HIGH安全级别
源码
可知,此等级采用了白名单过滤,只允许后缀名为jpg,jpeg或png格式的文件上传,并且文件大小要小于100000字节。
在cmd中用copy命令生成图片木马
发现一句话木马一插入图片尾部
上传成功
可见文件位于C:phpstudyWWWDVWAhackableuploads目录下
尝试用菜刀连接
发现出现错误,因为木马被当作图片解析而不被当作php解析
此时可利用文件包含漏洞
利用DVWA的File Inclusion漏洞来将图片解析为php
构造url
http://169.254.16.216/DVWA/vulnerabilities/fi/?page=file:///C:phpstudyWWWDVWA/hackable/uploads/shell.jpg 添加到菜刀 参数为qlu
连接发现错误,这是为DVWA需要登陆
可以右键点击刚添加的shell,选择浏览网址,在菜刀自带的浏览器中登陆DVWA将安全等级设为high及以下.
然后就可以成功连接.
防护
1.文件上传的目录设置为不可执行
只要web容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,因此这一点至关重要。
2.判断文件类型
在判断文件类型时,可以结合使用MIME Type、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式,黑名单的方式已经无数次被证明是不可靠的。此外,对于图片的处理,可以使用压缩函数或者resize函数,在处理图片的同时破坏图片中可能包含的HTML代码。
3.使用随机数改写文件名和文件路径
文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。再来就是像shell.php.rar.rar和crossdomain.xml这种文件,都将因为重命名而无法攻击。
4.单独设置文件服务器的域名
由于浏览器同源策略的关系,一系列客户端攻击将失效,比如上传crossdomain.xml、上传包含Javascript的XSS利用等问题将得到解决。