メッセージエディタでのHTTP/2正規化

Burpのメッセージエディタは、HTTP/2のリクエストをHTTP/1形式の文法で表示します。つまり、もしHTTP/1のリクエストだった場合にはどのようなリクエストになるかを表示します。これは、リクエストの各コンポーネントをHTTP/1と同等のものへのマッピングで実現しています。エディタで変更を加えた場合には、この処理を逆に行います。たとえば、リクエスト行を:method:path疑似ヘッダにマッピングしたり、Hostヘッダから:authorityを生成したりします。

Burpは、エディタで行った変更に対して簡単な正規化を行い、拒否される可能性の高いHTTP/2リクエストがうっかり送信されるリスクを軽減します。理論的に無効なリクエストに対してサーバがどのように反応するかを確認したい場合は、正規化せずにリクエストを送信できます。

どのような正規化が行われるのか?

メッセージエディタのHTTP/1形式の入力をHTTP/2メッセージに変換する際に、次のような正規化が行われます:

これにより、HTTP/1の構文的に有効なリクエストを作成していれば、Burpは仕様に準拠したHTTP/2リクエストを生成します。さもなければ、多くのサーバで拒否されるようなリクエストを誤って作ってしまうことになります。

リクエストを送信すると、実行された正規化を反映してエディタ内の表現が更新されます。この透過性により、リクエストが裏でどうなったかが理解できます。

なぜHostヘッダを動かせないのか?

Burpは、エディタに表示されるHostヘッダを、HTTP/2で相当する:authority疑似ヘッダにマッピングします。HTTP/2では、すべての疑似ヘッダは通常のヘッダの前に送信されることになっています。このため、Inspectorで疑似ヘッダを移動させて上書きしない限り、Burpは疑似ヘッダを固定の順序で送信します。

正規化されていないリクエストの送信

正規化せずにHTTP/2リクエストを送信するには、メッセージエディタではなく、Inspectorを使って変更を行います。唯一の例外として、Connectionヘッダはデフォルトでは削除されたままですが、Repeaterメニューでこの動作をコントロールできます。

これにより、HTTP/2の仕様に準拠していないリクエストを意図的に送信し、サーバの挙動を確認できます。