瀏覽器中因cookie設(shè)置HttpOnly標(biāo)志引起的安全問(wèn)題
1、簡(jiǎn)介
如果cookie設(shè)置了HttpOnly標(biāo)志,可以在發(fā)生XSS時(shí)避免JavaScript讀取cookie,這也是HttpOnly被引入的原因。但這種方式能防住攻擊者嗎?HttpOnly標(biāo)志可以防止cookie被“讀取”,那么能不能防止被“寫(xiě)”呢?答案是否定的,那么這里面就有文章可做了,因?yàn)橐炎C明有些瀏覽器的HttpOnly標(biāo)記可以被JavaScript寫(xiě)入覆蓋,而這種覆蓋可能被攻擊者利用發(fā)動(dòng)session fixation攻擊。本文主題就是討論這種技術(shù)。
2、用JavaScript覆蓋cookie中的HttpOnly標(biāo)志
當(dāng)JavaScript可以覆蓋cookie中的HttpOnly標(biāo)志時(shí),攻擊者如果發(fā)現(xiàn)網(wǎng)站的XSS漏洞,就可以利用HttpOnly cookie發(fā)動(dòng)session fixation攻擊(更多關(guān)于session fixation攻擊的內(nèi)容可以參考筆者之前的文章[1])。
session fixation攻擊的后果是攻擊者可以冒充受害者,因?yàn)槠渲朗芎φ叩膕ession ID。這里假設(shè)當(dāng)成功登錄應(yīng)用后session不會(huì)重新生成。現(xiàn)實(shí)也確實(shí)是這樣的,但瀏覽器不應(yīng)該允許JavaScript覆蓋HttpOnly標(biāo)志,因?yàn)檫@種覆蓋可能與某些應(yīng)用程序登錄成功后不會(huì)重新生成會(huì)話(huà)這一特性結(jié)合,發(fā)動(dòng)session fixation攻擊。
那么登錄成功后如果重新生成session ID的話(huà)安全性是怎么樣的呢?還能被攻擊者利用嗎?登錄之后,攻擊者通過(guò)設(shè)置用戶(hù)的session為攻擊者正在使用的session,將用戶(hù)切換為攻擊者自己的帳戶(hù)。受害者以為其正在使用自己的帳戶(hù),實(shí)際上一些敏感信息已經(jīng)泄露給攻擊者了。
3、允許JavaScript覆蓋HttpOnly cookie的瀏覽器
經(jīng)筆者證實(shí),以下瀏覽器允許JavaScript覆蓋HttpOnly cookies:
Safari
Opera Mobile
Opera Mini
BlackBerry browser
Konqueror browser
該問(wèn)題已經(jīng)(于2014年2月14日)提交給相應(yīng)的廠商。
IE、Firefix和Opera(標(biāo)準(zhǔn)安裝版本)不容易受到上述攻擊影響。
4、廠商的回復(fù)
Opera公司已經(jīng)確認(rèn)該問(wèn)題在Opera Mobile和Opera Mini中存在,決定在Opera Mini中修復(fù)該問(wèn)題(修復(fù)日期還未確定)。盡管Opera Mobile當(dāng)前在Google Play中可以下載,但Opera公司認(rèn)為該版本已經(jīng)過(guò)時(shí),因此決定不對(duì)其進(jìn)行修改(他們建議替換為Opera for Android版本,該版本可以防止JavaScript覆蓋HttpOnly cookie)。
黑莓公司回復(fù)說(shuō)已經(jīng)宣布于2014年4月后不再對(duì)PlayBook Tablet的操作系統(tǒng)(筆者當(dāng)時(shí)測(cè)試時(shí)使用的系統(tǒng))進(jìn)行支持,因此不會(huì)修復(fù)該問(wèn)題。但是由于該問(wèn)題是在支持結(jié)束聲明之前提交的,他們決定將我加入到黑莓安全事件響應(yīng)小組的感謝名單中(根據(jù)他們的規(guī)定,筆者的名字會(huì)在2014年4月底才會(huì)被加入)[2]。
Konqueror確認(rèn)了該問(wèn)題,但可能不會(huì)去修復(fù)。該bug的信息可以在KDE Bugtracking系統(tǒng)中找到[3]。
該問(wèn)題兩個(gè)月前提交給了蘋(píng)果公司,但從未收到任何反饋。
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>
過(guò)程如下:運(yùn)行這段代碼,之后可以看到cookie1(設(shè)置了HttpOnly標(biāo)志)已經(jīng)被JavaScript寫(xiě)入覆蓋了。
6、總結(jié)
HttpOnly標(biāo)志的引入是為了防止設(shè)置了該標(biāo)志的cookie被JavaScript讀取,但事實(shí)證明設(shè)置了這種cookie在某些瀏覽器中卻能被JavaScript覆蓋,可被攻擊者利用來(lái)發(fā)動(dòng)session fixation攻擊。該問(wèn)題被提出后,得到了相關(guān)廠商的響應(yīng)。最后,本文給出了一段利用演示代碼。