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
ヘッダーが含まれていないという情報
手動再現例
- Webブラウザの開発者ツールを開き、Networkタブを選択します。
- Webサイトにアクセスし、HTTPレスポンスヘッダーに
Content-Type
ヘッダーが含まれているか確認します。 curl
コマンドを使用して、HTTPレスポンスヘッダーを確認します。
curl -I https://example.com
まとめ
- CVSS 基本値: 4.3 (Medium)
- 運用チームや開発者が意識すべきポイント:
- すべてのHTTPレスポンスに対して適切な
Content-Type
ヘッダーを設定する。 - 特にHTML、CSS、JavaScript、画像などの一般的なファイルタイプに対して、正しい
Content-Type
を設定する。 - 文字エンコーディング(通常はUTF-8)を明示的に指定する。
- Webサーバーの設定ファイル(
.htaccess
、nginx.conf
など)を定期的に確認し、Content-Type
ヘッダーの設定が正しいことを確認する。
- すべてのHTTPレスポンスに対して適切な
- 再発防止:
- 開発プロセスにおいて、
Content-Type
ヘッダーの設定を必須とする。 - コードレビューを実施し、
Content-Type
ヘッダーの設定が正しいことを確認する。 - 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
- Webサーバーのデフォルト設定を確認し、適切な
Content-Type
ヘッダーが設定されていることを確認する。
- 開発プロセスにおいて、
補足資料・参考 URL
以上の対策と検出方法を活用して、Content-Type Header Missing のリスクを低減してください。