My Photo

« 2014冬アニメ視聴予定 | Main | psqlでパスワード入力の省略 »

December 01, 2013

HTTPヘッダ・リダイレクション

発生箇所 リダイレクトやクッキー生成など、外部から指定したパラメータに基づいてHTTPレスポンスヘッダを出力している箇所
影響を受けるページ 直接的には脆弱性のあるページが影響を受けるが、任意のJavaScript実行により成りすましをされ、最終的にはアプリケーションのすべてのページが影響を受ける。
影響の種類
  • 成りすまし
  • 偽ページの表示
  • キャッシュ汚染
利用者の関与の度合い 必要(罠ページの閲覧、メール添付のURLの閲覧など)

概要

HTTPヘッダ・インジェクション脆弱性はリダイレクトやクッキー発行など外部からのパラメータを元にHTTPレスポンスヘッダを出力する際に発生する脆弱性である。
レスポンスヘッダを出力する際のパラメータ中に改行を挿入することによって、被害者のブラウザ上で以下を引き起こす。

  • 任意のレスポンスヘッダ追加
  • レスポンスボディの偽造

HTTPヘッダ・インジェクション脆弱性を悪用した攻撃により、以下の影響があり得る。

  • 任意のクッキーの生成
  • 任意のURLへのリダイレクト
  • 表示内容の改変
  • 任意のJavaScript実行によるXSSと同様の被害

攻撃手法

例として、GETパラメータurlで指定されたURLを受け取り、Locationヘッダを出力してリダイレクトするスクリプトを考える。 このスクリプトを

http://example.jp/redirect.cgi?url=http://exmple.jp/%0D%0ALocation:+http://trap.exemp.com/trap.php

でアクセスすると、"http://trap.exemp.com/trap.php" にリダイレクトされる。
これはパラメータurlの値の中に改行(%0D%0A)があるためである。スクリプトが以下に示すように2行のLocationヘッダを出力する。AapcehはCGIから受け取ったヘッダ中に複数のLocationヘッダがあると、最後のLocationヘッダのみをレスポンスとして返す。結果として "http://trap.exemp.com/trap.php" にリダイレクトされる。

Location: http://example.jp/
Location: http://trap.example.com/trap.php

HTTPレスポンス分割攻撃

HTTPレスポンス分割攻撃(HTTP Response Splitting Attack)は、HTTPヘッダ・インジェクション攻撃により複数のHTTPレスンポンスを作り出してキャッシュサーバ(プロキシサーバ)に偽のコンテンツをキャッシュさせるという攻撃手法である。
HTTP1.1では複数のリクエストをまとめて送信することができる。この場合、レスポンスもまとめて返される。
そこで、攻撃側はHTTPヘッダ・インジェクション攻撃を行うHTTPリクエスト(第1リクエスト)の後に偽のコンテンツをキャッシュさせたいURLに対応したHTTPリクエスト(第2リクエスト)を付加する。
このとき第1リクエストのHTTPヘッダ・インジェクション攻撃により偽のコンテンツをHTTPレスポンスに挿入させると、キャッシュサーバがこの偽のコンテンツを第2リクエストに対するHTTPレスポンスと認識してキャッシュする。この攻撃はキャッシュ汚染とも呼ばれる。
HTTPヘッダ・インジェクション攻撃単独では攻撃を受けた利用者のみが一時的に影響を受ける。対してキャッシュ汚染の場合は複数の利用者が持続的に影響を受ける可能性があり、影響度が大きい。

脆弱性の原因

HTTPレスポンスヘッダはテキスト形式で1行に1つのヘッダを定義できる。つまりヘッダとヘッダは改行で区切られる。
この性質を悪用して、リダイレクト先URLやクッキー値として利用されるパラメータ中に改行を挿入した場合、改行がそのままレスポンスとして出力されることがこの脆弱性の原因である。

対策

対策1:外部からのパラメータをHTTPレスポンスとして出力しない

設計段階で外部からのパラメータをHTTPレスポンスヘッダとして出力しないことを検討するべきである。以下の方針に従えばよい。

  • リダイレクト先を固定にするか番号で指定する
  • セッション変数を使って値を受け渡す

対策2:以下の両方を実施する

どうしても外部からのパラメータをHTTPレスポンスヘッダとして出力しなければならない場合は、以下の対策を実施する。

  • リダイレクトやクッキー生成を専用APIに任せる
  • ヘッダ生成に使うパラメータの改行文字をチェックする

PHPではクッキー生成には setcookie()/setrawcookie()、その他のヘッダの出力にはheader() がある。ただし、現状ではこれらを使用しても完全な脆弱性対策にはならない。よって、アプリケーション側でパラメータの改行文字をチェックを行う。
改行文字に対する処理方法にはいかがある。

  • URL中の改行はエラーとする。
  • クッキー値の改行はパーセントエンコードする。

ただし、ライブラリ側でクッキー値をパーセントエンコードしている場合はアプリケーション側でする必要はないので開発前に調査が必要である。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.7.2 HTTPヘッダ・インジェクション

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

« 2014冬アニメ視聴予定 | Main | psqlでパスワード入力の省略 »

PHP」カテゴリの記事

セキュリティ」カテゴリの記事

Comments

Post a comment

(Not displayed with comment.)

TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/26461/58679059

Listed below are links to weblogs that reference HTTPヘッダ・リダイレクション:

« 2014冬アニメ視聴予定 | Main | psqlでパスワード入力の省略 »

March 2017
Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof