JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式。易于人閱讀和編寫。同時也易于機器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。 JSON采用完全獨立于語言的文本格式,但是也使用了類似于C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。
這種純文本的數據交互方式由于可以天然的在瀏覽器中使用,所以隨著ajax和web業務的發展得到了廣大的發展,各種大型網站都開始使用,包括Yahoo,Google,Tencent,Baidu等等。
但是如果這種交互的方式用來傳遞敏感的數據,并且傳輸的時候沒有做太多安全性控制的話將導致安全漏洞,根據敏感信息的不同導致會導致應用遭受不同級別的攻擊。
成因
JSON屬于javascript的一種實際應用,作為數據傳輸的一種有效方式,在使用的時候必須考慮到javascript在瀏覽器里的跨域安全策略影響,一般來說,譬如要傳輸如下的數據
$data=http://netsecurity.51cto.com/art/201307/array("username"=>"wooyun", "password"=>"wooyun" );
JSON實際應用的時候會有兩種傳輸數據的方式:
xmlhttp獲取數據方式:
{"username":"wooyun","password":"wooyun"}
當在前端獲取數據的時候,由于數據獲取方和數據提供方屬于同一個域譬如www.wooyun.org下面,屬于同一個可信的安全區域。所以可以使用 xmlhttp的方式來獲取數據,然后再用xmlhttp獲取到的數據傳入自己的js邏輯譬如eval(也可以使用其他方式),這種方式下數據可以保證只 在可信的域下傳輸,不會(目前的瀏覽器的環境下是這樣)導致數據向不可信的第三方泄露。
script獲取數據方式:
userinfo={"username":"wooyun","password":"wooyun"}
如果傳輸的數據在兩個不同的域,譬如對于大的互聯網公司,代表了A應用的A域名想獲取代表B應用的B域名的數據時,由于在javascript里無 法跨域獲取數據,所以一般采取script標簽的方式獲取數據,傳入一些callback來獲取最終的數據。譬如獲取上面數據的時候可以使用
由于數據在兩個完全不同的域里傳輸,如果缺乏有效地控制就會導致數據被泄露給第三方程序。
攻擊方式及危害
通過分析應用里的數據交互,我們經?梢园l現敏感信息泄露的情況發生。通常的方式包括,抓取應用的交互,查看里面敏感的數據,如果在傳輸的時候沒有安全控制,就可以發現此類漏洞了。
主要的危害是對于一些數據敏感的應用會造成較嚴重的攻擊,對于數據不敏感甚至是對第三方公開的應用來說,這類問題基本不算是安全問題,通過在第三方域使用javascript hijacking的方式我們就可以竊取到敏感數據了。一般的exploit代碼形式如下:
<script> function wooyun_callback(a){ alert(a); } </script> <script src=http://netsecurity.51cto.com/art/201307/"http://www.wooyun.org/userdata.php?callback=wooyun_callback"></script>
實際案例
QQMail郵件泄露漏洞通過構造URL讓用戶訪問,可以獲得QQ Mail的郵件列表。該漏洞由于需要在web QQ里共享QQ Mail里的郵件信息,所以QQ Mail開放了一個json接口以提供第三方的域名來獲得QQ Mail的信息,但是由于該接口缺乏足夠的認證,所以導致任何第三方域里都可以用script的方式來獲取該郵件列表。
<script> var Qmail={}; </script> <script src=http://netsecurity.51cto.com/art/201307/"http://mail.qq.com/cgi-bin/login?fun=passport&target=MLIST&t=login.js&pagesize=10&resp_charset=gb2312&1=3"></script> <script> alert(Qmail.newMailsList.nextUrl); alert(document.scripts[1].src=Qmail.newMailsList.nextUrl); alert(Qmail.newMailsList.summary); </script>
修復方案
盡量避免跨域的數據傳輸,對于同域的數據傳輸使用xmlhttp的方式作為數據獲取的方式,依賴于javascript在瀏覽器域里的安全性保護數據。如果是跨域的數據傳輸,必須要對敏感的數據獲取做權限認證,具體的方式可以包括:
1、referer的來源限制,利用前端referer的不可偽造性來保障請求數據的應用來源于可信的地方,此種方式力度較稀,完全依賴于referer,某些情況下(如存在xss)可能導致被繞過。
2、token的加入,嚴格來說,這種利用javascript hijacking的方式獲取數據是CSRF的一種,不過較之傳統的CSRF不能獲取數據只能提交而言,這種方式利用javascript可以獲取一些敏感信息而已。如果我們能讓攻擊者對接口未知,就可以實現json hijacking的防御了。利用token對調用者的身份進行認證,這種方式對于調用者的身份會要求力度較細,但是一旦出現xss也可能導致前端Token的泄露,從而導致保護失效。
3、對于同域的json使用情況下,可以在數據的輸出頭部加入while(1);的方式避免數據被script標簽的方式引用,這可以防止一些比較有特性的瀏覽器里導致的數據泄漏。
推薦閱讀
上周,移動安全公司 Bluebox Security 研究人員聲稱發現了一個Android 嚴重漏洞,這個漏洞允許攻擊者修改應用程序的代碼但不會改變其加密簽名,這個漏洞從 Android 1.6 開始就一直存在于Android 中,影響過去 4 年間>>>詳細閱讀
本文標題:Json hijacking/Json劫持漏洞解析
地址:http://www.hnbrwh.com/anquan/buding/33843.html
1/2 1