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

HTTPヘッダインジェクションについて

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

HTTPヘッダインジェクションとは、HTTPを使って通信するシステムにおいて、動的にHTTPヘッダを生成する機能の不備を突いてヘッダ行を挿入することで不正な動作を行なわせる攻撃手法のことです。

SQLインジェクションなどと同様に、入力値を出力に用いている箇所において、文法上特殊な意味を持つ文字をエスケープせずに展開することで発生します。


HTTPヘッダインジェクションの仕組み

HTTPヘッダにおける特殊文字とは、改行コードです。

各HTTPヘッダ行は改行で終了し、それ以降は新たなヘッダ行として処理されます。

つまり、HTTPヘッダの値として改行コードを挿入することができれば、本来の通信内容には含まれないヘッダを挿入することができる。


HTTPヘッダインジェクションの実行例

WEBサーバ上のCGIが以下の通りである場合を考えます。


#!perl
use CGI;
my $cgi = new CGI;
my $url = $cgi->param('url');
print "Location: $url\n\n"; 

このCGIに対して以下のパラメータを指定します。


url=http://www.testhttp.co.jp/%0D%0ASet-Cookie:SID=12345

この結果、CGIで発行されるHTTPレスポンス・ヘッダーは以下のようになる。


Location: http://www.testhttp.co.jp/
Set-Cookie:SID=12345

「Set-Cookie:SID=12345」文から、意図しないCookieが発行されてしまいます。


HTTPヘッダインジェクションの対策

Webアプリケーション開発者は、HTTPヘッダを単なる文字列として直接出力することを避け、ヘッダ出力のために実行基盤が提供するAPIを使う。


入力値がコピーされる可能性が高いHTTPヘッダとしては、リダイレクト処理で使われるLocation、セッション管理でよく使われるSet-Cookie(およびSet-Cookie2)が挙げられる。


関連ページ