HTTPレスポンス分割

HTTPレスポンス分割は、外部からの入力データを使用して動的にHTTPヘッダーを出力するWebアプリケーションの脆弱性を利用し、攻撃者の意のままにできる偽のページをユーザーに取得させるセキュリティ攻撃です。

HTTPレスポンス分割の例

HTTPレスポンス分割に利用されることが多いのは、HTTPヘッダーのフィールドのうちリダイレクト先を指定するLocation:フィールドやCookieを設定するSet-Cookie:フィールドです。
例えば、ユーザが選択した言語をリクエスト パラメータに含めて送信し、それに従って各言語別のページにリダイレクトするアプリケーションがあるとします。
 
正常なレスポンス ヘッダーは次のようになります。

HTTP/1.1 302 Moved Temporarily
ContentType: text/html
Location: http://MyServer/page.aspx?lang=Japanese

ここで、Japaneseの代わりに次の内容をパラメータとして送信します。

Dummy%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%209999%0d%0a%0d%0a<html>任意のHTMLコンテンツ...</html>

すると次のようなレスポンスが生成されます。

HTTP/1.1 302 Moved Temporarily
ContentType: text/html
Location: http://MyServer/page.aspx?lang=Dummy
Content-Length: 0

HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 9999

<html>任意のHTMLコンテンツ...</html>

HTTPの仕様では、ヘッダーの終了は改行コード(CR+LF、URLエンコードされた形式では%0d%0a)2つによって表されます。従って、上の例の「Content-Length: 0」の後で1つのレスポンスが終了し、「HTTP/1.1 200 OK」以降は別のレスポンスを構成すると解釈されます。2番目のレスポンスの内容は、完全に攻撃者の制御下にあります。 攻撃者は、この偽のレスポンスをプロキシ サーバにキャッシュさせるなどの方法で、他のユーザも偽のレスポンスを取得するようにします。これによってページの偽装、クロスサイト スクリプティング、Cookieの操作などの攻撃が可能になります。

対策

HTTPレスポンス分割を防ぐには、ユーザからの入力データの検証と、出力データの適切なエンコーディングを徹底します。
入力データをヘッダーに出力する前に、改行コード(CR+LF)が含まれていないかをチェックします。アプリケーションでLocationフィールドに値を設定する場合、改行コードを取り除きます。Set-Cookieフィールドに値を設定する場合は、必ずURLエンコードします。

dotTESTのルール

○ HTTP レスポンス分割から防御する
このルールは、改行を含んでいる可能性のある入力データが、検証メソッドによるチェックを受けないまま出力メソッドに渡されている場合に違反をレポートします。このルールはフロー解析ルールなので、入力データの取得と出力が別のメソッドに分かれていたり、複数の実行パスが存在する場合でも、実行パスを辿って違反を検出することができます。ルールのパラメータをカスタマイズすることによって、どの入力データをチェック対象にするかを指定することができます。

dotTESTHTTP レスポンス分割から防御するルールでソースコードを解析することにより、HTTPレスポンス分割による攻撃に対して脆弱なコードを発見し、改修することが可能になります。

dotTESTが検出する脆弱性(抜粋)一覧

※ セキュリティルール及びセキュリティコンプライアンス規約セットによる静的解析には「セキュリティコンプライアンスパック」のライセンス(有償)が必要です。

C# VB.NET対応 静的解析・単体テストツール dotTESTに
関するお問い合わせ

  • テクマトリックス株式会社
    東京本社

    ソフトウェアエンジニアリング事業部

    03-4405-7853

メールでのお問い合わせ
parasoft-info@techmatrix.co.jp

お問い合わせ

製品についてやテクマトリックスについてなど、
こちらよりお気軽にお問い合わせいただけます。