阅读:2353回复:0
上传文件的陷阱
◆0 背景
现在很多网站都允许用户上传文件,但他们都没意识到让用户(或攻击者)上传文件(甚至合法文件)的陷阱。 什么是合法文件? 通常,判断文件是否合法会透过两个参数:文件后缀(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防御。 ◆1 攻击 基于上面我们可以想像一种攻击场境: 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会像这样 ◆2 修补 好消息是有一个相对简单的方法防止该Flash的行为。 Flash若看到文件返回下面的Content-Disposition header就不会执行: Content-Disposition: attachment; filename="image.jpg" 所以若允许上传或输出任意数据,网站应该总是检查内容是否合法而且尽可能返回Content-Disposition header。 ◆3 其他用途 实际上,该攻击不只限制于文件上传。该攻击只要求攻击者能够控制域名下的数据(不论Content-Type),因此还有其他实施攻击的方法。 其中一种是利用JSONP接口。通常,攻击者可以透过更改callback参数控制JSONP接口的输出。然而,攻击者可以把整个Flash文件的内容作为callback参数,而达到与上载文件无异的攻击。 Payload会像这样: from: http://blog.detectify.com/post/86298380233/the-pitfalls-of-allowing-file-uploads-on-your-website |
|