Overview
ファイルアップロード脆弱性(File Upload Vulnerability)とは、Webアプリケーションのファイルアップロード機能における入力検証の不備を悪用し、悪意あるファイルをサーバーにアップロードすることで、リモートコード実行(RCE)やWebシェルの設置を可能にする脆弱性です。
多くのWebアプリケーションはプロフィール画像、ドキュメント、メディアファイルのアップロード機能を提供していますが、適切な検証が行われていない場合、攻撃者はPHPやJSPなどのサーバーサイドスクリプトを画像ファイルに偽装してアップロードし、サーバー上で任意のコードを実行できます。
ファイルアップロード脆弱性は、成功するとサーバーの完全な制御権奪取につながる可能性があるため、Webアプリケーションにおいて最も危険な脆弱性の一つとされています。拡張子偽装、MIMEタイプ偽装、マジックバイト偽装など、検証機構をバイパスする多様な手法が知られています。
Details
攻撃手法
- Webシェルのアップロード:PHPやASP/JSPなどのサーバーサイドスクリプトをアップロードし、ブラウザからアクセスすることでサーバー上でコマンドを実行する。代表的なWebシェルにc99shell、b374k、China Chopperなどがある
- 拡張子バイパス:二重拡張子(shell.php.jpg)、大文字混合(shell.pHp)、特殊文字(shell.php%00.jpg)、代替拡張子(.phtml, .php5, .phar)などを用いてサーバーのフィルタリングを回避する
- MIMEタイプ偽装:HTTPリクエストのContent-Typeヘッダーをimage/jpegなどに偽装してアップロードし、サーバー側のMIMEタイプ検証をバイパスする
- パストラバーサル:ファイル名に../を含めることで、意図されたアップロードディレクトリの外にファイルを配置し、Webルートの実行可能なディレクトリにスクリプトを設置する
- ZIPボム(Zip Bomb):極端に圧縮された巨大なアーカイブファイルをアップロードし、展開時にサーバーのディスク容量やメモリを枯渇させるDoS攻撃
防御策
- ファイル検証の多層化:拡張子チェック(ホワイトリスト方式)、MIMEタイプ検証、マジックバイト検証の3重チェックを実施する。クライアントサイドの検証だけでなく、サーバーサイドでの検証が必須
- ファイルのリネーム:アップロードされたファイルはランダムなファイル名に変更し、元のファイル名をデータベースに保存する。ユーザーが指定したファイル名をそのまま使用しない
- 隔離保存:アップロードされたファイルはWebルートの外(または別のサーバー・ストレージサービス)に保存し、直接HTTPアクセスできないようにする
- CDN配信:ユーザーにファイルを提供する場合は、別ドメインのCDN経由で配信し、アップロードファイルが格納されたサーバーのCookieやセッションにアクセスできないようにする
マジックバイト検証
マジックバイト(ファイルシグネチャ)とは、ファイルの先頭に配置されるバイト列で、ファイルの種類を識別するために使用されます。例えば、JPEGファイルは「FF D8 FF」、PNGファイルは「89 50 4E 47」、PDFファイルは「25 50 44 46」で始まります。
サーバー側でマジックバイトを検証することで、拡張子やMIMEタイプが偽装されたファイルを検出できます。ただし、攻撃者はPHPスクリプトの先頭に正規のJPEGヘッダーを追加したポリグロットファイル(複数の形式として解釈可能なファイル)を作成してバイパスを試みる場合があるため、マジックバイト検証だけに依存してはなりません。
サーバー設定によるリスク軽減
アップロードディレクトリでのスクリプト実行を無効化することが重要です。Apacheでは「php_admin_flag engine off」や.htaccessによる制御、Nginxではlocation設定でPHP実行を禁止します。また、アップロードファイルのアンチウイルススキャンを実施し、既知のマルウェアパターンを検出することも推奨されます。ファイルサイズの上限設定やアップロードレート制限も、DoS攻撃の防止に有効です。
Security Measures
- 01ホワイトリスト方式での拡張子制限:許可するファイル拡張子をホワイトリストで管理し、許可リストに含まれない拡張子のファイルはすべて拒否してください。ブラックリスト方式は回避手法が多数存在するため推奨しません。二重拡張子や特殊文字を含むファイル名も適切に処理しましょう。
- 02多層的なファイル検証の実装:拡張子チェック、MIMEタイプ検証、マジックバイト検証の3つを組み合わせた多層的な検証を実装してください。いずれか1つの検証だけではバイパスされるリスクがあります。可能であれば、画像ファイルは再エンコード処理を行い、悪意あるコードを除去しましょう。
- 03アップロードファイルの隔離保存:アップロードされたファイルはWebルートの外に保存し、直接URLアクセスできないようにしてください。ファイルの提供はアプリケーション経由のダウンロードAPIを通じて行い、Content-Disposition: attachmentヘッダーを設定しましょう。
- 04アップロードディレクトリの実行権限の削除:Webサーバーの設定でアップロードディレクトリのスクリプト実行を完全に無効化してください。Apache、Nginx、IISそれぞれの設定でPHP、ASP、JSPなどの実行を明示的に禁止しましょう。
- 05ファイルサイズとレート制限の設定:アップロードファイルの最大サイズを適切に制限し、ZIPボムやDoS攻撃を防止してください。ユーザーごとのアップロード頻度制限やストレージクォータも設定し、リソース枯渇を防ぎましょう。
- 06アンチウイルススキャンの実施:アップロードされた全ファイルに対してアンチウイルススキャンを実施してください。ClamAVなどのオープンソースツールやクラウドベースのスキャンサービスを利用し、既知のマルウェアやWebシェルの検出を自動化しましょう。
Incidents
📋 Webシェルによる大規模侵害事例(China Chopper)
中国製のWebシェル「China Chopper」は、わずか4KB程度の極めて小さなファイルでありながら、サーバーの完全な遠隔操作を可能にするマルウェアとして広く使用されてきました。ファイルアップロード脆弱性を通じて世界中の何千ものWebサーバーに設置され、APT攻撃やサイバースパイ活動に利用されました。
China Chopperはファイル管理、コマンド実行、データベース操作、ネットワークスキャンなどの多機能を持ち、検出が非常に困難です。複数のAPTグループがこのWebシェルを使用し、政府機関、軍事関連企業、大学などの機密データを大量に窃取しました。この事例はファイルアップロードのセキュリティ不備が長期的な侵害の入り口になることを示しています。
📋 ImageMagick脆弱性(ImageTragick)事件(2016年)
2016年5月、画像処理ライブラリImageMagickに複数の重大な脆弱性(CVE-2016-3714、通称ImageTragick)が発見されました。特に危険だったのは、SVGやMVGファイル形式を通じてサーバー上で任意のOSコマンドを実行できるリモートコード実行(RCE)脆弱性です。
ImageMagickは多くのWebフレームワークやCMSで画像リサイズ処理に使用されており、影響を受けたサービスは膨大な数にのぼりました。攻撃者は悪意あるSVGファイルをプロフィール画像などとしてアップロードするだけで、サーバー上で任意のコマンドを実行できました。この事件はファイルのアップロード後の処理(画像変換・リサイズ)にも脆弱性が存在しうることを広く認知させる契機となりました。
📋 PHPファイルアップロード攻撃(WordPress・CMSの事例)
WordPressをはじめとするPHPベースのCMSでは、ファイルアップロード脆弱性が繰り返し発見されてきました。プラグインやテーマのアップロード機能に不備があり、攻撃者がPHPのWebシェルをアップロードしてサーバーを乗っ取る事例が多数報告されています。
特に危険なパターンとして、画像ファイルのEXIFメタデータにPHPコードを埋め込む手法や、.htaccessファイルをアップロードしてPHPの実行設定を変更する手法が知られています。WordPress公式リポジトリのプラグインからも脆弱なアップロード処理が複数発見されており、CMSのプラグイン・テーマの選定とアップデートの重要性が改めて認識されています。適切なファイル検証とサーバー設定の組み合わせが防御の鍵です。