Burpのメッセージエディタは、HTTP/2のリクエストをHTTP/1形式の文法で表示します。つまり、もしHTTP/1のリクエストだった場合にはどのようなリクエストになるかを表示します。これは、リクエストの各コンポーネントをHTTP/1と同等のものへのマッピングで実現しています。エディタで変更を加えた場合には、この処理を逆に行います。たとえば、リクエスト行を:method
と:path
疑似ヘッダにマッピングしたり、Host
ヘッダから:authority
を生成したりします。
Burpは、エディタで行った変更に対して簡単な正規化を行い、拒否される可能性の高いHTTP/2リクエストがうっかり送信されるリスクを軽減します。理論的に無効なリクエストに対してサーバがどのように反応するかを確認したい場合は、正規化せずにリクエストを送信できます。
メッセージエディタのHTTP/1形式の入力をHTTP/2メッセージに変換する際に、次のような正規化が行われます:
ヘッダ名に大文字が含まれている場合は、小文字に変換されます。
存在する場合、Connection
ヘッダは削除されます。
Host
ヘッダを移動した場合は、元の位置に戻されます。
これにより、HTTP/1の構文的に有効なリクエストを作成していれば、Burpは仕様に準拠したHTTP/2リクエストを生成します。さもなければ、多くのサーバで拒否されるようなリクエストを誤って作ってしまうことになります。
リクエストを送信すると、実行された正規化を反映してエディタ内の表現が更新されます。この透過性により、リクエストが裏でどうなったかが理解できます。
Burpは、エディタに表示されるHost
ヘッダを、HTTP/2で相当する:authority
疑似ヘッダにマッピングします。HTTP/2では、すべての疑似ヘッダは通常のヘッダの前に送信されることになっています。このため、Inspectorで疑似ヘッダを移動させて上書きしない限り、Burpは疑似ヘッダを固定の順序で送信します。
正規化せずにHTTP/2リクエストを送信するには、メッセージエディタではなく、Inspectorを使って変更を行います。唯一の例外として、Connection
ヘッダはデフォルトでは削除されたままですが、Repeaterメニューでこの動作をコントロールできます。
これにより、HTTP/2の仕様に準拠していないリクエストを意図的に送信し、サーバの挙動を確認できます。