utsuroi path traversal labs Lab 02 / 5 — Practitioner
02

単純な ../ フィルタの回避

Path traversal with single replacement filter

Lab 01 の指摘を受けて、うつろい journal のダウンロード機能は../ のフィルタを実装した:

// PHP - 「../」を1度だけ置換削除する実装
$file = str_replace('../', '', $_GET['file']);
return readfile('/var/www/utsuroi/articles/' . $file);

開発者は「../ を消したから安全」と考えた。しかし、置換は1度しか走らないので、置換後に ../ が再構成される入力で素通りできる。

フィルタを回避するペイロードで /etc/passwd を取得してください。

クイック試行:
フィルタの動作トレース
入力: (空)
str_replace('../', '', input) → 結果が決まる
(まだファイルを取得していません)
回避の仕組み
入力:           ....//....//etc/passwd
                ↓ str_replace('../', '', $)
"./.." と "//" の部分は ../ パターンに当たる箇所だけ消える
"..../" の中の前2文字 ".." は残る
最終的に: ../../etc/passwd  ← 再構成されてしまった
正解(ネタバレ)

ペイロード:....//....//....//etc/passwd

これを str_replace('../', '', $) に通すと、../ パターンに該当する位置だけが削除され、結果として ../../../etc/passwd が再構成されます。「再帰的な置換」「.. を含むなら拒否」 等で対応する必要があります。