上传文件的陷阱

0x00 背景


现在很多网站都允许用户上传文件,但他们都没意识到让用户(或攻击者)上传文件(甚至合法文件)的陷阱。

什么是合法文件?

通常,判断文件是否合法会透过两个参数:文件后缀(File extension)及Content-Type。

例如,网站会确保后缀是jpg及Content-Type是image/jpeg以防止恶意文件,对不?

但一些像Flash的插件程序并不关心后缀及Content-type。假如一个文件被标签嵌入,它会像Flash一样执行,只要它的内容像个Flash文件。

但等等,Flash不是应该只在同域下被嵌入才会执行?亦对亦错。假如一个Flash文件(或以图像包装的Flash文件)在victim.com上传然后于attacker.com下嵌入,它只能在attacker.com下执行JavaScript。但是,假如该Flash文件发出请求,那么它可以读取到victim.com下的文件。

这说明了若不检查文件内容而直接上传,攻击者可以绕过网站的CSRF防御。

0x01 攻击


基于上面我们可以想像一种攻击场境:

[cce]1. 攻击者建立一个恶意Flash(SWF)文件
2. 攻击者更改文件副档名为JPG
3. 攻击者上传档案到victim.com
4. 攻击者在attacker.com以标签及application/x-shockwave-flash类型嵌入该文件
5. 受害者浏览attacker.com,并以SWF格式载入该文件
6. 攻击者现在可以透过该SWF并以受害者的session向victim.com发出及接收任意请求
7. 攻击者向victim.com发出请求后取得受害者的CSRF token
[/cce]

payload会像这样

[cce]
[/cce]

0x02 修补


好消息是有一个相对简单的方法防止该Flash的行为。 Flash若看到文件返回下面的Content-Disposition header就不会执行:

[cce]Content-Disposition: attachment; filename=”image.jpg”
[/cce]

所以若允许上传或输出任意数据,网站应该总是检查内容是否合法而且尽可能返回Content-Disposition header

0x03 其他用途


实际上,该攻击不只限制于文件上传。该攻击只要求攻击者能够控制域名下的数据(不论Content-Type),因此还有其他实施攻击的方法。

其中一种是利用JSONP接口。通常,攻击者可以透过更改callback参数控制JSONP接口的输出。然而,攻击者可以把整个Flash文件的内容作为callback参数,而达到与上载文件无异的攻击。 Payload会像这样:

[cce]
[/cce]

from: http://blog.detectify.com/post/86298380233/the-pitfalls-of-allowing-file-uploads-on-your-website

Comment

评论:Discuz 的crossdomain.xml本身就是個坑

评论:POC文章中已经给出来了。JSONP XSS的poc换成object就行了,就算修补方案是content-type也无用。

评论:JSONP这种利用方式有谁测试了吗,不知能否提供个poc

评论:Discuz 的crossdomain.xml本身就是個坑

评论:discuz实例在哪里呀~~今天刚看到还没看明白,就有中文版了。。。

评论:一楼的M牛不是发过Discuz的实例么

评论:callback 经过某人常年的扫荡下,已经过滤掉了之类字符

评论:you got it~

评论:JSON 才是亮点.

评论:在zone发表不了新话题 就來水一篇了 哈哈

评论:还没玩爽呢 你就翻译发出来了TAT

发表评论

电子邮件地址不会被公开。 必填项已用*标注