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

 HTTPヘッダーインジェクション攻撃は、Cookie出力やリダイレクト処理など、HTTPレスポンスヘッダーを出力している箇所に対する攻撃である。外部から、これらレスポンスヘッダーの値に改行文字を含ませることにより、本来のヘッダーとは別のヘッダーを送信したり、本文(HTTPメッセージボディー)を改変したりできる。これらを許すことはヘッダー出力処理のバグである。

 以下、簡単なCGIプログラムを題材として、HTTPヘッダーインジェクションによる「なりすまし投稿」の原理を説明する。

なりすまし投稿の仕組み

図1●HTTPヘッダーインジェクション攻撃に脆弱なCGIプログラム「setcookie.cgi」

 HTTPヘッダーインジェクション攻撃に脆弱なCGIプログラム「setcookie.cgi」を図1に示す。このCGIプログラムはクエリー文字列nameをそのままCookieとしてセットしている。呼び出し例は以下の通り。

http://example.jp/setcookie.cgi?name=tokumaru

 この場合のHTTPレスポンスは図2となり、「name=tokumaru」というCookieがセットされる。

図2●setcookie.cgiが出すHTTPレスポンスの例

 その攻撃例を図3(1)に示す。name=tokumaruの後の「%0D%0A」は改行文字をパーセントエンコードしたものである。その場合のHTTPレスポンスは図3(2)のようになる。黒枠で示した部分が外部からURLのパラメーターで指定した部分だ。空の行が挿入されていて、<script>以下はHTTPのボディーと認識され、JavaScriptが挿入された。

図3●setcookie.cgiへの攻撃例

 後は、XSSの場合と同じ手順により、なりすまし投稿が可能になる。

攻撃への対策

 HTTPヘッダーインジェクションの対策は、Cookie出力、リダイレクトに専用のAPIやライブラリ関数を用いることに加えて、以下を行う。

  • Cookieの値はパーセントエンコードする(言語によっては自動的にエンコードされる)
  • レスポンスヘッダーを出力する際に、改行文字の有無をチェックして、もしあればエラーにする