关于客户端 Self-XSS 漏洞的利用技巧。
有时,需要利用 XSS 或 CRLF 注入在一个无趣的子域名上,从而在另一个子域名上利用 Self-XSS,该子域名托管着主要应用程序,并包含用户的会话信息。
通常,这可以通过以下方式实现:
1) 准备一个攻击者的会话,该会话在 /foo/bar 页面上触发 Self-XSS。
2) 使用 CRLF 注入,在受害者的浏览器中添加另一个包含攻击者会话信息的 cookie,路径为 `/foo/bar`。
Set-Cookie: sessionid=; domain=.company.tld; path=/foo/bar; secure; samesite=none;
由于原始会话具有不同的 path 属性,因此添加的 cookie 不会覆盖原始 cookie。
在整个网站上,用户将使用自己的会话进行身份验证,但在 /foo/bar 页面上,会发送以下头部信息。
Cookie: sessionid=; sessionid=;
也就是说,包含攻击者会话信息的 cookie 会在头部中首先发送,因为它与 path 前缀的匹配度更高。 按照 RFC 的规定,Web 应用程序会选择头部中第一个值作为最终结果。 结果是,只有在 /foo/bar 页面上,用户才使用攻击者的会话进行身份验证,并且在该会话中会触发 XSS。 这允许在原始用户的会话下执行操作,通过向其他路径发送请求。
但是,如果 Web 应用程序在会话 cookie 中具有相同的键时,选择最后一个值怎么办?
如果重复使用 path 技巧,攻击者的会话会首先出现,并被忽略。
如果设置相同的 `path`,则原始用户的会话将被覆盖,攻击将失去意义(尽管这仍然可以作为 CRLF 注入 -> XSS 来使用,但现在需要第三个漏洞才能展示其影响)。
在某些情况下,创建一个类似 cookie 可能会有所帮助,该 cookie 被 Web 服务器视为与原始 sessionid 相同,但在浏览器中被视为两个不同的 cookie。
sessionID=value;
"sessionid"=value;
sessionid =value; (似乎已经修复)
x=x,sessionid=value;
但有时很难找到这种 cookie。
最近出现的一个名为 Partitioned 的 cookie 属性,旨在为顶级网站的 cookie 提供单独的存储空间,允许 Chrome 创建两个具有相同名称、`domain` 和 path 属性的 cookie。
Set-Cookie: sessionid=; domain=.company.tld; path=/; secure; samesite=none; partitioned;
结果是,受害者的浏览器将在每个请求中发送两个会话。 攻击者的 cookie 会最后发送,并且 Self XSS 会生效。
为了在 XSS 触发后“退出”攻击者的会话,可以使用 JavaScript 删除添加的 cookie,并在当前页面上执行任意操作,从而使用原始用户的会话。
👉 技术合作联系: @GotFFs