瀏覽器中因cookie設置HttpOnly標志引起的安全問題
1、簡介
如果cookie設置了HttpOnly標志,可以在發生XSS時避免JavaScript讀取cookie,這也是HttpOnly被引入的原因。但這種方式能防住攻擊者嗎?HttpOnly標志可以防止cookie被“讀取”,那么能不能防止被“寫”呢?答案是否定的,那么這里面就有文章可做了,因為已證明有些瀏覽器的HttpOnly標記可以被JavaScript寫入覆蓋,而這種覆蓋可能被攻擊者利用發動session fixation攻擊。本文主題就是討論這種技術。
2、用JavaScript覆蓋cookie中的HttpOnly標志
當JavaScript可以覆蓋cookie中的HttpOnly標志時,攻擊者如果發現網站的XSS漏洞,就可以利用HttpOnly cookie發動session fixation攻擊(更多關于session fixation攻擊的內容可以參考筆者之前的文章[1])。
session fixation攻擊的后果是攻擊者可以冒充受害者,因為其知道受害者的session ID。這里假設當成功登錄應用后session不會重新生成。現實也確實是這樣的,但瀏覽器不應該允許JavaScript覆蓋HttpOnly標志,因為這種覆蓋可能與某些應用程序登錄成功后不會重新生成會話這一特性結合,發動session fixation攻擊。
那么登錄成功后如果重新生成session ID的話安全性是怎么樣的呢?還能被攻擊者利用嗎?登錄之后,攻擊者通過設置用戶的session為攻擊者正在使用的session,將用戶切換為攻擊者自己的帳戶。受害者以為其正在使用自己的帳戶,實際上一些敏感信息已經泄露給攻擊者了。
3、允許JavaScript覆蓋HttpOnly cookie的瀏覽器
經筆者證實,以下瀏覽器允許JavaScript覆蓋HttpOnly cookies:
Safari
Opera Mobile
Opera Mini
BlackBerry browser
Konqueror browser
該問題已經(于2014年2月14日)提交給相應的廠商。
IE、Firefix和Opera(標準安裝版本)不容易受到上述攻擊影響。
4、廠商的回復
Opera公司已經確認該問題在Opera Mobile和Opera Mini中存在,決定在Opera Mini中修復該問題(修復日期還未確定)。盡管Opera Mobile當前在Google Play中可以下載,但Opera公司認為該版本已經過時,因此決定不對其進行修改(他們建議替換為Opera for Android版本,該版本可以防止JavaScript覆蓋HttpOnly cookie)。
黑莓公司回復說已經宣布于2014年4月后不再對PlayBook Tablet的操作系統(筆者當時測試時使用的系統)進行支持,因此不會修復該問題。但是由于該問題是在支持結束聲明之前提交的,他們決定將我加入到黑莓安全事件響應小組的感謝名單中(根據他們的規定,筆者的名字會在2014年4月底才會被加入)[2]。
Konqueror確認了該問題,但可能不會去修復。該bug的信息可以在KDE Bugtracking系統中找到[3]。
該問題兩個月前提交給了蘋果公司,但從未收到任何反饋。
5、漏洞利用
以下是部分示例代碼:
- <?
- setcookie('cookie1',++$_COOKIE['cookie1'],time()+2592000,'/','',0,1);
- setcookie('cookie2',++$_COOKIE['cookie2'],time()+2592000,'/','',0,0);
- ?>
- <HTML>
- <?
- print "Cookie1:".$_COOKIE['cookie1']."<br>";
- print "Cookie2:".$_COOKIE['cookie2'];
- ?>
- <script>alert(document.cookie);</script>
- <script>document.cookie='cookie1=100;expires=Thu, 2 Aug 2014 20:00:00 UTC; path=/';</script>
- </HTML>
過程如下:運行這段代碼,之后可以看到cookie1(設置了HttpOnly標志)已經被JavaScript寫入覆蓋了。
6、總結
HttpOnly標志的引入是為了防止設置了該標志的cookie被JavaScript讀取,但事實證明設置了這種cookie在某些瀏覽器中卻能被JavaScript覆蓋,可被攻擊者利用來發動session fixation攻擊。該問題被提出后,得到了相關廠商的響應。最后,本文給出了一段利用演示代碼。