hacktricks/pentesting-web/xss-cross-site-scripting/chrome-cache-to-xss.md

75 lines
6 KiB
Markdown
Raw Normal View History

2023-08-03 19:12:22 +00:00
# Chrome缓存到XSS
2023-01-12 13:44:25 +00:00
<details>
2023-08-03 19:12:22 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
* 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者想要获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFT收藏品The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
* **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享你的黑客技巧。**
2023-01-12 13:44:25 +00:00
</details>
2023-08-03 19:12:22 +00:00
从[**这篇文章**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-spanote)中获取的技术。
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
有两种重要的缓存类型:
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
* **后退/前进缓存bfcache**
* 参考[https://web.dev/i18n/en/bfcache/](https://web.dev/i18n/en/bfcache/)
* 它存储了页面的完整快照,**包括JavaScript堆**。
* 缓存用于后退/前进导航。
* 它优先于磁盘缓存。
* **磁盘缓存**
* 参考[https://www.chromium.org/developers/design-documents/network-stack/disk-cache/](https://www.chromium.org/developers/design-documents/network-stack/disk-cache/)
* 它存储了从网络获取的资源。缓存**不包括JavaScript堆**。
* 缓存也用于后退/前进导航以跳过通信成本。
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
作为磁盘缓存的一个有趣点,**缓存包括**不仅是渲染到网页的HTTP响应还包括**使用`fetch`获取的响应**。换句话说如果你访问了一个已获取的资源的URL**浏览器将在页面上渲染该资源**。
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
还有另一个重要的点。如果后退/前进导航时访问的页面同时在磁盘缓存和bfcache中都有效**bfcache优先于磁盘缓存**。因此,如果你需要访问同时存储在两个缓存中的页面,但想要使用磁盘缓存中的页面,你需要以某种方式**禁用bfcache**。
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
### 禁用bfcache
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
puppeteer的[默认选项](https://github.com/puppeteer/puppeteer/blob/v19.2.0/packages/puppeteer-core/src/node/ChromeLauncher.ts#L175)会禁用bfcache。
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
让我们在这个挑战中尝试这个有趣的行为。
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
首先你需要禁用bfcache[\[2\]](https://blog.arkark.dev/2022/11/18/seccon-en/#fn2)。有很多情况下bfcache会被禁用列表如下
2023-01-12 14:56:14 +00:00
* [https://source.chromium.org/chromium/chromium/src/+/main:out/mac-Debug/gen/third\_party/blink/renderer/core/inspector/protocol/page.cc?q=BackForwardCacheNotRestoredReasonEnum \&ss=chromium](https://source.chromium.org/chromium/chromium/src/+/main:out/mac-Debug/gen/third\_party/blink/renderer/core/inspector/protocol/page.cc?q=BackForwardCacheNotRestoredReasonEnum%20\&ss=chromium)
2023-08-03 19:12:22 +00:00
简单的方法是使用`RelatedActiveContentsExist`。
2023-01-12 14:56:14 +00:00
2023-08-03 19:12:22 +00:00
* `RelatedActiveContentsExist`:使用`window.open()`打开的页面,并且它引用了`window.opener`。
* 参考[https://web.dev/i18n/en/bfcache/#avoid-windowopener-references](https://web.dev/i18n/en/bfcache/#avoid-windowopener-references)
2023-01-12 14:56:14 +00:00
2023-08-03 19:12:22 +00:00
因此,以下步骤可以重现这个行为:
2023-01-12 14:56:14 +00:00
2023-08-03 19:12:22 +00:00
1. 访问一个网页(例如`https://example.com`
2. 执行`open("http://spanote.seccon.games:3000/api/token")`
* ![](https://blog.arkark.dev/images/2022/20221118-seccon-spanote-04.png)
* 服务器返回500状态码的响应。
3. 在打开的标签中访问`http://spanote.seccon.games:3000/`
* ![](https://blog.arkark.dev/images/2022/20221118-seccon-spanote-05.png)
* 然后,`http://spanote.seccon.games:3000/api/token`的响应被缓存为磁盘缓存。
4. 执行`history.back()`
* ![](https://blog.arkark.dev/images/2022/20221118-seccon-spanote-06.png)
* 缓存的JSON响应在页面上呈现
2023-01-12 14:56:14 +00:00
2023-08-03 19:12:22 +00:00
你可以使用Google Chrome的DevTools确认使用了磁盘缓存\
2023-01-12 14:56:14 +00:00
![](https://blog.arkark.dev/images/2022/20221118-seccon-spanote-07.png)
2023-01-12 13:44:25 +00:00
<details>
2023-08-03 19:12:22 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2023-01-12 13:44:25 +00:00
2023-08-03 19:12:22 +00:00
* 你在一家**网络安全公司**工作吗想要在HackTricks中看到你的**公司广告**吗?或者想要获得**PEASS的最新版本或下载HackTricks的PDF**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)
* 发现我们的独家[**NFT收藏品The PEASS Family**](https://opensea.io/collection/the-peass-family)
* 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com)
* **加入** [💬](https://emojipedia.org/speech-balloon/) [Discord 群组](https://discord.gg/hRep4RUj7f) 或 [Telegram 群组](https://t.me/peass) 或在 Twitter 上 **关注我** [🐦](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[@carlospolopm](https://twitter.com/hacktricks_live)**。**
* **通过向** [hacktricks 仓库](https://github.com/carlospolop/hacktricks) **和** [hacktricks-cloud 仓库](https://github.com/carlospolop/hacktricks-cloud) **提交 PR 来分享你的黑客技巧。**
2023-01-12 13:44:25 +00:00
</details>