学習忘備録

学習のアウトプットや感じた事を発信していきます

ファイルアップロードにまつわる問題

書籍を読んで

www.amazon.co.jp

こちらの書籍を読んでWebアプリケーションを作る際に重要な要点を自分用としてアウトプットします。

ファイルアップロードにまつわる問題

Webアプリケーションには、画像やPDFなどのファイルをアップロードして公開する機能(アップローダ)を備えるものがある。

利用者がファイルをアップロードする機能や、利用者がアップロードしたファイルを別の利用者がダウンロード出来る機能に発生しがちな脆弱性がある。

アップロードファイルによるサーバ側スクリプト実行

外部から送り込んだスクリプトが実行されると、以下のような影響がありえる

  • Webサーバ内のファイルの閲覧・改ざん・削除
  • 外部へのメールの送信
  • 別のサーバへの攻撃(踏み台と呼ぶ)
  • サーバ上での暗号通貨の採掘(マイニング)
脆弱性が生まれる原因

アップロードファイルをスクリプトとして実行可能な脆弱性が生まれる条件は、以下の両方に該当すること

  • アップロードしたファイルが公開ディレクトリに保存される
  • アップロード後のファイル名として、「.php / .asp / .aspx / .jsp 」などサーバスクリプトを示す拡張子が指定できる
対策

脆弱性が生まれる原因の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を指定する(必須)
      • 元々IEのContent-Typeの解釈が仕様として曖昧なため、XSSが混入しやすい状況だった
        • この事からマイクロソフト社はX-Content-Type-Options: nosniffというレスポンスヘッダを実装した
      • 現在はIE以外のブラウザにも実装されており、セキュリティ強化に広く寄与するので、すべてのHTTPレスポンスに対して指定することが強く推奨される
      • そのためには、ApacheやnginxなどのWebサーバ側の設定が必要 
    • 必要に応じてContent-Dispositionヘッダを設定する
    • PDFを扱う場合は、「PDFのFormCalcによるコンテンツハイジャック」の対策を実施する(別途ページ参照)
その他の対策

上記までのXSS対策は、脆弱性を防止するための必要最低限のチェックのみのため、Webアプリケーションの仕様策定時に、以下のようなチェックを行うかどうか検討すると良い

  • ファイルサイズ以外の縦横サイズ、色数などのチェック
  • 画像として読み込めるかどうかのチェック
  • ウィルス・スキャン
  • コンテンツの内容のチェック
    • アダルトコンテンツ
    • 著作権を侵害するコンテンツ
    • 法令・公序良俗に反するコンテンツ
    • その他