≪ Today I learned.
RSS購読
    公開日
    タグ
    Security
    著者
    ダーシノ

    Header Injectionの攻撃手法と対策

    Header Injectionとは、アプリケーションがデータを適切に処理せず、ユーザーの入力をヘッダに出力させることで、レスポンスの改ざんやリダイレクト、セッションハイジャックなどを行う攻撃手法のこと。

    HTTPレスポンスとヘッダ

    HTTPレスポンスは、Key:Value形式のレスポンスヘッダとボディから構成されている。

    # HEAD
    HTTP/1.1 200 OK
    Content-Type: text/html; charset=UTF-8
    ...
    
    # BODY
    <html>
    <body>
        <h1>Hello, World!</h1>
    </body>
    </html>

    攻撃手法

    Set-Cookieヘッダの改ざん

    Set-Cookieヘッダを悪用したSession Fixation攻撃の例。

    1. 攻撃者が自身のセッションIDを取得する
    2. 取得したセッションIDを、攻撃対象ユーザーのCookieに設定する
    3. 攻撃対象ユーザーが攻撃者のセッションIDを用いて操作をする(商品の購入、契約など)
    4. 攻撃者は同じセッションIDを使い、対象者の情報を盗む

    レスポンスボディの改ざん

    ヘッダとボディは空行で分割されているので、空行と一緒に悪意のあるコードが挿入できてしまう。

    HTTP/1.1 200 OK
    Content-Type: text/html; charset=UTF-8
    ...
    Set-Cookie: session_id=1234567890;
    
    # 悪意のあるレスポンスボディ
    <script>悪意のあるレスポンスボディ</script>
    
    # 本来のボディ
    <html>
    <body>
        <h1>Hello, World!</h1>
    </body>
    </html>

    セキュリティ対策の緩和

    Access-Control-Allow-Originヘッダを改ざんすることで、Same-Origin Policyなどの制約を無効化する。

    対策

    入力データをヘッダに出力しない

    入力データをヘッダに出力するのは避ける。どうしても出力したい場合は、適切なバリデーションやエスケープを行う。

    適切にヘッダを処理する関数を使う

    入力データをヘッダに出力したい場合は、各言語やライブラリ、フレームワークがもつ適切なヘッダ処理用の関数を使う。