linux文件上传白名单绕过,【漏洞详解】基于文件上传点挖掘存储型XSS漏洞

原标题:【漏洞详解】基于文件上传点挖掘存储型XSS漏洞

说到文件上传漏洞,常见的姿势是是尝试利用上传木马 Getshell。但是,在挖漏时很少碰到可以顺利上传木马的点,一般都是卡在某一步(服务器白名单过滤、已上传木马文件找不到路径、无法解析……),然后不了了之……而实际上,对于文件上传的功能点,我们还可以进一步尝试进行存储型 XSS 跨站脚本攻击,往往会有意想不到的惊喜!本文将对其进行介绍。

PART ONE

实战案例

先来看某大佬分享的一个实战案例:【漏洞挖掘】从受限的上传漏洞到储存型XSS 。

1、上传功能

在做项目时,我非常喜欢通过 Fuzz 来研究目标的文件上传点。一般来说,文件上传漏洞会造成严重的安全漏洞,并且技术人员似乎难以防范。考虑到应用站点的安全性,有经验的人员会将上传的文件储存在特定域,以减轻或避免上传漏洞造成的危害。

目标属于私人项目,站点上有一个请求协助功能。在这个求助表单中,用户可以上传附件。尝试上传正常的图片后,我注意到一件事:上传的图片被储存在同一个域下。

f85dccf7fd80173653618c1a99cde90c.png

服务器响应包:

1{ "result":true, "message": "/UploadFiles/redacted/redacted/3021d74f18ddasdasd50abe934f.png,"code ":0}

2

2、模糊测试

接下来做常规操作,上传.html文件,返回:

1{ "result": false, "message": "That file type is not supported.", "code": 0}

当然,这是预料之中的事。现在,我可以大致判断目标站点采用了白名单策略。

接下来,尝试使用 Burp Intruder 来爆破有哪些后缀。Github 上的 SecLists 项目有一个很好用的后缀字典。但是,经过测试发现目标站点似乎存在速率限制,发了几十个数据包后,我的 IP 被 ban 了。

挂上V皮N,我接着手动测试了一些常用扩展。我还测试了我想得到的所有绕过方法(空字节绕过,unicode 编码等等),但都失败了。目前得出四个可上传的后缀名:jpg,jpeg,png 和 gif,成功上传后,目标应用会给文件重新赋名。

最后注意到一个有趣的东西,扩展名中可存在特殊字符,并且不会被删除。举个例子, badfile.”gif可以上传成功,但是badfile.foo”gif不行。

于是乎,构造请求:

1-----------------------------6683303835495

2Content-Disposition: form-data; name= "upload"; filename= "badfile.''gif"

3Content-Type: image/png

4

5GIF89a

6@HackerOn2Wheels

7-----------------------------6683303835495--

服务器响应:

1{ "result": true, "message": "/UploadFiles/redacted/redacted/3021d74f18f649f5ac943ff50abe934f.''gif", "code": 0}

关于这个文件上传点,总结如下:

应用从最后一个"."中取扩展名;

文件名中,仅允许存在 a-z A-Z 0-9;

存在白名单策略(gif, png, jpg, jpeg);

如果文件扩展名名合法,则创建文件,并且更改文件名称。

3、上传绕过

Web应用通常会检测目标文件的文件头,并以此判断是否合法。例如,我随意上传一个文件:

1-----------------------------6683303835495

2Content-Disposition: form-data; name= "upload"; filename= "badfile.''gif"

3Content-Type: image/png

4

5foobar

6@HackerOn2Wheels

7-----------------------------6683303835495--

服务器响应:

1{ "result": false, "message": "That file type is not supported.", "code": 0}

在上传过滤函数中,一般只会检验文件头中的前四个字节。例如,下面这几个图像文件被检测的字节:

1JPEG- FF D8 FF DB - ÿØÿÛ

2GIF - 47494638- GIF8

3PNG - 89504E 47- ‰PNG

我只需使用上面的任意一个,就可以成功上传。目前,大多数浏览器会检验完整的文件头,但 IE/Edge 除外。例如GIF和PNG文件,完整的文件头为:

1GIF-474946383961 -GIF89a( orGIF87a)

2PNG-89504 E470 D0 A1 A0 A-.PNG....

如何利用?

如果要利用这点,仅需做到两点。

错误的文件扩展,上传该文件,以混淆浏览器;

添加神奇的文字头:GIF8

发送请求:

1---------------------------- -6683303835495

2Content-Disposition: form-data; name= "upload"; filename= "badfile.''gif"

3Content-Type: image/png

4

5GIF8

6 <>alert('XSS is easy'); > html>

7---------------------------- -6683303835495--

服务端响应:

1{ "result": true, "message": "/UploadFiles/redacted/redacted/5060bddf6e024def9a8f5f8b9c42ba1f.''gif", "code": 0}

上次成功,用 Microsoft Edge 或 Internet Explorer 访问文件,成功触发 XSS 漏洞:

7abce77ad86061d40d0cf0ecdbf5bb10.png

PART TEO

原理分析

上述添加图片类型文件头的文件,为什么还能被浏览器解析并触发 XSS 漏洞?下面将逐步进行分析。

1、Linux文件特性

要搞清楚这点,我们先在 Kali Linux 虚拟机的 Apcahe 服务网站目录下创建三个文件,文件属性分别为:

文件头长度4个字节(GIF8)的文件 gif4bytes(不带扩展名);

文件头长度8个字节(GIF89a)的文件 gifMagicBytes(不带扩展名);

没有文件头,扩展名为.gif的图像文件 test.gif(不带文件名)。

文件内容分别如下图所示:

dd51f856ea26a781aefd9fdb461e5741.png

在 Linux 机器,使用 file 命令查看文件属性:

0ec8854fac1b000ee27381ca74fcb4a7.png

可以看到,Linux 是基于文件头和内容来判断文件类型的。

首先,只要附有图像文件头,不管是 4 字节或 8 字节,都会被认为是图像文件。

从上面 Linux 特性可以看到,我们可以通过向带有 HTML 代码的文件添加图片文件特有的文件头来迷惑服务器,从而达到文件上传绕过的目的。

2、火狐/谷歌特性

创建好上述测试文件,我们开启 Kali Linux 的 Apache 服务:

711aaa05ad34e44ed0268e4b3234f383.png

然后在本地物理机的谷歌浏览器访问上述文件:

b89c3a49e07d801c8ed08eac863c682e.png

可以看到,两个被插入了 XSS 代码和 gif 文件头的文件 (均被 Linux 服务器当作图片)在谷歌浏览器里均无法解析 JS 代码,无法触发弹框:

300acb8dc7a883e86630fe67f4c33e13.png

就连被 Linux 服务器当作 html 文档的test.gif文件在谷歌浏览器里, JS 代码也一样无法被解析:

e93a7823cb4626275f8faf123e4e7e6e.png

同时再看看火狐浏览器的解析结果吧:

e1e09268ab7740dba73142051b400e56.png

63f32dfb5ec1a3f6418e430f8308210d.png

fa5e877bfce21462c3815f9a89c660c2.png

【小结】从上图可以看到,Firefox 和 Chrome 浏览器会同时关注文件头和扩展,它们会检测整个文件,仅有 4 个字节或者 8 个字节的文件头无法使 Firefox 或 Chrome 将其渲染为 GIF 文件。即使可以渲染,较新版本的 Firefox 或 Chrome 也会对文件做预包装(Pre-wrap)处理,这将破坏html标签。目前,似乎没人可以直接绕过这点。

【Question】

这不对呀?那上面的实战案例里面为何badfile.''gif文件里的 JS 代码就能够被解析?

请回去注意一个细节!上面是使用 Microsoft Edge 或 Internet Explorer 浏览器访问的badfile.''gif文件,而不是谷歌浏览器或者火狐浏览器!下面我们上 Edge/IE 浏览器来试试!

3、Edge/IE嗅探攻击

先来看看 IE 浏览器对带有图片文件头、html代码的文件的解析结果:

59477fd100ecc1360cc6e3f7ff0009e4.png

惊不惊喜!意不意外!先继续向下看,另一个带有 8 字节图片文件头的:

8d56fd804727c6da126680e95d960dc6.png

但是未带有文件头的 test.gif 文件的 html 代码就无法被解析执行了:

255a217d584776d940bb5abb91549563.png

最后也附上 Edge 浏览器的解析结果吧:

8f6dee6b76d98efadd6d527e2410c5f9.png

a32fe5c2d89a9cea6220b033dcdc2e7a.png

49a1c7d36a07d847ede2575933917e6c.png

【小结】Edge 和 IE 浏览器在默认情况下,易受 MIME 嗅探攻击。简单来说,就是 Edge/IE 会检视文件内容,然后根据这点来设置访问类型。在我们的badfile.”gif例子中,它会先读取内容,发现存在标签,则会设置解析类型为 text/html。这正是漏洞发生的地方。

PART THREE

进阶利用

上面我们通过上传一个 不带扩展名的文件 或着 存在特殊字符的扩展的文件,并且可以写入 html 代码,结合 Edge 或 IE 的 MIME/Content sniffing 漏洞(微软并不认为这是漏洞),便可执行任意 JS 代码,成功获得一个储存型 XSS 漏洞!

下面进一步分析另外更多的漏洞利用情况。

1、异常后缀名文件

在前面的实战案例里,badfile.''gif文件因为添加图片文件头导致可以上传(成功被服务器当作图像),同时又因为后缀名存在特殊扩展字符导致可被解析。那么,其他特殊后缀名文件带有 JS 代码的话,是否也可以被浏览器解析呢?

不废话,直接上个例子测试下就知道了。继续在 Apache 网站目录下创建一个后缀名为.hhh的任意后缀文件,写入 XSS 测试代码:

9f8be70c4de9ba0e6e4e34e10e9873ce.png

此时在物理机浏览器进行访问,发现谷歌、火狐、IE、Edge均能解析其中的 JS 代码、触发弹窗:

0194046e846b3cf7c70ca21be6d4944e.png

f0cb4242ab850959af5df835b92d860e.png

此处可以把后缀名改为.ht ml、.j pg(中间有空格)等格式,尝试绕过服务器的过滤并上传,也可触发 XSS 漏洞!

289ff6ad4777b0524d77c02c0b348723.png

前面实战案例里,badfile.''gif文件中 html 代码能够被解析,也正是这个文件异常后缀名的原因!

2、SVG格式的文件

如果应用允许上传 SVG 格式的文件(其实就是一个图像类型的),那么带有以下 content 的文件可以被用来触发XSS:

1< svgxmlns= "http://www.w3.org/2000/svg"= "alert(document.domain)"/>

同样我们测试一下,先创建123.svg文件:

c9247e620dcb8a05d9a6bd7aa9c1afa1.png

谷歌浏览器进行访问,成功弹窗:

3fea1b3baf14f7bf0b8b0a01a454206b.png

PART FOUR

总结

以上内容信息量可能有点大,我们总结一下什么情况下可以成功利用文件上传功能点,成功挖掘到存储型 XSS 漏洞:

1、目标站点存在任意文件类型上传的情况

极有可能你尝试上传木马 Getshell 却发现木马无法解析。不要放弃,这时你可以上传一个 Html 文件 或者 不带扩展名 或 存在特殊字符的扩展的文件(即异常后缀),并在该文件中写入 html 代码,即可大概率成功获得一个储存型 XSS。

2、目标站点只允许上传图片类型的文件

这时候可以创建一个带有图片文件头(比如GIF89a)的文件来欺骗 Linux 服务器(如本文提到的badfile.''gif文件,便被服务器当作图片类型了),并且 不带扩展名 或者 存在特殊字符的扩展的文件(即异常后缀),此时 结合 Edge 或 IE 浏览器的 MIME/Content sniffing 漏洞(微软并不认为这是漏洞),你可以执行任意JS代码,获得一个存储型 XSS 漏洞!

3、目标站点允许上传.svg后缀图像的情况

此时直接上传带有代码的123.svg文件即可!

注意任何情况下,都不可以企图直接以图片后缀(.jps/.png/.gif/.jepg)命名文件并上传,这类文件里即使包含 html 代码或者 js 代码,其代码也不会被任何浏览器解析的!

作者:TrueBW

如有侵权请联系删除

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值