この記事は新歓ブログリレー 50日目の記事です。
この記事は、先日のCPCTFで作問した問題の作問者Writeupです。
[web] Read Novels
問題文
小説が読めるサイトを見つけたぞ!
これ小説以外も見れるじゃん...
サイト:https://read-novels.web.cpctf.space
配布ファイル:https://files.cpctf.space/read-novels.zip
解説
単純な文字列結合でファイルパスを作成しているため、パストラバーサル攻撃が可能です。
filepath
を./novel/../flag
にするために、 name
として ../flag
などを送ることでフラグが得られます。
[web] Let's buy some array
問題文
贔屓にしている数列屋さんがモバイルオーダーに対応したらしい。とは言っても金額計算機能しかないらしいけど。
...この金額計算、あんまり安全じゃなくないか?
問題サーバー:https://lets-buy-some-array.web.cpctf.space/
配布ファイル:https://files.cpctf.space/lets-buy-some-array.zip
解説
金額計算にPHPのeval()
が使われているため、任意コード実行が可能です。
eval('return ' . $_POST["quantity1"] . '*1000;')
の$_POST["quantity1"]
に不正なコードを注入することを考えます。
環境変数FLAG
にフラグが含まれているため、$_ENV['FLAG']
を返すようなコードを注入することを考えます。
単に$_ENV['FLAG']
を入れると$_ENV['FLAG'] *1000
が実行されてしまいます。PHPはPythonなどと異なり文字列×数字の演算は出来ないので、これはエラーになります。
エラーを回避する方法としては、*1000の前に数字を置く方法があります。例えば、quantity1
として$_ENV['FLAG'] . 2
などを送ることで$_ENV['FLAG'] . 2*1000
を実行させることができます。
なお、数値以外が入力されていないことがクライアント側でのみ検証されているので、type="number"
を開発者ツールで除去するなどの適当な手段で回避する必要があります。
[OSINT] Doctor yellow
2024年の東工大の前期合格発表の翌日、河川敷を歩いていたら黄色い新幹線が走っているのを見かけました。
これはどこで撮られた写真でしょう?
フラグは撮影された場所の緯度と経度を10進数で表記して小数点以下3桁で切り捨てたものを順に並べたものです。
(例えば北緯aa.bb度 東経ccc.dd度であるとき、緯度と経度を用いてCPCTF{aabb_cccdd}です。)
解説
空が橙色なので日の出日の入りの前後に撮影された写真であると分かります。
2024年の東工大の前期合格発表の翌日、すなわち2024年3月9日の東京の日の出は6:00、日の入りは17:43です。
ドクターイエローが朝早くに走ることはないので、17:43頃に撮影された写真であると推測できます。
2024年3月9日のドクターイエローの走行情報を調べると、博多から東京に向かって「のぞみ号」と同様の停車パターンで検測を行う、いわゆる「のぞみ検測」が行われていたことが分かります。Web検索をすることで「のぞみ検測」をドクターイエローは17:43頃に品川駅付近を通過することが分かります。
また、写真には大きな河川が写り込んでいます。品川駅付近の大きな河川と新幹線が交わる場所の衛星写真やGoogle ストリートビューなどを確認することで、沼部駅付近の東海道新幹線多摩川橋梁を東京都側から撮影した写真であることがわかります。
フラグは CPCTF{3558_13967}
です。度分秒(60進法)ではなく10進法で回答する必要がある点に留意しましょう。
ちなみに作問中に気付いたのですが、実はGoogle Lensで検索すると一発で解けてしまいます。トリミングで情報量を増やしてもこの解法が防げなかったため、別解として残すことにしました。
おわりに
いかがでしたか?
やや簡単な問題が中心だったので楽しんでもらえるか少し不安があったのですが、初心者の皆さんにもヒントなどを参考にしながら楽しんでもらえたようで嬉しかったです。
明日のブログリレーの担当は@ogu_kazemiya君です。お楽しみに!