0

私は友人が彼のウェブサイトを保護するのを手伝っています. 彼は私にソース ファイルをくれました。私の意見では、多くの問題を引き起こす可能性があるものを見つけましたが、以前と同様に、私の友人はコードのこの部分が安全であると述べています。

if(is_file('foo/' . $_POST['f'] . '/bar/foo.php'))
  {
    include('foo/' . $_POST['f'] . '/bar/foo.php');
  }

私はinclude()関数をバイパスできることを彼に示しましたがis_file()、コードのこの部分は 100% 安全であるため、コードが安全でないことを彼に示すのを手伝ってください、またはこのコードが安全であることを私に納得させてください.

このコードはinclude()機能をバイパスします (WINDOWS):

curl_setopt($ch, CURLOPT_POSTFIELDS, 'f=../foo/bar.php' . str_repeat('.', 4086)); // without is_file() check this request leads to LFI

それでもis_file()falseを返します

4

4 に答える 4

2

このような構造の使用は避けてください。攻撃者が独自の PHP ファイルをサーバー (WWW ルートの外部、たとえば tmp フォルダーなど) に配置できる場合、Web サーバーのアクセス許可でそれを実行できます。

于 2013-05-05T08:46:26.040 に答える
2

ファイルが存在しない場合は、includeとにかくそれを含めません。その前にチェックを入れるis_fileことは冗長であり、セキュリティを追加しません。前述のように、ユーザー入力に基づいて任意のファイルを含めることは、常に悪い考えであり、セキュリティ上の欠陥です。ファイルが存在するかどうかを再確認するかどうか。

于 2013-05-05T08:58:43.803 に答える
2

is_fileまた、null バイトを使用して文字列を途中で終了includeできるという欠陥がありました。

そのため、PHP のバージョンによっては、次のような POST を実行すると、任意のファイルが出力される可能性があります。

f=../../../../../etc/passwd%00

PHP 5.3.4 以降、すべてのファイル システム関数がヌル バイト ポイズニングの影響を受けないと言われています。

于 2013-05-05T08:58:50.763 に答える
1

私の友人は、コードのこの部分が安全であると言います

あなたの友人が権威者である場合、そしてここでそのような質問をするのは彼のように聞こえるかもしれませんが、あなたは彼の言うことをよく聞き、彼の道をたどるべきです - 正しいか間違っているか. それが友達の目的です。お互いに間違いを許します。

それとは別に、許可された値のホワイトリストを作成して、$_POST['f']議論を終了してください。これを行うには、ここで有効なパスを修飾するものとそうでないものを正確に指定する必要があります。

何を保護したいのかが明確でない場合、議論にセキュリティをもたらすことはできません。

于 2013-05-05T10:38:49.427 に答える