リクエストヘッダーでセッションIDが渡された場合、XSSが存在する状態でセッション固定攻撃を実行する方法はありますか?
私が見る限り、理論的には3つの方法があります。
利用可能なオプションの概要が正しい場合(間違いがあった場合は修正してください)、すべてのオプションのうち、実際に見えるのはストレージを攻撃しているオプションのみです。 この記事 では、
ご覧のとおり、セッショントークンはカスタムHTTPヘッダーX-AUTH-TOKENで送信されます。カスタムHTTPヘッダーでセッショントークンを送信して、クロスサイトリクエストフォージェリ(CSRF)攻撃からアプリケーションを保護します。 残念ながら、リクエストに含まれるためには、トークンを格納するグローバルCookieがJavaScriptから利用可能でなければならないため、アプリケーションがトークンの盗難に対して非常に脆弱になります。
ローカルストレージ攻撃に関しては、私は一般的に理解していますが、要求と応答をインターセプトしてオンザフライで変更することについてはどうですか?私が理解している限り、要求と応答をインターセプトするには、悪意のあるブラウザ拡張機能がクライアントにインストールされている必要があります。 HTMLからカスタムヘッダーを設定することはできません。唯一のオプションはJSです(JSはXHRで設定できることを知っていますが、それはセッション固定のオプションではない別のリクエストになります)。しかし、どれほど正確に、そしてそれが可能かどうかは、まだはっきりしていません。それを行う方法はありますか?誰かがこれについて何かアドバイスをすることはできますか?
明確にするために、あなたの質問は、暗黙的にhttpOnly CookieにセッションIDを保存するサイトを除外することです。その理由は、そのようなCookieはJavaScriptに完全にアクセスできないため、セッションIDがhttpOnly Cookieに保存されている場合、カスタムヘッダーでセッションIDを送信することができないためです。あなたはすでにこれを知っていますが、私はこの要件を大声で述べたいと思います。
文字通り、他のすべてのセッション管理のケースでは、XSS攻撃が発生した場合、セッションの固定が可能です。つまり、セッションIDがカスタムヘッダー内にある場合は、それをアタッチできるように、JavaScriptにアクセスできる必要があります。 JavaScriptにアクセスできる場合、攻撃者のJavaScriptにアクセスできます。 JavaScriptがアクセスできない唯一のデータソースはhttpOnly Cookieであり、ここでは使用されていません。
セッションIDはローカルストレージに保存されますか?攻撃者のJavaScriptは、ローカルストレージに保存されている値を置き換えることができます。セッションIDは非httpOnly Cookieに保存されますか?攻撃者はそこでも置き換えることができます。 httpOnly Cookie以外に、攻撃者のJavaScriptではなくJavaScriptにアクセスできるデータソースはありません。その結果、セッションの固定は、JavaScriptをリバースエンジニアリングしてトークンが格納されている場所を特定するだけの問題です。リクエストをインターセプトしたり、Webワーカーをインストールしたりする必要はありません(ただし、可能であれば Webワーカーなしでリクエストをインターセプトする )。悪意のある拡張機能は、転送中のリクエストを確実に変更する可能性がありますが、これも必要ありません。XSS攻撃だけで十分です。
繰り返しますが、ここで重要なポイントを強調しようとします。要求をインターセプトしようとするのは面倒です。それはかなりの痛みかもしれません。あなたがする必要があるのは、セッションIDがクライアント側にどこにどのように保存されているかを理解し、そこに選択したセッションIDを注入することです。 JavaScriptにアクセスできるため、攻撃者のJavaScriptにアクセスできます。