ファイルアップロードにまつわる問題
書籍を読んで
こちらの書籍を読んでWebアプリケーションを作る際に重要な要点を自分用としてアウトプットします。
ファイルアップロードにまつわる問題
Webアプリケーションには、画像やPDFなどのファイルをアップロードして公開する機能(アップローダ)を備えるものがある。
利用者がファイルをアップロードする機能や、利用者がアップロードしたファイルを別の利用者がダウンロード出来る機能に発生しがちな脆弱性がある。
アップロードファイルによるサーバ側スクリプト実行
外部から送り込んだスクリプトが実行されると、以下のような影響がありえる
- Webサーバ内のファイルの閲覧・改ざん・削除
- 外部へのメールの送信
- 別のサーバへの攻撃(踏み台と呼ぶ)
- サーバ上での暗号通貨の採掘(マイニング)
脆弱性が生まれる原因
アップロードファイルをスクリプトとして実行可能な脆弱性が生まれる条件は、以下の両方に該当すること
対策
脆弱性が生まれる原因の2点のうち、どちらか一方の条件をつぶせば対策になるが、拡張子の制限だけでは対策抜けが生じる可能性がある
このため、ファイルを公開ディレクトリに保存させない方法が良い
アップロードされたファイルを公開ディレクトリに保存しない場合、このファイルはスクリプト経由でダウンロードする
アップロードファイルによるサーバ側スクリプト実行を防止するには、以下の2点の両方、あるいはいずれかを実施する
ファイルダウンロードによるXSS
アップロードしたファイルを利用者がダウンロードする際に、ブラウザがファイルタイプを誤認する場合がある。
たとえば、アプリケーションがPDFファイルを想定しているにもかかわらず、PDFデータ中にHTMLタグが含まれていると、条件によってはブラウザがHTMLファイルとして認識してしまい、PDFファイルに埋め込まれたJavascriptを実行する場合がある
これを、ファイルダウンロードによるクロサイト・スクリプティング(XSS)と呼ぶ。
脆弱性が生まれる原因
Content-Typeの間違った指定が原因
Content-Typeの指定が間違っていると、ブラウザがコンテンツをHTMLと解釈し、コンテンツ中のJavaScriptが実行されてしまう可能性がある
対策
ファイルのアップロード時とダウンロード時に以下の対策を実施する
- ファイルのアップロード時
- 拡張子が許可されたものかをチェックする
- ファイルのダウンロード時
- Content-Typeを正しく設定する(必須)
- PDF形式のContent-Typeを「application/pdf」と正しく設定すれば、脆弱性はなくなる
- Content-Typeを正しく指定することは、全てのブラウザに必要な処理
- レスポンスヘッダX-Content-Type-Options: nosniffを指定する(必須)
- 必要に応じてContent-Dispositionヘッダを設定する
- PDFを扱う場合は、「PDFのFormCalcによるコンテンツハイジャック」の対策を実施する(別途ページ参照)
- Content-Typeを正しく設定する(必須)
その他の対策
上記までのXSS対策は、脆弱性を防止するための必要最低限のチェックのみのため、Webアプリケーションの仕様策定時に、以下のようなチェックを行うかどうか検討すると良い