今天的主要内容是分享业务逻辑漏洞探索之上传漏洞,本篇文章字数在2000字以内,阅读用时大约7分钟。
注:本文中提供的例子均来自网络已公开测试的例子,仅供参考。
许多网站都允许用户自行上传照片、电子档材料,如果上传功能没有做好防护措施,就会存在巨大的安全风险。如果Web应用在文件上传过程中没有对文件的安全性进行有效的校验,攻击者可以通过上传Webshell等恶意文件对服务器进行攻击,这种情况下认为系统存在文件上传漏洞。
以下是部分上传漏洞的场景,如图所示:
一、无任何过滤
现在大部分的研发人员只要有一点安全意识基本上都会对上传功能进行一定的限制,但也不排除仍有网站的上传功能没有任何的防护。对于没有任何防护措施的上传功能,就可以任意上传恶意文件。举个例子:
1、某站点对文件上传无任何的防护。
2、找到对应的文件上传功能。
3、直接上传一个恶意文件,不用修改后缀名。
4、文件上传成功后会返回上传的相对路径。
5、全上传路径后访问上传的Webshell,就可以对服务器进行控制。
二、客户端校验绕过
客户端检测最典型的方式就是JavaScript检测,由于JavaScript在客户端执行的特点,可以通过修改客户端代码或先上传符合要求的文件再在上传过程使用BURP等工具篡改文件等方式来绕过。举个例子:
1、某系统存在上传漏洞。
2、将shell文件后缀改为允许上传的文件进行上传,再通过burp进行拦截改后缀,可顺利上传成功。
3、访问shell可以控制整个服务器,获取服务器权限。
三、服务端校验绕过
no.1MIME绕过
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。标准的文件上传组件中会自动上传文件的MIME类型,但是由于MIME类型是从客户端传递的,修改也不影响文件正常运行,因此通过BURP拦截和修改MIME类型可以轻易绕过此类检测。举个例子:
1、某系统使用abcedit编辑器存在mime绕过上传漏洞。
2、上传功能要求只能上传图片格式文件,我们上传txt文件,使用抓包工具进行拦截。
3、将Content-Type改为gif的mime格式。
4、成功上传txt绕过mime的限制。
no.2文件内容绕过
针对文件头和文件内容检测通常有两种方式,白名单的方式是检测上传的文件中是否有白名单类型文件的文件头等内容特征信息,满足要求方能上传。黑名单是检测一些Webshell的特征,如果包含相关特征就不允许上传。针对白名单检测,可以在满足要求的文件后插入木马脚本语句来绕过。而黑名单则可以通过对关键函数的各类混淆变化来绕过。举个例子:
1、某系统存在上传漏洞,找到相关上传功能。
2、在正常的一张图片中加入一句话木马,制作成图片马,然后将图片马进行上传。
3、发现文件绕过内容检测上传成功,并且能连上shell,可控制整台服务器。
4、可以进一步控制内网。
no.3扩展名绕过
正常情况下如果用户上传的网页木马文件不是以响应的脚本文件扩展名上传的,则无法正常运行,达不到控制网站服务器的目的。然而,如果对文件扩展名检测的实现方式不当的话仍然存在风险。文件扩展名检测通常分为黑名单检测和白名单检测两种,针对黑名单绕过方式有使用不常见的扩展名、大小写绕过及特殊字符结尾等,针对白名单绕过方式可以使用截断绕过、解析漏洞等进行绕过。举个例子:
A. 特殊扩展名
- 某个安全狗软件存在上传漏洞可进行绕过,正常上传一个php的文件会被拦截。
在文件后缀名后加上一个空格和一个小数点,发现可以绕过上传的限制。
可以执行任意命令。
B. 截断漏洞
- 某系统存在上传漏洞。
- 登陆后找到上传功能,上传的时候进行抓包,修改后缀,加上url编码后的%00,例如下面的修改为jtbx1.jsp%00.dat。
- 上传文件后,可以访问shell进行控制服务器。
四、修复建议
这次的总结就到这啦,如果你也有上传漏洞的绕过姿势可以留言给我们。对于上传漏洞的话,还是要和程序猿小哥哥提点小建议:
1、对上传文件的扩展名和文件报头信息在服务端与白名单对比,不符合白名单的不予保存。
2、上传过程不应传递目录或文件路径,使用预先设置路径列表中的匹配索引值,严禁泄露文件绝对路径。
3、对文件进行重命名,使用随机性好的文件目录和文件名进行保存。
4、上传文件的临时目录和保存目录不允许执行权限。
5、有条件时可将保存在内容服务器或者数据库中。