# 安全なウェブサイトの作り方 ###### tags: `危機管理コンテスト` `2023/04/19` ## 1.4 セッション管理の不備 ## 前提知識 **セッション**とは、クライアントとサーバ間で行われる通信の開始から終了までを指す言葉です。 **セッション管理**とは、ユーザーが同じウェブサイトやアプリケーションを利用している間維持される情報のやり取りを管理することを指す言葉です。この管理を行うためにセッションIDを用います。 **セッションID**とは、セッション管理においてユーザーを識別するために使用される一時的なIDのことです。セッションIDはユーザーがサービスにログインした時にサーバから発行されます。同じサービスを使用している間、セッションIDはブラウザに保存され、ログアウトされるまでは継続します。 ## 予想される攻撃 ### セッション・ハイジャック **セッション・ハイジャック**とは、攻撃者がユーザーのセッションを乗っ取ることを指す言葉です。以下の二つの方法が例として挙げられます。 #### セッションIDの推測 **セッションIDの推測**とは、攻撃者が発行されたセッションIDを元に、生成規則を特定して有効なセッションIDを推測することを指す言葉です。 #### セッションIDの盗用 **セッションIDの盗用**とは、攻撃者が悪意のある罠を仕掛けたり、ネットワークを盗聴したりして利用者のセッションIDを盗むことを指す言葉です。 ### セッションIDの固定化(Session Fixation) **セッションIDの固定化**とは、攻撃者があらかじめ用意したセッションIDを何らかの方法でユーザーに送り込み、ユーザがサービスにログインすることを指す言葉です。攻撃者は送り込んだセッションIDを固定して使用するため、長期間にわたってユーザーのなりすましをする事が可能なため、セッションハイジャックより深刻な脅威になることがあります。 下記の方法でセッションIDを送り込むことができます。 1. ウェブアプリケーションがセッションID をPOSTメソッドのhiddenパラメータに格納して受け渡しする実装となっている場合 2. ウェブアプリケーションがセッション ID を Cookieに格納して受け渡しする実装となっている場合で利用者のウェブブラウザが、ドメインをまたがったCookieのセットができてしまう「Cookie Monster」と呼ばれる問題を抱えている場合 3. ウェブアプリケーションがセッション ID を Cookie に格納して受け渡しする実装となっている場合で、ウェブアプリケーションサーバ製品に、「Session Adoption」の脆弱性がある場合 4. ウェブアプリケーションにクロスサイト・スクリプティング等他の脆弱性がある場合 ## 発生しうる脅威 攻撃が成功した場合、攻撃者がユーザーに成りすまして以下のことを引き起こす可能性があります。 1. ログイン後の利用者のみが利用可能なサービスの悪用 * 不正送金、ユーザーの意図しない商品購入や退会処理など 2. ログイン後の利用者のみが編集可能な情報の改ざん、新規登録 * 設定の不正変更(管理者画面、パスワードなど)、掲示板への不適切な書き込みなど 3. ログイン後の利用者のみが閲覧可能な情報の閲覧 * 個人情報を不正閲覧、ウェブメールを不正閲覧、コミュニティ会員専用の掲示板を不正閲覧等 ## 注意が必要なウェブサイトの特徴 ログイン機能をもつウェブサイト全般、特にログイン後に決済処理などの重要な処理を行うサイトは被害が大きくなりやすいため、特に注意が必要です。以下が 1. 金銭処理が発生するサイト * ネットバンキング、ネット証券、ショッピング、オークション 等 1. 非公開情報を扱うサイト * 転職サイト、コミュニティサイト、ウェブメール 等 1. その他、ログイン機能を持つサイト * 管理者画面、会員専用サイト、日記サイト 等 ## 根本解決 ### セッションIDを予測困難なものにする * 生成アルゴリズムに暗号論的擬似乱数生成器を用いる * ウェブアプリケーション製品を利用する ### セッションIDをURLパラメータに格納しない セッションIDをURLパラメータに格納していると、利用者のブラウザが、Referer送信機能によって、セッションIDの含まれたURLをリンク先のサイトへ送信してしまいます。悪意ある人にその URLを入手されると、セッション・ハイジャックされてしまいます。 * セッションIDは、Cookieに格納するか、POSTメソッドのhiddenパラメータに格納して受け渡しする * ユーザーがセッションIDをURLパラメータに格納する実装に自動的に切り替える機能を無効にする ### HTTPS通信で利用するCookieには secure属性を加える ウェブサイトが発行するCookieには、secure 属性という設定項目があり、これが設定された CookieはHTTPS通信のみで利用されます。Cookieにsecure属性がない場合、HTTPS通信で発行したCookieは、経路が暗号化されていない HTTP通信でも利用されるため、このHTTP通信の盗聴によりCookie情報を不正に取得されてしまう可能性があります。 * HTTPS通信で利用するCookieには secure属性を必ず加える * HTTP通信でCookieを利用する場合は、HTTPS で発行するCookieとは別のものを発行 ### ログイン成功後に、新しくセッションを開始する * 新しいセッションを開始する際には、既存のセッションIDを無効化することにより、利用者が新しくログインしたセッションに対し、攻撃者は事前に手に入れたセッションIDではアクセスできなくなります。 ### ログイン成功後に、既存のセッションIDとは別に秘密情報を発行し、ページの遷移ごとにその値を確認する * セッションIDとは別に、ログイン成功時に秘密情報を作成してCookieにセットし、この秘密情報とCookieの値が一致することを全てのページで確認する ## 保険的解決 ### セッションIDを固定値にしない * セッションIDを利用者のログインごとに新しく発行する ### セッションIDをCookieにセットする場合、有効期限の設定に注意する * Cookieの有効期限を短い日時に設定し、必要以上の期間、Cookieがブラウザに保存されないようにする * Cookieをブラウザ終了後に破棄させる ## 1.7 HTTPヘッダ・インジェクション ## 前提知識 **HTTPヘッダ**はHTTPリクエストやレスポンスに含まれるメタデータで、サーバやアプリケーションが通信を処理するために使用する情報を含んでいます。 **HTTPリクエスト**とは、クライアントからサーバへ要求を伝えるメッセージを指す言葉です。 **HTTPレスポンス**とはクライアントから送信されたデータをサーバが処理してクライアントに返信する応答を指す言葉です。 **メタデータ**とは、コンテンツ自身を説明するためのデータを指す言葉です。 **HTTPヘッダ・インジェクション**とは、Webアプリケーションに対する攻撃の一種です。悪意のある攻撃者がHTTPリクエストのヘッダーに不正なデータを注入することによって、攻撃を実行する手法です。 注入された不正なデータを利用して、クロスサイトスクリプティング(XSS)攻撃、クロスサイトリクエストフォージェリ(CSRF)攻撃、SQLインジェクション攻撃、HTTPヘッダー偽装攻撃などを実行することができます。 ## 発生しうる脅威 ## 注意が必要なウェブサイトの特徴 ## 根本解決 ### ウェブアプリケーションの実行環境や言語に用意されているヘッダ出力用APIを使用する ## 保険的解決 ## 1.8 メールヘッダ・インジェクション ## 前提知識 **メールヘッダ・インジェクション**とは悪意のあるユーザーが電子メールのヘッダに意図しない情報を挿入する攻撃手法のことです。フィッシング詐欺やスパムメールの送信などだけでなく、メールサーバーの脆弱性を利用して、悪意のあるコードを挿入することによって、より危険な攻撃につながることがあります。 ## 発生しうる脅威 ## 注意が必要なウェブサイトの特徴 ## 根本解決 ## 保険的解決