InterKosenCTF writeup【uploader,Temple of Time, Image Extractor】
uploader
uploaderの名の通り、ファイルをアップロードできるサイトにアクセスできます。
ソースの脆弱な部分は以下の"WHERE instr(~~~"の一文。
$files = []; // search if (isset($_GET['search'])) { $rows = $db->query("SELECT name FROM files WHERE instr(name, '{$_GET['search']}') ORDER BY id DESC"); foreach ($rows as $row) { $files []= $row[0]; } }
GETメソッドで受け取った値がSQLのクエリにそのまま展開されるので、
$_GET['search'] = "') UNION SELECT passcode FROM files -- -"
としてやればUNION-based SQLiが成功し、アップロードされているファイルに設定されているパスコードが全て表示されるので、flagが書いてあるであろうsecret_fileをDLしflagゲット
KosenCTF{y0u_sh0u1d_us3_th3_p1ac3h01d3r}
UNION-based SQLiは私の好きなSQLiの1つなので通せてよかったです。
Temple of Time
Time-based SQLiで攻撃されている最中のパケットを記録したpcapファイルが配られます。
Time-based SQLiに成功したパケットだけ抜き出せばflagゲット。
本来はscapyあたりでソルバを書き、スマートに解く方がいいのでしょうが、私は気合いで読みました。
KosenCTF{t1m3_b4s3d_4tt4ck_vl31s_1t}
似たような問題を見かけたことがあったので、楽でした。
Image Extractor
アップロードしたdocxファイル中の画像を抜き出してくれるサービスみたいです。
アップロード系の問題は、PHPファイルをフィルターバイパスしてアップし実行、flagを読み出すという王道があるので試したところ、拡張子偽装ではphpファイルがアップできませんでした。
docxファイルはXMLと関連があるそうなので(詳しくない)、XXEの可能性を疑いXMLファイルもアップを試みましたが、docxファイルではないのでFAILED to upload a fileという表示が。
ここでチームメイトが"word/media"というディレクトリ階層のファイルをzip化すればdocxファイルと認識され、その中にあらゆるタイプのファイルを仕込みアップできることを発見しました。
ここから6時間くらいかけ、.phpファイルや.rb、.erbはてまた../../flagというタイトルのファイルまで、どんなに無謀でもありとあらゆるファイルをアップしましたが、結果はすべて失敗でした。
また、問題の裏で動いているのがSinatraというフレームワークだったので、Sinatra関連のwriteupを片っ端から読み、SSTIが刺さるかも検証しましたが、インジェクションできる部分が見当たらないということで、これも断念しました。
7時間くらい経過したあと一旦中断し、半日くらい経った後に再度シンボリックリンク攻撃として、wordディレクトリの中のmediaディレクトリに"/flag"へのシンボリックリンクを貼ったtest.txtを仕込み、シンボリックリンク有効のままzip化しアップロードしたところflagが読み出せました。
KosenCTF{sym1ink_causes_arbitrary_fi13_read_0ft3n}
この問題は難易度がeasyだったにも関わらず、他分野のhard並みに正答チームが少なかったので、一応Web問担当の私はひたすら頭を抱えていましたw
ですが、最後まで諦めず取り組んで得たflagなので、大事にしようと思います(?)
ちなみに、解けた今ではeasyだったなと思います。
感想
主催者の方が前年よりもレベルを下げました!とおっしゃっていたので、よっしゃWeb全完するぞーと意気込んでいましたが、結果は2/5しか通せず、悔しい思いをしましたw
次の大規模なCTFではもっとflagを取ってチームに貢献したいです!
そしてチームメイトの1人が、私が解けないWeb問に頭を抱えていたところ、突然OSコマンドインジェクションのpayloadをslackに貼って「これでシェルが起動できます」と言い、そのままflagを取っていったあの光景が今でも忘れられません。笑笑
とてもかっこよかった