mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
30 lines
2.0 KiB
Markdown
30 lines
2.0 KiB
Markdown
# Chrome Cache to XSS
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
更多详细信息 [**在这篇文章中**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-spanote)。
|
||
|
||
这里讨论的技术涉及理解两种主要缓存类型的行为和交互:**后退/前进缓存 (bfcache)** 和 **磁盘缓存**。bfcache 存储页面的完整快照,包括 JavaScript 堆,由于其能够存储更全面的快照,因此在后退/前进导航中优先于磁盘缓存。相比之下,磁盘缓存存储从网络获取的资源,但不包括 JavaScript 堆,并用于后退/前进导航以减少通信成本。磁盘缓存的一个有趣方面是它包含使用 `fetch` 获取的资源,这意味着访问的 URL 资源将由浏览器从缓存中呈现。
|
||
|
||
### 关键点:
|
||
|
||
- **bfcache** 在后退/前进导航中优先于磁盘缓存。
|
||
- 要利用存储在磁盘缓存中的页面而不是 bfcache,必须禁用后者。
|
||
|
||
### 禁用 bfcache:
|
||
|
||
默认情况下,Puppeteer 禁用 bfcache,符合 Chromium 文档中列出的条件。禁用 bfcache 的一种有效方法是通过使用 `RelatedActiveContentsExist`,通过使用 `window.open()` 打开一个页面并保留对 `window.opener` 的引用来实现。
|
||
|
||
### 复制行为:
|
||
|
||
1. 访问一个网页,例如 `https://example.com`。
|
||
2. 执行 `open("http://spanote.seccon.games:3000/api/token")`,这将导致服务器响应 500 状态码。
|
||
3. 在新打开的标签页中,导航到 `http://spanote.seccon.games:3000/`。此操作将 `http://spanote.seccon.games:3000/api/token` 的响应缓存为磁盘缓存。
|
||
4. 使用 `history.back()` 返回。此操作将导致页面上呈现缓存的 JSON 响应。
|
||
|
||
可以通过在 Google Chrome 中使用 DevTools 确认磁盘缓存的使用。
|
||
|
||
有关 bfcache 和磁盘缓存的更多详细信息,可以参考 [web.dev 上的 bfcache](https://web.dev/i18n/en/bfcache/) 和 [Chromium 的磁盘缓存设计文档](https://www.chromium.org/developers/design-documents/network-stack/disk-cache/)。
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|