浏览器因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当前在GooglePlay中可以下载,但Opera公司认为该版本已经过时,因此决定不对其进行修改(他们建议替换为Opera forAndroid版本,该版本可以防止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);
?> setcookie('cookie1',++$_COOKIE['cookie1'],time()+2592000,'/','',0,1);
setcookie('cookie2',++$_COOKIE['cookie2'],time()+2592000,'/','',0,0);
> setcookie('cookie1',++$_COOKIE['cookie1'],time()+2592000,'/','',0,1);
setcookie('cookie2',++$_COOKIE['cookie2'],time()+2592000,'/','',0,0);
>
print "Cookie1:".$_COOKIE['cookie1']."< print "Cookie1:".$_COOKIE['cookie1']."< print "Cookie1:".$_COOKIE['cookie1']."
";
print "Cookie2:".$_COOKIE['cookie2'];
>
过程如下:运行这段代码,之后可以看到cookie1(设置了HttpOnly标志)已经被JavaScript写入覆盖了。
6、总结
HttpOnly标志的引入是为了防止设置了该标志的cookie被JavaScript读取,但事实证明设置了这种cookie在某些浏览器
中却能被JavaScript覆盖,可被攻击者利用来发动session
fixation攻击。该问题被提出后,得到了相关厂商的响应。最后,本文给出了一段利用演示代码。
浏览器因cookie设置HttpOnly标志引起的安全问题的更多相关文章
- Cookie设置HttpOnly,Secure,Expire属性
在eclipese中创建Web工程时,有个dynamic web module version选项,首先解释下这个选项的意思: http://stackoverflow.com/questions/3 ...
- Servlet 2.5为cookie配置HTTPOnly属性
cookie的HTTPOnly属性,主要是用来防止JavaScript来读取cookie,默认情况下,JavaScript可以通过document.cookie来读取cookie,这样是很不安全的.通 ...
- PHP设置COOKIE的HttpOnly属性
httponly是微软对cookie做的扩展.这个主要是解决用户的cookie可能被盗用的问题. 大家都知道,当我们去邮箱或者论坛登陆后,服务器会写一些cookie到我们的浏览器,当下次再访问其他页面 ...
- php设置cookie为httponly防止xss攻击
什么是XSS攻击? XSS攻击(Cross Site Scripting)中文名为跨站脚本攻击,XSS攻击时web中一种常见的漏洞.通过XSS漏洞可以伪造目标用户登录,从而获取登录后的账号操作. 网站 ...
- Python3+Selenium2完整的自动化测试实现之旅(四):Selenium-webdriver操作浏览器、Cookie、鼠标键盘、警示框、设置等待时间、多窗口切换
本篇学习总结webdriver模块操作浏览器.Cookie.鼠标键盘.警示框.设置等待时间.多窗口切换等方法的使用 1 浏览器控制 Selenium-webdriverAPI提供了对页面元素定位 ...
- express 设置 cookie 以及 httpOnly
权限控制基本 cookie 在 express 中引入 cookie-parser const express = require('express') const cookieParser = re ...
- Session Cookie的HttpOnly和secure属性
Session Cookie的HttpOnly和secure属性 一.属性说明: 1 secure属性 当设置为true时,表示创建的 Cookie 会被以安全的形式向服务器传输,也就是只能在 HTT ...
- Cookie的HttpOnly、secure、domain属性
Cookie主要属性 Cookie主要属性: path domain max-age expires:是expires的补充,现阶段有兼容性问题:IE低版本不支持,所以一般不单独使用 secure h ...
- JAVA设置HttpOnly Cookies
HttpOnly Cookies是一个cookie安全行的解决方案. 在支持HttpOnly cookies的浏览器中(IE6+,FF3.0+),如果在Cookie中设置了"HttpOnly ...
随机推荐
- UVA - 213 Message Decoding (输入字符串并对单个字符进行操作的输入输出)
POINT: 关于表示一个编码:利用code字符数组表示一个编码字符,其中code[len][val]表示长度为len,二进制值为val的字符: 主程序如下: #include <iostrea ...
- IE, FF, Safari前端开发常用调试工具
一些前端开发 IE 中的常用调试工具: Microsoft Script Debugger —— Companion.JS need to install this Companion.JS —— J ...
- HTTP层 —— 请求
1.访问请求实例 要通过依赖注入获取当前 HTTP 请求实例,需要在控制器的构造函数或方法中对 Illuminate\Http\Request 类进行类型提示,这样当前请求实例会被服务容器自动注入: ...
- 【转】Myeclipse8.5 反编译插件 jad 安装
[转]Myeclipse8.5 反编译插件 jad 安装 准备工作 下载jad.exe文件下载window版本:http://varaneckas.com/jad/ 下载jadeclipse插件:ht ...
- vc静态加载dll和动态加载dll
如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib, &quo ...
- 虚拟光驱 DAEMON Tools Lite ——安装与入门
DAEMON Tools Lite 是什么?它不仅仅是虚拟光驱.是的,你可以使用它制作.加载光盘映像,但是 DAEMON Tools 产品那么多,Lite版与其他版本究竟有什么不同呢?或者说,是什么让 ...
- C# 高精度求幂 poj1001
高精度求幂 public static char[] exponentiation(string a,int r) { ]; string b = ""; string c = a ...
- 一种c#深拷贝方式完胜java深拷贝(实现上的对比)
楼主是一名asp.net攻城狮,最近经常跑java组客串帮忙开发,所以最近对java的一些基础知识特别上心.却遇到需要将一个对象深拷贝出来做其他事情,而原对象保持原有状态的情况.(实在是不想自己new ...
- 队列(链式存储)C++模板实现
#include <iostream> using namespace std; //队列结点类 template <typename T> class QueueNode{ ...
- jQuery去掉导航分割线的最后一条竖线
#top #navigation ul li { float:left; width:120px; background:url(../images/navline.jpg) no-repeat 11 ...