現在、多くのサーバがHTTP/2をサポートしています。そのせいで、HTTP/1しかサポートしていないツールでは見つけられない脆弱性が放置されている可能性があります。Burp Suiteは、HTTP/2ベースのテストに対して比類のないサポートを提供し、他のツールではできない方法でHTTP/2リクエストを操作できます。次のどちらでも可能です:
メッセージエディタで、リクエストをHTTP/1スタイルで操作する
加えたすべての変更を正規化し、同等のHTTP/2リクエストをサーバに送信します。使用しているプロトコルを気にしない一般的なテストに最適です。
Inspectorで、HTTP/2ビューで操作する
サーバに送信されるヘッダと疑似ヘッダをより正確な表現で表示します。このビューはHTTP/1構文に依存しないため、HTTP/2特有の手法を使用したさまざまな攻撃も構築できます。
BurpのユニークなHTTP/2機能は、これまで適切なツールがまったくなかったためほとんど診断されていなかった、まったく新しい攻撃経路を探索する機会を与えてくれます。実際の例として、ある研究者がこれらの機能を利用して、リクエストスマグリングを行う新たな方法を発見し、悪用に成功した例を見てください。
内部では、HTTP/2はHTTP/1と大きく異なります。これらの機能を最大限に活用するために、背景の関連する概念を簡単に説明しています。
Burpはデフォルトで、TLSハンドシェイク時にALPNでHTTP/2のサポートを表明するサーバとの通信に、HTTP/2を使用します。これにより、プロトコルに特化したテストを行う場合ではなくても、HTTP/2のおかげでパフォーマンスが向上します。
プロジェクトのデフォルトのプロトコルを変更すれば、現在のニーズに合わせてこの動作を調整できます。これは、常にHTTP/1を使用する必要があるテストを行っている場合に便利です。必要に応じて個別にHTTP/2リクエストを送信する場合は、Inspectorでプロトコルの切り替えができます。
プロトコルレベルの脆弱性をテストする際には、各リクエストにどのプロトコルが使用されているかの認識が重要です。この情報が表示される場所はいくつかあります。
メッセージエディタでは、リクエスト行とステータス行にプロトコルバージョンが表示されます。これは、HTTP/1メッセージでは標準ですが、HTTP/2メッセージのエディタでの表現にも適用されます。
Burp Repeaterでは、画面の右上にある対象ホストの横に現在のプロトコルが表示されます。
Inspectorでは、リクエスト属性セクションにプロトコルバージョンが表示されます。Proxy履歴のような編集できない文脈では、ハイライトされたプロトコルは単なる情報です。Burp Proxyでインターセプトしたリクエストや、Burp Repeaterに送信したリクエストでは、どのプロトコルを使って送信するかを切り替えられます。
デフォルトのプロトコル設定にかかわらず、各リクエストの送信に使用するプロトコルを手動で選択できます。これを行うには、Inspector > リクエスト属性のトグルスイッチを使います。
プロトコルを変更すると、Burpは必要な変換を行い、新しいプロトコルでの同等のリクエストを生成します。つまり、必要に応じて個々のリクエストを簡単にアップグレードやダウングレードできます。
デフォルトでは、サーバがTLSハンドシェイク中にALPNでHTTP/2のサポートを明示した場合にのみ、リクエストをアップグレードできます。こっそりHTTP/2をサポートしているかをテストするために、HTTP/2リクエストを送信してみたい場合は、まずRepeaterメニューからHTTP/2 ALPNを上書きするオプションを有効にする必要があります。
Inspectorで作業すると、HTTP/1の構文では正確に表現できないHTTP/2リクエストを、情報を失うことなく作成できます。Burpではこれを"ケトルな"リクエストと呼んでいます。このようなリクエストをダウングレードしようとすると、エディタで表示できるようにリクエストを正規化する必要があるとBurpが警告します。
Inspectorを使えば、HTTP/1の構文では正確に表現できないようなHTTP/2リクエストを、情報を失うことなく作成できます。悪名高きDirector of ResearchのJames Kettleにちなんで、私たちはこのようなリクエストを"ケトルな"という言葉で表現しています。
たとえば、HTTP/2ではヘッダ値の中に改行文字を入れることが技術的には可能です。HTTP/1では、改行がヘッダの終わりを示すため、それ以降は次のヘッダ名の始まりにしか見えず、これを表示する方法がありません。
一度リクエストがケトル化されると、メッセージエディタはもうそのリクエストに相当するHTTP/1を表示しようとはしません。メッセージの本文は見られます。そのリクエストがなぜケトルなリクエストだと判断されたのかを伝える通知が、ヘッダの代わりに表示されます。ケトルなリクエストのヘッダにさらに変更を加えたい場合は、Inspectorを使用する必要があります。
現在、Burp Proxy、Repeater、Logger、Scannerは、ケトルなリクエストをサポートしています。Intruderなどのケトルなリクエストをサポートしていないツールに送ると、エディタで表示できるように正規化されます。
Inspectorを使って次のような変更を行うと、ケトルなリクエストになります:
ヘッダ名に大文字やコロンをつける。
ヘッダ名や値に改行文字を追加する。
:scheme
擬似ヘッダの値を変更する。
:path
や:method
擬似ヘッダに空白文字を追加する。
重複する疑似ヘッダを追加する。
cookieの値にセミコロンや空白文字を追加する。
リクエストを誤ってケトル化してしまった場合、それを復元する方法がいくつか有ります。次のことが可能です:
Ctrl/Cmd + Z
キーで、変更内容を元に戻す。
Inspectorを使用して、ケトルなリクエストになる原因となった特定の変更を手動で取り消す。エディタの通知を確認し、どのような変更が必要か確認してください。
InspectorのトグルでリクエストをHTTP/1にダウングレードし、変更内容が失われるという警告を受け入れる。Burpはリクエストを正規化し、HTTP/1と互換性のない変更は効果的に破棄されます。
拡張は、ケトルなリクエストを新たに生成し送信できるので、HTTP/2ベースのテストをする拡張を開発できます。ただし現在のところ、Burpが最初に発行したケトルなリクエストを、拡張で変更はできません。これはBurpのリクエストに対して、正規化されたHTTP/1スタイルの表現でしかアクセスできないためです。
Burpには、HTTP/2の動作を調整する設定がいくつかあります。
Burpはデフォルトで、TLSハンドシェイク時にALPNでHTTP/2のサポートを表明するサーバとの通信に、HTTP/2を使用します。しかしデフォルトのプロトコルを変更すれば、HTTP/2リクエストを送信するよう明示的に指示しない限り、HTTP/1を使用するようにできます。そのためには、設定 > ネットワーク > HTTPで、サーバがサポートしている場合、デフォルトでHTTP/2にするオプションのチェックを外します。
古典的なCL.TEやTE.CLのリクエストスマグリングのような、特にHTTP/1を必要とする脆弱性に焦点を当てている場合は、これが必要でしょう。
個々のリクエストでこのグローバル設定を上書きするには、Inspector > リクエスト属性で、プロトコルのトグルを使用してください。
画面上部のRepeaterメニューから、HTTP/2リクエストを処理する際のBurp Repeaterの動作を制御する次のオプションにアクセスできます。
Repeaterはデフォルトで、クロスドメインでリダイレクトされた場合、通常通りプロトコルをネゴシエートします。このオプションを有効にすると、Inspector > リクエスト属性で選択されているのと同じプロトコルを使用してクロスドメインのリダイレクトをたどります。これは、クロスドメインリクエストを引き起こすようなHTTP/2特有の脆弱性をテストしている場合に重要です。
Repeaterはデフォルトで、複数のHTTP/2リクエストに同じ接続を再利用します。サーバによっては、各接続の最初のリクエストとそれ以降のリクエストの扱いが異なるため、脆弱性が断続的に現れたり、完全に見逃すこともあります。あるいは、あるリクエストがサーバは落とさずに接続を破壊していて、その後のすべてのリクエストの処理が裏で影響を受けていることがあります。
これらの問題が発生した場合はこのオプションを無効にして、送信するリクエストが常に接続後の最初のリクエストになるようにすると、問題を軽減できるかもしれません。
デフォルトで、HTTP/2リクエストにConnection
ヘッダがある場合、Burpはリクエストをサーバに送信する前にこれを削除します。これは、多くのHTTP/2サーバがこのヘッダを含むリクエストを拒否するためです。
それでもConnection
ヘッダを送信する実験をしたい場合は、このオプションを無効にしてください。
このオプションを選択すると、サーバがHTTP/2をサポートしていることをALPNで表明していない場合でも、Burp RepeaterからHTTP/2リクエストを送信できます。これにより、Burp Scannerが報告する"隠れたHTTP/2"の攻撃経路の探索や、隠れたHTTP/2サポートを手動でテストできます。
まれに、クライアントのHTTP/2実装に問題がある場合など、クライアントとBurpのProxyリスナーとの接続でHTTP/2を無効にしたい場合があります。その場合は、ユーザオプション > その他に移動し、該当するリスナーを選択し、編集をクリックします。ダイアログで、HTTP/2タブに移動し、HTTP/2のサポートチェックボックスの選択を解除します。これによりBurpは、クライアントがHTTP/2を使用したい場合でも、HTTP/1しか受け付けません。
これはBurpとサーバ間の接続には影響しないことに注意してください。
BurpのHTTP/2サポートにはいくつかの制限があります。現在、以下のような機能拡張を行っています。
現時点でBurpのツールの中には、ケトルなリクエストを処理できないツールが、Burp Intruderなどいくつかあります。今後のリリースでは、Burpのすべてのツールでケトルなリクエストを扱えることを目指しています。