标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2024-3234]   作者: 小螺号 发表于: [2022-12-28]

本文共 [346] 位读者顶过

Cookie是网络服务器生成并随每个请求发送的小块信息。Web浏览器将它们收到的cookie存储预定的时间段,或存储用户在网站上的会话时长。 [出自:jiwo.org]

Cookies有助于将用户信息告知网站,使网站能够个性化用户体验。Cookie主要用于会话管理、个性化和跟踪。

浏览器中使用最多的会话存储机制是cookie存储。由于HTTP是一种无状态协议,它不存储对同一用户发送的请求的任何引用,因此创建会话cookie并将其附加到每个HTTP请求,以便可以使用cookie识别用户。Cookie可以由服务器设置,方法是在HTTP响应中包含Set-Cookie标头或通过JavaScript。

让我们从下图了解cookies是如何设置的:

如果服务器想要跟踪来自特定设备的用户阅读的博客名称,它会使用cookie将博客名称保存到用户的机器上。这是通过在每次阅读博客时将HTTP响应中*Set-Cookie标头中的cookie发送到浏览器来完成的。*浏览器将其保存在设备上,下次用户从同一台机器访问该站点时,浏览器将发送保存的cookie。这样服务器就可以跟踪用户阅读过的博客,并使用这些数据在他们每次访问时显示类似的博客。

WebCookie通常是恶意用户的主要攻击媒介,应用程序应始终尽职尽责地保护cookie。

保护Cookie及其反问题

为了保护cookie数据,设置了许多属性,如Secure、HttpOnly、Domain、Path、Same-Site、Expires。这里我们将重点关注HttpOnly属性。

HttpOnly是包含在Set-CookieHTTP响应标头中的*标志。*在生成cookie时使用HttpOnly标志有助于降低客户端脚本访问受保护cookie的风险。

HttpOnlycookie从浏览器发送到服务器,但在浏览器中它们不能被JavaScript读取。

因此,即使存在跨站点脚本(XSS)漏洞并且用户无意中点击了利用该漏洞的链接,浏览器也不会向第三方泄露cookie。

但是,仍然可以覆盖标记为HttpOnly的cookie

事实证明,HttpOnly标志在某些浏览器中可以被JavaScript覆盖,攻击者可以利用这种覆盖可能性来发起会话固定攻击。

Cookie溢出

浏览器只能存储有限数量的cookie。

一个域可以存储的cookie数量因浏览器而异,最多只能存储几百个cookie。

当写入更多cookie时,最旧的cookie将被删除。通过设置许多cookie,应用程序可以使浏览器删除旧的cookie。

这适用于JavaScript,它还会删除HttpOnlycookie。因此,脚本可能会通过生成数百个垃圾cookie来清除HttpOnlycookie。HttpOnlycookie然后可以通过设置一个具有相同名称但不是HttpOnly的新cookie来成功覆盖。

当JavaScript可以用HttpOnly标志覆盖cookie时,攻击者可以在跨站点脚本利用的情况下通过HttpOnlycookie发起会话固定攻击。作为会话固定攻击的结果,攻击者可以冒充受害者。在这种情况下,如果成功登录后应用程序中没有重新生成会话,JavaScript可以覆盖某些浏览器中的HttpOnly标志,这可以利用成功登录后应用程序中不重新生成会话的优势,以便最终启动一个会话固定攻击。

示例攻击场景:

下面是利用存储型跨站脚本执行CookieJar溢出攻击的场景。

  1. 首先,检查应用程序是否存在存储型XSS漏洞,这确认应用程序可以运行客户端JavaScript。

  2. 注入以下脚本负载,"for循环"运行700次,将创建700个垃圾cookie并将其存储在浏览器中。

    <script>for(leti=0;i<700;i++){document。cookie=cookie${i}=${i};Secure;}</script> <script>alert(document。cookie)</script>

3.如上所述,浏览器只存储几百个cookie,旧的cookie连同应用程序的会话cookie将被删除。这是对HTTPS会话完整性的轻微违反,可能会产生重大后果。

4.当应用程序重新加载时,用户被抛出会话。

5.这可以被进一步利用来执行会话固定。

通过注入以下脚本,可以删除旧的会话cookie并设置新的会话cookie:

<script>for(leti=0;i<700;i++){document。cookie=`cookie${i}=${i};Secure`;
document。cookie="session_id=random_value_set_by_attacker"</script>

6.如果应用程序接受攻击者设置的这个cookie,攻击者就可以成功登录并完全控制用户的账户。

下面的截图显示了JavaScript负载被注入并存储在应用程序中:

JavaScript负载已被执行,并出现警告弹出窗口,表明该应用程序易受存储的跨站点脚本攻击:

下面的屏幕截图显示,在执行JavaScript负载后生成了大约700个垃圾cookie,这些cookie存储在浏览器中,并将HttpOnly属性设置为False

在此应用程序中,观察到旧的会话cookie已被删除,并且用户被抛出会话。

评论

暂无
发表评论
 返回顶部 
热度(346)
 关注微信