0

私は Linux サーバーを持っています。私は自分のウェブサイトに画像をアップロードしています。登録したユーザーは自分の画像をアップロードできます。彼が自分のプロフィールにログインすると、自分の画像を見ることができます。また、自分の画像の URL リンクを取得することもできます。画像はサーバーの WWW/img ディレクトリにアップロードされます PHP でファイルの拡張子をチェックし、(.png、.gif、.jpg) ファイルのみを許可しています

しかし、なぜ誰かがGIF画像をアップロードしてすべてのファイルを削除したのかわかりません.RAIDを使用しているため、ユーザーが画像をアップロードしました.画像の内容は.......のようなものでした.

function vUMmFr($MkUOmK){$MkUOmK=gzinflate(base64_decode($MkUOmK));for($i=0;$i<strlen($MkUOmK);$i++){$MkUOmK[$i]=chr(ord($MkUOmK[$i])-1)}return $MkUOmK}eval(vUMmFr("7b1pe+M2sij8ved55j............

これは何ですか、どのように起こったのですか、どのようにしてすべてのファイルが削除されたのですか? これは何の言語ですか、どうすればファイルが削除されないように保護できますか..

4

1 に答える 1

4

おそらく、ユーザーが提供するものを盲目的に信頼し、ユーザーが提供した元のファイル名のファイルを webroot 内の公的にアクセス可能なディレクトリに配置する、非常に不適切に作成されたファイル アップロード ハンドラーを使用している可能性があります。要するに、あなたのファイル アップロード スクリプトは、「HACK ME!」と目をくらませる大きな点滅するネオン サインに相当するものでした。.

たとえば、次のようなものです。

<?php

if ($_FILES['file']['type'] == 'image/gif') {
    move_uploaded_files($_FILES['file']['tmp_name'], '/some/path/in/your/docroot/' . $_FILES['file']['name']);
}

ここで間違っていること:

  1. エラーをチェックしない - ファイルのアップロードはさまざまな理由で失敗する可能性があり、エラーをチェックしないことは非常に悪いことです
  2. フィールドはユーザー提供のデータです。['type']悪意のあるユーザーは、その MIME タイプを簡単に偽造できます。「somescript.php」を簡単にアップロードできますが、画像としてタグ付けします。
  3. ['name']ファイルを保存しているパスの一部としてパラメーターを盲目的に使用します。これも、ユーザーの制御下にあります。悪意のあるユーザーが 1 人いると、サーバーが自分自身をトイレに流します。
  4. docroot にファイルを保存します。これで、任意の名前を持つ任意のタイプの任意のファイルをアップロードできるようになりました。それがスクリプトであり、ファイルの場所が URL で到達できる場合、リモート ユーザーがサーバー上で必要なコードを実行できるようになります。

要するに、ファイルのアップロードを処理するときは、そのファイルを、爆発まであと 0.001 秒のすぐに爆発する核爆弾として扱います。元のファイル名で保存しません。ユーザーがアクセスできる場所に保存しません。予測可能なファイル名で保存しません。ファイルに対してサーバー側の検証を行います。あなたはファイルのスカートを持ち上げ、ボンネットの下を見て、それが本来あるべきものであることを確認します...それでも、あなたはまだそれが嘘をついていると思い込んでいます.

于 2012-09-23T03:25:45.233 に答える