ホームページ >php教程 >php手册 >動的WebページPHPプログラムでのファイルアップロードのセキュリティ問題

動的WebページPHPプログラムでのファイルアップロードのセキュリティ問題

WBOY
WBOYオリジナル
2016-06-21 09:01:29830ブラウズ

PHP は、RFC 1867 に基づいてファイルのアップロードを自動的にサポートします。次の例を見てみましょう。

INPUT TYPE="FILE" NAME="hello">

🎜 >


上記のコードにより、ユーザーはローカル マシンからファイルを選択でき、送信をクリックすると、ファイルがサーバーにアップロードされます。これは明らかに便利な機能ですが、PHP の応答方法により安全ではありません。 PHP がそのようなリクエストを初めて受信すると、呼び出された PHP コードの解析を開始する前でも、まずリモート ユーザーからファイルを受け入れ、ファイルの長さが「$MAX_FILE_SIZE 変数」で定義された値を超えているかどうかを確認します。テスト用に、ファイルはローカルの一時ディレクトリに保存されます。

したがって、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 ” (多くの場合、コンテンツの露出につながります)。この攻撃を使用すると、機密ファイルの内容が暴露される可能性があります。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。