前回:やられアプリ 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 パスの最後にある名前の部分を返す