私は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
注:このプロジェクトでは、私は開発者として行動しているため、ファイルのアクセス許可を変更できません。
これらのファイルを正確にブロックする理由が説明から明確ではありません。次の可能性があります。
...しかし、この場合、さまざまな理由でファイルのブラックリストを作成する必要があります。
あなたは明らかにどのファイルが危険かを知らないので、そのような種類のブラックリストは機能しません。見逃すファイルタイプは常に存在します。そうでない場合、攻撃者はそのファイルを他のタイプの後ろに隠します。つまり、 polyglot を作成します。
特定のMIMEタイプをブロックしないでください。アップロードされたファイルのあらゆる種類の実行をブロックします。簡単な方法は、アップロードされたファイルをWebルートの外部に保存し、スクリプトを介して提供することです。それが不可能な場合は、ファイルをサブディレクトリに保存し、サーバーを構成します そのディレクトリでスクリプトを実行しないようにします 。サーバーで有効になっている可能性のあるanyスクリプト言語については、必ずこれを実行してください。
さまざまな理由で構成を変更できない場合は、ファイル名を確認して適切に実行してください。 PHP文字列にはNULLバイトを含めることができ、ファイル名には含めることができないため、攻撃者が「hack.php\0.jpg」というファイルをアップロードした場合、拡張子は有効な「.jpg」と表示される可能性があります、しかし「hack.php」として保存され、再び脆弱になります。ファイル名の文字をホワイトリストと照合してください。
ブロックする必要がある他のファイルタイプはありますか?
finfo_fileをバイパスできるため、問題ではありません。たとえば、次の例を参照してください: PNG IDATチャンクでのWebシェルのエンコード 。 mime_content_typeも信頼性が高いとは言えません。
mimetypeチェックに加えて、ファイル拡張子をチェックする必要がありますファイル名はファイルよりもはるかに複雑ではないため、信頼性が高くなります。内容。
追加のMIMEタイプのチェックは、単純な攻撃を除外するための多層防御として依然として優れたアイデアです。あなたが言ったように、ホワイトリストは正しいアプローチですが、ブラックリストを使用する必要がある場合は、少なくともPHP mimetypesをブロックリストに追加:
さらに、本当にアップロードディレクトリで実行する必要がありますか?そうでない場合は、セキュリティを高めるために削除してください。
アップロードされたすべてのファイルを短期的に隔離することをお勧めします。一時的な刑務所でローカルシステムのスキャンとAVツールを使用できます。このようにして、悪意のあるファイルをスキャンするルーチンを追加し、ファイルのさまざまな名前をすべて無視することができます。これは、もぐらたたきゲームを停止します。
これにより、アプリケーションにレイテンシが追加されます。
私はこれがコーディングソリューションではないことを知っていますが、ブラックリストを使用することで根本的な欠陥に対処し、権限を調整するように強制しません。
私はあなたが提案する方法をブラックリストに載せたアプリケーションに出くわしました。敵対者がコントロールを取り、9か月間企業資産を供給していた後、フォレンジック分析を行っていたときにそれを発見しました。これがブラックリストを停止する十分な理由でない場合は、楽しんでください。強打強打。