Reflected File Download Attack

0x00 背景


前几天Blackhat上,有一个有意思的议题,《Reflected File Download,A New Web Attack Vector》,瞬间觉得高大上,就拿来膜拜了一下,经过膜拜发现不知道是我不能完全理解还是什么原因,总是觉得这种攻击方式略微鸡肋.我简单的把膜拜的过程记录下发出来,让各路基友帮忙看看,到底该用什么姿势去膜拜才是正确的.

Reflected-File-Download-Attack,我觉得可以翻译成"反射型文件下载",感觉跟反射型Xss类似,在Hafif的PPT里是这样描述的: “用户点击一个来自google.com的链接,会下载一个恶意的文件,一旦用户点了这个文件,这个文件就立即运行,windows的计算器就弹出来了(PPT第17页)”“Uploadless Downloads!(P18)”

由于那个漏洞google.com修复了,这里我找了一个百度的有类似风险的链接,来膜(实)拜(验)。

0x01 细节


首先看实验,然后在详细说原理: 如果你的浏览器是chrome,那么使用这个链接:

http://suggestion.baidu.com/su;/1.bat;?wd=&cb=calc||&sid=1440_2031_1945_1788&t=1362056239875

如果你的浏览器不是chrome,那么使用这个链接:

http://suggestion.baidu.com/su;/1.bat?wd=&cb=calc||&sid=1440_2031_1945_1788&t=1362056239875

当你点击了这个链接,你的浏览器会提示下载:

enter image description here

细心的童鞋在url中就已经发现了,内容都写在url里了,很显然如果你运行了,就会弹出计算器:

enter image description here

当然,肯定会有童鞋说,你以为我是SB吗,我才不会去点他呢。。(遇到这问题我竟无言以对,确实鸡肋)

这个议题的演讲人在PPT里面有一段大概这样意思的描述:我们是如何去相信我们的下载呢?(P20)

我觉得这个漏洞的最大价值也就在于普通用户去分辨是否恶意下载是靠各种浏览器地址框的绿色证书标识,是靠HOST,注意这里说的是普!通!用!户!

在这个例子里,如果我们不对url进行任何修改,打开后会下载会一个文件,名字是su:

http://suggestion.baidu.com/su?wd=&cb=window.bdsug.sugPreRequest&sid=1466&t=1362316450913

enter image description here

从图中我们可以看出两个对我们有用的地方:

1.红框处,下载的文件名字跟url后面跟的su一样,这里我们可以试试能不能通过修改这里使下载的文件名变成我们想要的。 2.绿框处,cb字段输入的内容在返回中出现了,这里我们可以试试能不能通过修改这里使文件的内容变成我们所需的。

通过实验,得到下面这个能够执行命令的url:

http://suggestion.baidu.com/su;/1.bat;?wd=&cb=calc||&sid=1440_2031_1945_1788&t=1362056239875

这里我们打开这个.bat:

enter image description here

这段字符串用被管道符隔成了两段命令,第一段是弹计算器,第二段是无效命令。 这个例子没有Hafif的PPT里的那个例子好,如果在我们能控制的输入位前面还有一些字符串,我们仍然可以使用管道符分隔开两段字符串。例如:

{"results":["q", "rfd\"|| calc|| ","I loverfd"]}

我们再来看一下数据包,如果我们想要下载一个文件,遵循正常http协议,那么他的http头中要包含 Content-Disposition字段,并且参数为attachment,这个字段还有个字段是filename,也就是说如果想要使用下载功能这个字段的标准写法是这样的:

Content-Disposition:attachment;filename:1.txt

但是google产生漏洞的这个位置并没有加filename参数。按理来说百度这个地方的安全风险也应该是这样产生的,但是在实际测试中我们发现,并不是这样的。 先看一下百度的返回包:

enter image description here

虽然没有那个强制下载的字段Content-Disposition,但是我们仍然成功下载了,这里就产生了一个问题。。。

在后面的测试中我们发现,是因为content-type字段的内容造成的,按照http协议,content-type的json返回包的正常写法是这样的:

Content-Type: application/json;

为了验证是哪里的问题,我们继续尝试:

http://weibo.com/aj/top/topnavthird?_t=1&_v=WBWidget.cssVersionCallback

这个微博地址返回的是json的数据,并没有下载行为,他的返回包是这样的:

enter image description here

现在我把修改返回里的content-type字段为baiduApp/jason:

enter image description here

发现页面文件发生了下载行为!

enter image description here

经过接下来的尝试我们发现,如果content-type不符合http协议,也就是说不是标准的application/json写法,而是baiduAPP/json或者xxxx/json,甚至Fuck/json,都会使页面产生下载行为!

(我也不能完全确定是不是不符合HTTP协议,各路基友求证实)

这样这个漏洞形成的原因就很简明了,要符合几个条件:

1.在返回中能看到我们的输入并且content-type的类型不是普通类型,json或者jsonp等等。。。

2.url没有过滤或转义‘/’‘;’

3.是下载类型。使用不完整的Content-Disposition:attachment或者是不符合http协议的content-type。

原理上基本就这样了,至于利用上这的确是有一定的鸡肋,不过类似反射型XSS,如果在社交网络中使用,效果还是很不错的,例子我就不举了,这里贴个Hafif在PPT中的例子。效果好坏完全看你的忽悠能力了!!

enter image description here

PPT里面还有关于如何修复,这里我就不说了,感兴趣的童鞋可以去看看,附上PPT下载地址:http://dakrsn0w.sectree.cn/RFD.pdf

©乌云知识库版权所有 未经许可 禁止转载


30
agnes 2015-01-13 10:46:28

到底为什么不报404?

30
agnes 2015-01-13 10:45:14

我很好奇这个服务端是怎么写的,先用rewrite把.*都转到一个文件,才能保证不报404?再返回你任意构造的callback值,content-type还是个特殊的东西。 度娘不是故意脱光了躺床上等着呢?

30
0x_Jin 2014-11-26 23:48:04

给用户一种这是一个来自可信任域的感觉~ 就跟钓鱼一样 你在自己服务器上放一个钓鱼页面 跟日一个子站 在子站上放一个钓鱼页面是一样的。还是围绕着用户所认为的可信任域

30
darksn0w 2014-11-07 23:47:23

hi,目测我们俩说的仍然不是一个点...我的意思你既然能在可信网站插标签,那么标签里面的连接为何不用直接的下载地址,二是要用反射文件下载?第二个问题,你的扩大利用是建立在可插标签的基础上,也就是利用标签下载的方式使用callback,如果第一个条件不成立的话,那么你的扩大利用也就不复存在,欢迎QQ联系把这个问题弄清楚。。。625288070。。。

30
HRay 2014-11-07 20:50:48

如果你在自己的网站上传exe,那么用户看到这个exe是不可信网站的,但是用户看到连接是可信网站上的,可能就会放心下载,其次,“可控”这个词没必要非理解成自己有权限的网站,像我提到的,你在可信站点支持富文本编辑的地方添加一个a标签加download属性即可,还有就是在有反射xss的地方也可以利用,至于扩大化,找callback总比找那种支持分号的并且用浏览器不解析的content-type多吧,并且我从来没有否认过这种欺骗性更好,只是相对场景少了些而已

30
darksn0w 2014-11-07 10:47:36

而且你的博文中写道扩大了利用,这里我并没有看出来,原作者ppt中写的一个技巧,利用chrome的下载标签也并不是扩大利用,只不过是个技巧。。拿文中例子来说,如果我在一个test.com网站上利用下载标签,写上百度的反射下载地址,这就失去了反射的意义了...参考反射xss,欢迎拍砖

30
darksn0w 2014-11-07 10:44:22

希望你能明白我回复的意思:p,你回复我的跟我回复你的不是一个点~~我还是那个问题,既然可控,为何不直接传一个http://xx/1.exe为何还要如此蛋疼的用反射?

30
darksn0w 2014-11-07 10:41:11

确实很挫,跟反射xss类似

30
Sogili 2014-11-07 10:14:30

漏洞很搓

30
HRay 2014-11-06 22:38:48

针对我刚才的说明,请参考原paper42-44页,此外,可控内容的callback是很多的,通过callback可以较容易的在可信站点中寻找一个利用点

30
HRay 2014-11-06 22:33:12

这位同学你好,反射文件下载的本身含义是指无需在可信网站上传恶意程序而实现下载恶意程序,可能我这里的例子中的超链接换成了test.com,所以看起来容易被误解,但是实际中这个test.com就是一个可信网站,本例中的截图本身也确实是一个可信站点的,原作者在paper中有提到这点,当时做了个调查,referer可信与host可信,%81的人会选择host可信,所以这里我换一种方式解释,你可以理解成我在自己可控的网站a.com上插入了一个可信host,如google.com的连接,当用户看到点击内容是google上的连接,一样会认为是可信的

30
darksn0w 2014-11-06 18:22:24

我想说的是。。你在可控网站上用下载标签写一个下载链接,也就是说你在你的网站上放一个下载恶意文件的链接为什么还要用如此复杂的手段?已经失去了反射下载的意义,既然是可控网站,我为什么不直接放一个恶意文件的链接,还要用反射下载这种蛋疼的方式?这就是扩大?

30
xxxx 2014-11-06 17:07:22

http://xteam.baidu.com/?p=67

30
darksn0w 2014-11-06 14:55:10

啥很挫?

30
darksn0w 2014-11-06 14:54:52

其实你要是有心可以试试pdf和word的exploit

30
Sogili 2014-11-06 14:40:08

很挫

30
ACGT 2014-11-06 14:01:10

好像只能植入文本,不能植入二进制文件。可惜了,不然配合dll hijack来玩成功率更高 http://blog.acrossecurity.com/2012/02/downloads-folder-binary-planting.html

30
Chu 2014-11-06 12:52:15

利用很难的样子

30
DM_ 2014-11-06 12:19:18

和返回头有关。
这里返回了baiduApp/json

30
maodun 2014-11-06 11:49:03

分号是起截断作用吗,本地测试404了,测试这样也可以下载http://suggestion.baidu.com/su/1.bat,觉得和服务端处理url也有关,交流

感谢知乎授权页面模版