やられアプリ BadTodo - 6 ディレクトリトラバーサル

前回:やられアプリ BadTodo - 5 オープンリダイレクト - demandosigno

https://todo.example.jp/resize.phpにディレクトリトラバーサルがあるようです。

場所としてはログイン後のマイページにあるアイコン画像のURLとなります。

ZAPの例通りアドレスを入力してみます。
https://todo.example.jp/resize.php?path=temp&basename=..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd&size=64

/etc/passwd が表示されました。

最小の入力としては下記となります。
https://todo.example.jp/resize.php?path=icons&basename=..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd つまり
../../../../../etc/passwdであり、ディレクトリを5つ遡ってルートから/etc/passwdを見ている。
実際にwwwサーバーApache上のアイコン画像の位置は/var/www/html/todo/iconsなので、5つ遡るとルートディレクトリとなります。

/etc/hosts なども閲覧できます。

対策:
・外部からファイル名を指定できる仕様を避ける
・ファイル名を英数字に限定する
・ファイル名にディレクトリ名が含まれないようにする

『ディレクトリを示す記号文字は「/」「\」「:」などOSにより異なるので、OSによる違いを考慮したライブラリを用いるべきです。PHPの場合は basename という関数が使用できます。』(徳丸本 p.286より)
PHP: basename - Manual パスの最後にある名前の部分を返す

次回:やられアプリ BadTodo - 7 リモート・ファイルインクルード(RFI) - demandosigno

/* -----codeの行番号----- */