Content-Type Header Missing

概要

  • 脆弱性の名前: Content-Type Header Missing (Content-Typeヘッダー未設定)
  • 問題の要点: HTTPレスポンスヘッダーにContent-Typeヘッダーが設定されていないため、ブラウザがコンテンツの種類を正しく判断できず、セキュリティリスクや表示の不具合が発生する状態。
  • よくある発生シーン: Webサーバーの設定ミス、アプリケーションが動的にコンテンツを生成する際にヘッダー設定を忘れる、クラウド環境での設定不備などが原因で発生しやすい。

背景

Content-Typeヘッダーは、サーバーがクライアント(通常はWebブラウザ)に送信するデータの種類を伝えるための重要なHTTPヘッダーです。このヘッダーがない場合、ブラウザはコンテンツの内容を推測しようとします(MIMEスニッフィング)。しかし、この推測が誤っている場合、以下のような問題が発生する可能性があります。

  • セキュリティリスク: 悪意のあるファイルが別の種類として解釈され、実行される可能性があります(例:画像ファイルとしてアップロードされたスクリプトが実行される)。
  • 表示の不具合: ブラウザがコンテンツを正しくレンダリングできず、文字化けやレイアウト崩れが発生する可能性があります。

セキュリティ上のリスク

  • MIMEスニッフィング攻撃: ブラウザがコンテンツタイプを誤って解釈し、悪意のあるコードが実行される可能性があります。
  • XSS(クロスサイトスクリプティング)攻撃: 特に、HTMLファイルがtext/plainとして扱われると、スクリプトが実行されず、XSS攻撃が成功する可能性があります。
  • 文字化け: ブラウザが誤った文字エンコーディングを使用し、コンテンツが正しく表示されない可能性があります。

対処方法の具体例

Apache2

.htaccessファイルでの設定

<FilesMatch "\.(html|htm)$">
  Header set Content-Type "text/html; charset=UTF-8"
</FilesMatch>

<FilesMatch "\.css$">
  Header set Content-Type "text/css; charset=UTF-8"
</FilesMatch>

<FilesMatch "\.js$">
  Header set Content-Type "application/javascript"
</FilesMatch>

<FilesMatch "\.(jpg|jpeg)$">
  Header set Content-Type "image/jpeg"
</FilesMatch>

<FilesMatch "\.png$">
  Header set Content-Type "image/png"
</FilesMatch>

httpd.confでの設定

<Directory "/var/www/html">
  <FilesMatch "\.(html|htm)$">
    Header set Content-Type "text/html; charset=UTF-8"
  </FilesMatch>

  <FilesMatch "\.css$">
    Header set Content-Type "text/css; charset=UTF-8"
  </FilesMatch>

  <FilesMatch "\.js$">
    Header set Content-Type "application/javascript"
  </FilesMatch>

  <FilesMatch "\.(jpg|jpeg)$">
    Header set Content-Type "image/jpeg"
  </FilesMatch>

  <FilesMatch "\.png$">
    Header set Content-Type "image/png"
  </FilesMatch>
</Directory>

Nginx

nginx.confでの設定

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  server {
    location ~ \.html?$ {
      add_header Content-Type "text/html; charset=UTF-8";
    }

    location ~ \.css$ {
      add_header Content-Type "text/css; charset=UTF-8";
    }

    location ~ \.js$ {
      add_header Content-Type "application/javascript";
    }

    location ~ \.(jpg|jpeg)$ {
      add_header Content-Type "image/jpeg";
    }

    location ~ \.png$ {
      add_header Content-Type "image/png";
    }
  }
}

WordPress

functions.phpでの設定

function set_content_type_header() {
  header('Content-Type: text/html; charset=UTF-8');
}
add_action('send_headers', 'set_content_type_header');

PHP

PHPコードでの設定

<?php
header('Content-Type: text/html; charset=UTF-8');
?>

間違った設定例と正しい設定例

間違った設定例

# .htaccess
<FilesMatch "\.php$">
  # Content-Typeヘッダーが設定されていない
</FilesMatch>

正しい設定例

# .htaccess
<FilesMatch "\.php$">
  Header set Content-Type "text/html; charset=UTF-8"
</FilesMatch>

検出方法

OWASP ZAP での出力例

  • Alert 名: Content-Type Header Missing
  • リスク: Low
  • URL: Content-Typeヘッダーが設定されていないURL
  • パラメータ: なし
  • 詳細: HTTPレスポンスヘッダーにContent-Typeヘッダーが含まれていないという情報

手動再現例

  1. Webブラウザの開発者ツールを開き、Networkタブを選択します。
  2. Webサイトにアクセスし、HTTPレスポンスヘッダーにContent-Typeヘッダーが含まれているか確認します。
  3. curlコマンドを使用して、HTTPレスポンスヘッダーを確認します。
curl -I https://example.com

まとめ

  • CVSS 基本値: 4.3 (Medium)
  • 運用チームや開発者が意識すべきポイント:
    • すべてのHTTPレスポンスに対して適切なContent-Typeヘッダーを設定する。
    • 特にHTML、CSS、JavaScript、画像などの一般的なファイルタイプに対して、正しいContent-Typeを設定する。
    • 文字エンコーディング(通常はUTF-8)を明示的に指定する。
    • Webサーバーの設定ファイル(.htaccessnginx.confなど)を定期的に確認し、Content-Typeヘッダーの設定が正しいことを確認する。
  • 再発防止:
    • 開発プロセスにおいて、Content-Typeヘッダーの設定を必須とする。
    • コードレビューを実施し、Content-Typeヘッダーの設定が正しいことを確認する。
    • 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
    • Webサーバーのデフォルト設定を確認し、適切なContent-Typeヘッダーが設定されていることを確認する。

補足資料・参考 URL

以上の対策と検出方法を活用して、Content-Type Header Missing のリスクを低減してください。