一、文件上传漏洞定义
文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。
二、上传漏洞危害
1.上传文件是Web脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。
2.上传文件是病毒或者木马时,主要用于诱骗用户或者管理员下载执行或者直接自动运行;
3.上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行为(其他通过类似方式控制策略文件的情况类似);
4.上传文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。
5.上传文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。
除此之外,还有一些不常见的利用方法,比如将上传文件作为一个入口,溢出服务器的后台处理程序,如图片解析模块;或者上传一个合法的文本文件,其内容包含了PHP脚本,再通过"本地文件包含漏洞(Local File Include)"执行此脚本;等等。
三、上传漏洞满足条件
首先,上传的文件能够被Web容器解释执行。所以文件上传后所在的目录要是Web容器所覆盖到的路径。
其次,用户能够从Web上访问这个文件。如果文件上传了,但用户无法通过Web访问,或者无法得到Web容器解释这个脚本,那么也不能称之为漏洞。
最后,用户上传的文件若被安全检查、格式化、图片压缩等功能改变了内容,则也可能导致攻击不成功。
四、上传漏洞产生的原因
一些web应用程序中允许上传图片,文本或者其他资源到指定的位置,文件上传漏洞就是利用这些可以上传的地方将恶意代码植入到服务器中,再通过url去访问以执行代码.
造成文件上传漏洞的原因是:
1.服务器配置不当
2.开源编辑器上传漏洞
3.本地文件上传限制被绕过
4.过滤不严或被绕过
5.文件解析漏洞导致文件执行
6.文件路径截断
五、上传漏洞的原理
大部分的网站和应用系统都有上传功能,一些文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过Web访问的目录上传任意PHP文件,并能够将这些文件传递给PHP解释器,就可以在远程服务器上执行任意PHP脚本。
当系统存在文件上传漏洞时攻击者可以将病毒,木马,WebShell,其他恶意脚本或者是包含了脚本的图片上传到服务器,这些文件将对攻击者后续攻击提供便利。根据具体漏洞的差异,此处上传的脚本可以是正常后缀的PHP,ASP以及JSP脚本,也可以是篡改后缀后的这几类脚本。
六、上传文件检测流程
通常一个文件以HTTP协议进行上传时,将以POST请求发送至Web服务器,Web服务器接收到请求并同意后,用户与Web服务器将建立连接,并传输数据。一般文件上传过程中将会经过如下几个检测步骤:
一般一个文件上传过程中的检测如下图红色标记部分:
- 客户端javascript校验(一般只校验文件的扩展名)
- 服务端校验
- 文件头content-type字段校验(image/gif)
- 文件内容头校验(GIF89a)
- 目录路经检测(检测跟Path参数相关的内容)
- 文件扩展名检测 (检测跟文件 extension 相关的内容)
- 后缀名黑名单校验
- 后缀名白名单校验
- 自定义正则校验
- WAF设备校验(根据不同的WAF产品而定)
七、上传漏洞绕过
1.客服端绕过
(1)客户端校验:
一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。判断方式:在浏览加载文件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的文件,而此时并没有发送数据包
(2)绕过方法:
1.通过火狐插件NOscript插件或者禁用IE中JS脚本
2.通过firbug插件元素审核修改代码(如删除onsubm:t=”return checkFile()”事件)
3.通过firbug元素审核javascirpt脚本中添加上传文件类型。
4.通过利用burp抓包改包,先上传一个gif类型的木马,然后通过burp将其改为asp/php/jsp后缀名即可
注意:这里修改文件名字后,请求头中的Content-Length的值也要改
演示如下:
fidder进行抓包拦截,先上传一句话图片木马如bd2.jpg,然后抓包拦截改成bd2.php
2.服务端绕过
(1)黑名单扩展名绕过
黑名单检测:一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。绕过方法:
(1)找黑名单扩展名的漏网之鱼 - 比如 iis6.0中的asa 和 cer
(2)可能存在大小写绕过漏洞 - 比如 aSp(iis6.0中可以) 和 pHp(只能在小于php5.3.39中的linux中) 之中
(3)能被WEB容器解析的文件其他扩展名列表:
jsp, jspx ,jspf
asp asa cer cdx,htr,xml,html
aspx,ashx,asmx,asax,ascx
演示:php中的大小写解析只能在linux 环境才能执行:
这里不允许上传php那么可以上传大小写Php
(2)黑名单特殊后缀名绕过(利用难度高)
将Burpsuite截获的数据包中backlion.php名字改为baclion.php4(php1,php2,php3,php4,php5),前提条件是http.conf中设置 AddType application/x-httpd-php .php1(php的版本小于等于5.3.29以下)
(3)配合操作系统文件命名规则绕过
在windows系统下,如果文件名以“.”或者空格作为结尾,系统会自动删除“.”与空格,利用此特性也可以绕过黑名单验证。apache中可以利用点结尾和空格绕过,asp和aspx中可以用空格绕过
(a).上传不符合windows文件命名规则的文件名, 会被windows系统自动去掉不符合规则符号后面的内容:
test.asp.
test.asp(空格)
test.php:1.jpg
test.php::$DATA
(b). linux下后缀名大小写
在linux下,如果上传php不被解析,可以试试上传pHp后缀的文件名(前提条件是php版本小于等于5.3.29版本)
(4)单双重后缀名绕过
上传时将Burpsuite截的数据包中文件名backlion.php(backlion.asa)改为backlion.pphphph(backlion.asasaa),那么过滤了第一个"php"字符串"后,开头的'p'和结尾的'hp'就组合又形成了php
(5)服务端MIME文件类型(Content-Type)绕过
MIME的作用:
使客户端软件,区分不同种类的数据,例如web浏览器就是通过MIME类型来判断文件是GIF图片,还是可打印的PostScript文件。web服务器使用MIME来说明发送数据的种类, web客户端使用MIME来说明希望接收到的数据种类,它是服务器用来判断浏览器传递文件格式的重要标记项。
常用的文件上传类型的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提交时伴随文件上传的表单)
绕过方法:
上传对文件类型做了限制,可通过burpsuit将其他类文件类型修改为如:Content-Type:image/gif和image/jpeg等运行的文件类型
文章来源:https://www.toymoban.com/news/detail-636875.html
(6)配合文件包含文章来源地址https://www.toymoban.com/news/detail-636875.html
到了这里,关于Web安全之文件上传漏洞详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!