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で提供されたページにフォームが送信されているという情報
手動再現例
- HTTPで提供されたページにアクセスし、フォームにデータを入力して送信します。
- Webブラウザの開発者ツールを開き、Networkタブを選択します。
- フォームデータがHTTPSで送信されていることを確認します。
- 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のリスクを低減してください。