次のコードを検討してください
<?php
// warning: this code is unsafe and for demonstrational purposes only,
// do not use in a production environment
$filename = $_GET['filename'];
$extension = 'txt';
$path = '/absolute/path';
$fullFilename = sprintf('%s/%s.%s', $path, $filename, $extension);
echo file_get_contents($fullFilename);
絶対パスを先頭に追加することは、指定されたパスから離れないようにするための適切な手段ではないことは誰もが知っています (少なくとも私はそう願っています) ../
。クエリ文字列に 1 つ以上の " " を挿入するだけで、ファイル上の任意のパスに到達できます。システム。
私の質問は次のとおりです。指定された例と同様に、指定さ$_GET['filename']
れた拡張子サフィックスもバイパスできるように操作することもできます。つまり、.txt 以外のファイルがエコーされますか? 私は特に../
、プレフィックスと同じ方法で追加されたファイル拡張子をバイパスする特定の制御文字について考えています。
いくつかの制御文字 (たとえば、削除の ASCII コード 127) をクエリ文字列に追加したり、 &&
、|
またはを使用して 2 つのファイル名を連結しようとしまし>
たが、すべて役に立ちませんでした。
(ちなみに、この質問はシステムを悪用する目的で尋ねられたものではないことに注意してください。これは、最近私の頭に浮かんだ純粋に架空の質問です。)