PHP は、RFC 1867 に基づいてファイルのアップロードを自動的にサポートします。次の例を見てみましょう。
したがって、PHP プログラムがファイルのアップロードを受け入れるかどうかを決定する前に、ファイルはすでにサーバーに保存されているため、攻撃者は PHP を実行しているホストに任意のファイルを送信することができます。
ここでは、ファイルのアップロードを使用してサーバーに DOS 攻撃を実行する可能性については説明しません。
ファイルのアップロードを処理する PHP プログラムを考えてみましょう。上で述べたように、ファイルはサーバー上で受信されて保存されます (場所は構成ファイルで指定されており、通常は /tmp)。 「phpxXuoXG」形式に似たランダム。 PHP プログラムは、ファイルを処理するためにファイルの情報をアップロードする必要があります。これには 2 つの方法があります。1 つは PHP 3 ですでに使用されており、もう 1 つは以前の方法に関するセキュリティ アドバイザリを作成した後に導入されました。
しかし、問題は依然として存在しており、ほとんどの PHP プログラムはアップロードされたファイルを処理するために依然として古い方法を使用していると確信できます。 PHP は、上記の例のように、アップロードされたファイルを記述するために 4 つのグローバル変数を設定します。
$hello = ローカル マシン上のファイル名 (例: "/tmp/phpxXuoXG")
$hello_size = ファイルのバイト単位のサイズ (例: 1024)$hello_name = リモート システム上のファイルの元の名前 (例: "c:\temp\hello.txt")
$hello_type = アップロードされたファイルの MIME タイプ (例: "text/ plain") )
その後、PHP プログラムは "$hello" に従って指定されたファイルの処理を開始します。問題は、"$hello" が必ずしも PHP によって設定された変数ではなく、リモート ユーザーであれば誰でも指定できることです。次のメソッドを使用すると:
http://vulnhost/vuln.php?hello=/etc/passwd&hello_size=10240&hello_type=text/plain&hello_name=hello.txt
の結果は次の PHP になります。グローバル変数 (もちろん POST メソッドも可能 (Cookie も)):
$hello = "/etc/passwd"
$hello_size = 10240$hello_type = "text/plain"
$hello_name = "hello.txt"
上記のフォーム データは、PHP プログラムが期待する変数を満たしていますが、この時点では、PHP プログラムはアップロードされたファイルを処理せず、「/etc/」を処理します。 passwd ” (多くの場合、コンテンツの露出につながります)。この攻撃を使用すると、機密ファイルの内容が暴露される可能性があります。