web-dev-qa-db-ja.com

保護するファイルタイプのブラックリストを作成するPHPアプリケーション

私はPHPユーザーがファイルをアップロードできるシステムで作業しています。

悪意のあるコードからシステムを保護しようとしているので、アップロードをブロックする必要があるファイルのある種のブラックリストについて考えています。

ホワイトリストはブラックリストよりも優れています であり、これが私の一般的なアプローチですが、この場合、多くの理由(自分の制御外)でファイルのブラックリストを作成する必要がありますが、それでも探しています安全のため(可能な場合)。

これは私の現在のスクリプトです(ファイルの種類を取得するためにMIMEタイプをチェックしています)。

        $finfo = finfo_open(FILEINFO_MIME_TYPE);
        $check= finfo_file($finfo,$file["tmp_name"]);
        finfo_close($finfo);

        $dangerMime = array('application/x-bsh', 'application/x-sh', 'application/x-shar', 'text/x-script.sh');
        if (in_array($check, $dangerMime)) {
            //block upload
        }
        else {
            //allow upload
        }

ブロックするMIMEタイプの現在のリストは次のとおりです。

  • 「application/x-bsh」、「application/x-sh」、「application/x-shar」、「text/x-script.sh」

システムはApacheのCentOSで実行されているため、.shファイルをブロックしようとしています。ブロックする必要がある他のファイルタイプはありますか?

以下は重要な情報です。

サーバーは、Apache 2.4.6を搭載したCentOS 7.2です。アップロードディレクトリの権限は次のとおりです。

drwxr-xr-x  4 Apache apache 4096 Jan  8 12:23 uploads

注:このプロジェクトでは、私は開発者として行動しているため、ファイルのアクセス許可を変更できません。

10
James

これらのファイルを正確にブロックする理由が説明から明確ではありません。次の可能性があります。

  • サーバー自体に感染する可能性のあるファイルをブロックしたい。残念ながらこれは何でもかまいません:シェル、Perl、python、awk、...そしてもちろんコンパイルされたバイナリ。ただし、これらのファイルをインタープリターで明示的に呼び出さずに実行するには、実行可能ビットを設定する必要があります。これは、ファイルがWebアプリケーション内からアップロードされる場合には当てはまりません。これは、少なくともUNIXシステムの場合に当てはまります。Windowsでは拡張機能で十分であり、PoweShell、JavaScript、Batch、およびその他すべてのファイルもあるからです。それでも、何かが少なくともファイルの実行をトリガーするか、DLLと共有ライブラリのパスにアップロードディレクトリを持っている必要があります。
  • または、Webサーバー自体によって、つまりWebアプリケーション内から実行される可能性のあるファイルをブロックしたい場合。これらは、URLを介して実行され、ユーザーまたはサーバーに害を及ぼすPHP、ASP、CGI ...ファイルです。もちろん、が機能するのは、アップロードディレクトリがURLで到達可能である場合、または攻撃者がパストラバーサル攻撃などでアップロードディレクトリから抜け出した場合、または攻撃者がこれらのファイルを含めるためにサーバー側のコードを管理した場合(つまり、ローカルファイルインクルード)のみです。攻撃)。
  • または、マルウェアをユーザーに提供するために含まれている可能性があるファイルをブロックする必要があります。つまり、破損しているPDFドキュメント、JavaScriptがマルウェアサイトにリダイレクトしています。この場合、おそらくアップロードディレクトリがあります。ユーザーにこれらのファイルをダウンロードしてもらうためのURLです。残念ながら、そのようなファイルでは、表示されるファイルタイプだけでなく、それらが呼び出されるコンテキスト(つまり、イメージ、スクリプト、CSS、オブジェクトなど)も重要です。この使用法を制御できません。

...しかし、この場合、さまざまな理由でファイルのブラックリストを作成する必要があります。

あなたは明らかにどのファイルが危険かを知らないので、そのような種類のブラックリストは機能しません。見逃すファイルタイプは常に存在します。そうでない場合、攻撃者はそのファイルを他のタイプの後ろに隠します。つまり、 polyglot を作成します。

22
Steffen Ullrich

特定のMIMEタイプをブロックしないでください。アップロードされたファイルのあらゆる種類の実行をブロックします。簡単な方法は、アップロードされたファイルをWebルートの外部に保存し、スクリプトを介して提供することです。それが不可能な場合は、ファイルをサブディレクトリに保存し、サーバーを構成します そのディレクトリでスクリプトを実行しないようにします 。サーバーで有効になっている可能性のあるanyスクリプト言語については、必ずこれを実行してください。

さまざまな理由で構成を変更できない場合は、ファイル名を確認して適切に実行してください。 PHP文字列にはNULLバイトを含めることができ、ファイル名には含めることができないため、攻撃者が「hack.php\0.jpg」というファイルをアップロードした場合、拡張子は有効な「.jpg」と表示される可能性があります、しかし「hack.php」として保存され、再び脆弱になります。ファイル名の文字をホワイトリストと照合してください。

14
meowmaster

ブロックする必要がある他のファイルタイプはありますか?

finfo_fileをバイパスできるため、問題ではありません。たとえば、次の例を参照してください: PNG IDATチャンクでのWebシェルのエンコード 。 mime_content_typeも信頼性が高いとは言えません。

mimetypeチェックに加えて、ファイル拡張子をチェックする必要がありますファイル名はファイルよりもはるかに複雑ではないため、信頼性が高くなります。内容。

追加のMIMEタイプのチェックは、単純な攻撃を除外するための多層防御として依然として優れたアイデアです。あなたが言ったように、ホワイトリストは正しいアプローチですが、ブラックリストを使用する必要がある場合は、少なくともPHP mimetypesをブロックリストに追加:

  • テキスト/ php
  • テキスト/ x-php
  • アプリケーション/ php
  • application/x-php
  • application/x-httpd-php
  • application/x-httpd-php-source

さらに、本当にアップロードディレクトリで実行する必要がありますか?そうでない場合は、セキュリティを高めるために削除してください。

6
tim

アップロードされたすべてのファイルを短期的に隔離することをお勧めします。一時的な刑務所でローカルシステムのスキャンとAVツールを使用できます。このようにして、悪意のあるファイルをスキャンするルーチンを追加し、ファイルのさまざまな名前をすべて無視することができます。これは、もぐらたたきゲームを停止します。

これにより、アプリケーションにレイテンシが追加されます。

私はこれがコーディングソリューションではないことを知っていますが、ブラックリストを使用することで根本的な欠陥に対処し、権限を調整するように強制しません。

私はあなたが提案する方法をブラックリストに載せたアプリケーションに出くわしました。敵対者がコントロールを取り、9か月間企業資産を供給していた後、フォレンジック分析を行っていたときにそれを発見しました。これがブラックリストを停止する十分な理由でない場合は、楽しんでください。強打強打。

2
D0c0z