HTTP to HTTPS Insecure Transition in Form Post

概要

  • 脆弱性の名前: HTTP to HTTPS Insecure Transition in Form Post (HTTPからHTTPSへの安全でないフォーム送信)
  • 問題の要点: フォームがHTTPで提供されたページからHTTPSで提供されたページに送信される際に、中間者攻撃(Man-in-the-Middle attack)によってデータが傍受される可能性がある状態。
  • よくある発生シーン: 古いWebサイトのHTTPS移行時、一部ページのみHTTPS化されている場合、開発者の設定ミスなど。

背景

Webサイトのセキュリティを向上させるために、HTTPS(SSL/TLS)が広く利用されています。しかし、HTTPで提供されたページからHTTPSで提供されたページにフォームを送信する場合、送信されるデータは暗号化される前にネットワーク上をHTTPで通過するため、中間者攻撃のリスクに晒されます。
クラウド環境では、ロードバランサーやリバースプロキシの設定ミスにより、HTTPとHTTPSが混在する状態が発生しやすいため、注意が必要です。

セキュリティ上のリスク

  • 中間者攻撃による、フォームデータの傍受。
  • ユーザー名、パスワード、クレジットカード情報などの機密情報の漏洩。
  • セッションハイジャック攻撃による、ユーザーアカウントの乗っ取り。
  • Webサイトの改ざんや不正なコンテンツの表示。

対処方法の具体例

Apache2

誤った設定例

HTTPからHTTPSへのリダイレクト設定がない、または不完全な例:

# 誤った例: リダイレクト設定なし

正しい設定例

.htaccessファイルでHTTPからHTTPSへのリダイレクトを設定する例:

# 正しい例: HTTPからHTTPSへのリダイレクト
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Nginx

誤った設定例

HTTPからHTTPSへのリダイレクト設定がない、または不完全な例:

# 誤った例: リダイレクト設定なし

正しい設定例

設定ファイルでHTTPからHTTPSへのリダイレクトを設定する例:

# 正しい例: HTTPからHTTPSへのリダイレクト
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

PHP

誤った設定例

HTTPで提供されたページからHTTPSで提供されたページにフォームを送信する例:

<form action="https://example.com/process.php" method="post">
    <!-- フォームの内容 -->
</form>

正しい設定例

常にHTTPSでページを提供し、HTTPでのアクセスをHTTPSにリダイレクトする。

JavaScript

JavaScriptを使用してフォームを送信する場合も、同様にHTTPSでページを提供し、HTTPでのアクセスをHTTPSにリダイレクトすることが重要です。

AWS

正しい設定例

ロードバランサー(ALB/ELB)でHTTPからHTTPSへのリダイレクトを設定する例:

  • ロードバランサーのリスナーで、HTTP(ポート80)のリクエストをHTTPS(ポート443)にリダイレクトするルールを設定します。
  • ACM(AWS Certificate Manager)を使用して、HTTPSに必要なSSL/TLS証明書をプロビジョニングします。

検出方法

OWASP ZAPでの出力例

  • Alert 名: HTTP to HTTPS Insecure Transition in Form Post
  • リスク: Low
  • URL: フォームが送信されるURL
  • パラメータ: なし
  • 詳細: HTTPで提供されたページからHTTPSで提供されたページにフォームが送信されているという情報

手動再現例

  1. HTTPで提供されたページにアクセスし、フォームにデータを入力して送信します。
  2. Webブラウザの開発者ツールを開き、Networkタブを選択します。
  3. フォームデータがHTTPSで送信されていることを確認します。
  4. HTTPで送信されている場合、脆弱性が存在します。

まとめ

  • CVSS 基本値: 5.8 (Medium)
  • 運用チームや開発者が意識すべきポイント:
    • Webサイト全体をHTTPSで提供する。
    • HTTPでのアクセスをHTTPSにリダイレクトする。
    • フォームデータは常にHTTPSで送信する。
    • ロードバランサーやリバースプロキシの設定を確認し、HTTPとHTTPSが混在しないようにする。
  • 再発防止:
    • 開発プロセス全体でセキュリティを考慮する(Security by Design)。
    • コードレビューを実施し、HTTPでのフォーム送信がないか確認する。
    • 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
    • HTTPSを強制するポリシーを適用する。

補足資料・参考URL

以上の対策と検出方法を活用して、HTTP to HTTPS Insecure Transition in Form Postのリスクを低減してください。