admin管理员组

文章数量:1794759

渗透测试XSS漏洞原理与验证(3)——Cookie安全

Cookie机制

Cookie机制:

一般来说,同域内浏览器中发出的任何一个请求都会带上Cookie,无论请求什么资源,请求时,Cookie出现在请求头的Cookie字段中。服务端响应头的Set-Cookie字段可以添加、修改和删除Cookie,客户端通过javascript也可以添加、修改和删除Cookie。另外,Cookie是无法跨浏览器存在的。

利用Cookie机制,我们可以存储用户的会话信息,比如,用户登陆认证后的Session,之后同域内发出的请求都会带上认证后的会话信息,很方便。也因此,攻击者特别喜欢盗取Cookie,这相当于盗取了目标网站上的用户权限。

Cookie重要字段

  • setcookie()函数用于设置cookie
代码语言:txt复制
[name][valuel][expires][path][domain][secure][httponly]

含义依次是:名称、值、过期时间、所属相对路径、域名、是否有Secure标志、是否有HttpOnly标志

子域Cookie机制

Domain字段,设置cookie时,如果不指定则默认是本域,

例如x.xxx域通过javaScript设置一个cookie:

代码语言:txt复制
Document.cookie="test=1"

此时,domain值默认是x.xxx,如果通过javaScript设置一个父域:

代码语言:txt复制
Document.cookie="test=1";domain="xxx"

此时,domain域变成xxx,这样的好处就是可以在不同的子域共享Cookie,坏处就是攻击者通过控制其他子域也能读到这个Cookie。

注意:此机制不允许设置Cookie的domain为下一级子域或其他外域

路径Cookie机制

path字段,设置cookie时,如不指定path的值,则默认是当前页面路径

例如www.xxx/admin/index.php页面通过JavaScript设置一个cookie:

代码语言:txt复制
document.cookie="test=1"

此时,path值默认是/admin/。

通过指定path字段,JavaScript可以设置任意Cookie到任意路径下,但是只有目标路径(/admin/路径)下的页面JavaScript才能读取到该Cookie。但是,通过设置path不能防止重要的Cookie被窃取。比如/test/路径想读取/admin/路径的Cookie,可以通过跨iframe进行Dom操作实现。

HttpOnly Cookie机制

  • HttpOnly是Cookie的一种属性。
  • 用于告诉浏览器不要向客户端脚本暴露Cookie。
  • 指仅在HTTP层面上传输Cookie,当设置了HttpOnly属性后,客户端脚本就无法读写该Cookie,能有效的防御XSS攻击获取Cookie。

如何设置?

Cookie操作函数setcookie函数也专门添加了第7个参数来做为HttpOnly的选项。

开启方法为:

代码语言:php复制
<?php
setcookie("test","1",time()+3600," "," ",0,0);      //设置普通Cookie
setcookie("test","1",time()+3600," "," ",0,1);      //第7个参数(这里最后一个),默认为0是HttpOnly标志,0为关闭,1为开启
?>

其中,test1是HttpOnly Cookie。如果服务端响应的页面有Cookie调试信息,很可能会导致HttpOnly Cookie的泄漏。比如phpinfo页面出现以下信息:

这里以CVE-2012-0053为例,Apache服务器2.2.0-2.2.21版本存在一个漏洞攻击者可通过给网站植入超大的Cookie使得HTTP头超过apache的LimitRequestFieldSize(最大请求长度)4192字节,apache便会返回400错误,并在返回信息中包含了http-only cookie。

Secure Cookie机制

Secure Cookie机制指的是设置了Secure标志的Cookie仅在HTTPS层面上安全传输,如果请求是HTTP的就不会带上这个Cookie,这样能降低重要的Cookie被中间人截获的风险。

但是,Secure Cookie对于客户端脚本来说是可读写的,也就意味着,它能够被盗取和篡改。可通过如下的JS代码可对已知的Secure Cookie进行篡改:

本地Cookie与内存Cookie

存储方式与过期时间(expires)相关。

如果没设置过期时间,则是内存Cookie,这样的Cookie会随着浏览器关闭而从内存中消失;如果设置了过期时间,那么就是本地Cookie,这样的Cookie就会以文本形式保存在操作系统本地,待过期时间到了才会消失。

那么究竟本地Cookie与内存Cookie那种方式更安全?

采用本地Cookie可以让用户在未来某一段时间内都不需要进行登录操作,但是,如果攻击者通过XSS得到这样的本地Cookie后,就能够在未来很长一段时间内,甚至永久控制着目标用户的账号权限。但这并不意味着内存Cookie更安全,因为攻击者可以给内存Cookie加一个过期时间,使其变为本地Cookie。

本地存储方式

浏览器本地存储是一种在浏览器中长久保存数据的方法,为本地数据持久化,当我们刷新页面或者同域名内页面跳转仍然可以保留数据。浏览器本地存储,对服务器来说减小存储压力;对用户来说,相应速度变快,提升用户体验。

浏览器本地存储方式:

综合对比

内存Cookie:

  • 内存Cookie的优点在于它们只在用户当前的浏览器会话期间存在。这意味着一旦用户关闭浏览器,这些Cookie就会被自动删除,减少了持久性的数据泄露风险。
  • 内存Cookie通常用于存储临时数据,如购物车中的物品或表单填写过程中的一些状态信息。
  • 安全性方面,因为它们不在硬盘上保存,所以相对更难被恶意软件或黑客长期监控获取。

本地Cookie:

  • 本地Cookie(有时称为持久Cookie)可以长期存储在用户的设备上,直到它们过期或者被用户手动删除。
  • 这种类型的Cookie可以用来记住用户的登录状态,偏好设置等信息,提供更好的用户体验。
  • 但是,由于它们存储在硬盘上,因此更容易受到恶意软件、钓鱼攻击或者不安全的网络连接的影响。

从安全性角度来看,内存Cookie因为其短暂的存在周期而显得更加安全。然而,在实际应用中,也需要结合其他安全措施来保护Cookie的信息,比如使用HTTPS加密传输、设置HttpOnly标志来防止JavaScript访问Cookie、使用Secure标志来确保Cookie仅通过加密连接发送等。


本文部分图片摘自深信服安全服务认证工程师课程课件中,为方便个人学习使用,勿作商用!!!!文字内容为自己手打,并非直接搬运!如有侵权,请联系删除!!!

本文档所提供的信息仅用于教育目的及在获得明确授权的情况下进行渗透测试。任何未经授权使用本文档中技术信息的行为都是严格禁止的,并可能违反《中华人民共和国网络安全法》及相关法律法规。使用者应当合法合规地运用所学知识,不得用于非法入侵、破坏信息系统等恶意活动。我们强烈建议所有读者遵守当地法律与道德规范,在合法范围内探索信息技术。

本文标签: 渗透测试XSS漏洞原理与验证(3)Cookie安全