Skip links

HTTPヘッダ・インジェクション

HTTPヘッダとは

HTTPヘッダとは、HTTPリクエストおよびHTTPレスポンスを構成する要素の1つです。HTTPヘッダには、クライアントとサーバが通信する際の詳細な説明や制御情報などが格納されています。

HTTPヘッダ・インジェクションとは

HTTPヘッダインジェクションとは、ユーザ⼊⼒値などのクライアントから送信される値を適切に処理することなく、HTTPレスポンスヘッダに含めてしまうことにより発⽣する脆弱性および攻撃⼿法です。

この脆弱性を使⽤して、攻撃者はHTTPレスポンスヘッダに任意のヘッダフィールドを追加したり、レスポンスボディに任意のコンテンツを追加できるため、さまざまな攻撃の⽷⼝となる危険性があります。

その結果、正規ユーザのアカウントの乗っ取りやなりすまし、サイト利⽤者に表⽰されるコンテンツの改ざん、外部サイトへの意図しないリダイレクトなどにつながります。

レスポンスヘッダが改ざんされる仕組み

HTTPヘッダとは、HTTPリクエストおよびHTTPレスポンスを構成する要素の1つです。HTTPヘッダには、クライアントとサーバが通信する際の詳細な説明や制御情報などが格納されています。

ここでは、例としてリダイレクト処理において、パラメータによってリダイレクト先のURLを受け取り、レスポンスのLocationヘッダに出⼒するような実装のあるアプリケーションを考えます。

レスポンスヘッダにユーザ⼊⼒値を含める処理を実装している場合、攻撃者はパラメータなどの⼊⼒値に改⾏⽂字を含めることで、任意のヘッダフィールドを追加しようとします。

本来ヘッダ値として出⼒する値は改⾏⽂字で分割され、結果としてサーバからのHTTPレスポンスには、改⾏⽂字以降が独⽴したヘッダとして配信されます。

レスポンスヘッダが改ざんされる仕組み

以下の図において、%0d%0aは改⾏⽂字(\r\n)をURLエンコードした値を⽰しています。

HTTPヘッダインジェクション【HTTP Header Injection】とは|図でわかる脆弱性の仕組み
https://www.ubsecure.jp/blog/http-header-injection”より引用

レスポンスヘッダが改ざんされる仕組み

またHTTPヘッダとボディは改⾏⽂字を含む空⽩⾏によって区切られます。

攻撃者は、⼊⼒値に連続した改⾏⽂字を含めることで、レスポンスボディに任意のコンテンツを追加できます。

以下は、パラメータで受け取った値を、レスポンスのSet-Cookieヘッダにそのまま反映する実装がある場合の例です。

レスポンスヘッダが改ざんされる仕組み

HTTPヘッダインジェクション【HTTP Header Injection】とは|図でわかる脆弱性の仕組み
https://www.ubsecure.jp/blog/http-header-injection”より引用

攻撃例1

1. Set-Cookieヘッダを追加し、正規ユーザが利⽤するCookieに任意の値を設定する。

2. レスポンスボディを任意のコンテンツに改ざんする。

攻撃例2

1. 攻撃者はHTTPヘッダインジェクションを⽤いて、Set-Cookieヘッダに任意のセッションIDを指定するように細⼯したURLを何らかの⽅法で正規ユーザにクリックさせる。

2. 正規ユーザは細⼯されたURLから脆弱なサイトにアクセスする。

3. 攻撃者は指定したセッションIDを⽤いて、正規ユーザとしてサイトにアクセスする。

対策

● ヘッダの出力を直接行わず、ウェブアプリケーションの実行環境や言語に用意されているヘッダ出力用APIを使用する。

● 改行コードを適切に処理するヘッダ出力用APIを利用できない場合は、改行を許可しないよう、開発者自身で適切な処理を実装する。