概要
BurpSuiteでWebアプリケーションやAPIの脆弱性診断を行う際に、パラメータを引き継ぎたい場面があります。
基本的にはBurpSuiteにもともと備わっているMacrosと、Session handling rulesを使用することで引き継ぎ可能ですが、引き継ぎたいパラメータがJSON形式の場合、この機能だけでは引き継ぎができません。
BurpSuiteの拡張機能「Custom Parameter Handler」を使用すればこれが実現できるので、本記事ではその拡張機能の使い方を記載します。
※Python Scripterを使用したい場合は、【BurpSuite】Python Scripterを使用したJSONパラメータの引き継ぎ方法を参照ください。
※HTMLフォーム送信におけるパラメータを引き継ぎたい場合は、【BurpSuite】パラメータの引き継ぎ方法を参照ください。
目的
- BurpSuiteのRepeaterでリクエストBを送信した際に、リクエストAで得たJSONパラメータを、リクエストBに引き継ぐ
前提
デモとして下記仕様とします。
- エンドポイントBで正常なレスポンスを得たい場合、エンドポイントAで返却された文字列が必要である
- 正常な文字列でエンドポイントBを叩くと、200OKとなる
- 不正な文字列でエンドポイントBを叩くと、400エラーでNGとなる

【正常】エンドポイントAで取得した文字列を、エンドポイントBに引き継ぐ

【不正】不正な文字列でエンドポイントBを叩くと、400エラーでNGと返却される
手順
拡張機能「Custom Parameter Handler」をインストール
BApp Storeで「Custom Parameter Handler」と検索し、installボタンを押下してください。Installedタブでチェックがはいった状態になっていればOKです。

「Custom Parameter Handler」をインストールする

「Custom Parameter Handler」を有効化する
scopeの設定
scopeに対象ドメインを設定します。これをしないとうまく動作しません。

MacrosとSession handling rulesの設定
MacrosとSession handling rulesを使用して、エンドポイントBをRepeaterで送信した際に、その前にエンドポイントAが走るように設定します。
まずはMacrosの設定をします。
Macrosの設定
SettingからMacrosと検索してAddを押下します。
Macro recorderが開いたら、エンドポイントAを選択します。

Macro recorderでエンドポイントAを選択
Macro descriptionには適当な名前をつけておきましょう。ここでは「endpointA」としておきます。
その他「Configure item」などの設定は不要です。

Macroの設定
Session handling rulesの設定
「Session handling rules」と検索してAddを押下します。
DetailsタブのRule descriptionには適当な名前を設定し、Rule actionsではAddからRun a macroで先ほど作成したMacroを選択します。Run a macroの設定はデフォルトのままでOKです。

Run a macroで先ほど作成したMacroを選択

Detailsタブの設定
ScopeタブのTools scopeで、引き継ぎ設定を使用したいツールを選択します。今回はRepeaterで使用したいので、Repeaterにチェックをいれます。IntruderやScannerでも使用したい場合は、その項目にチェックを入れてください。
URL Scopeでは、どのリクエストを送信した際にこの設定が動くようにするかを設定します。ここではエンドポイントBを送信した際に動いて欲しいので、そのように設定します。

Scopeタブの設定
これでMacrosとSession handling rulesの設定は完了です。
拡張機能「Custom Parameter Handler」の設定
「CPH Config」タブのOptionsタブを開きます。今回はRepeaterで使用したいので、Tool scope settingではRepeaterにチェックを入れておきます。

Repeaterにチェック
引き継ぎ元のリクエスト(エンドポイントA)の設定
引き継ぎ元のリクエストであるエンドポイントAの設定をします。
引き継ぎ元のリクエストであるエンドポイントAを右クリックし、Extentions>Custom Parameter Handler>Send to CPH を押下し「CPH Config」タブに登録します。

引き継ぎ元のリクエストを「CPH Config」タブに登録
- Friendly name
- 任意の名前をつけます。ここでは「endpointA」と設定します
- また、本タブのチェックを外します
- Scoping
- this tab will work 『only on』『requests』containing this expression の設定にします
- 空欄にはエンドポイントAのリクエストラインを設定します。ここでは「GET /api/endpointA HTTP/2」と設定します。RegExをチェックすれば、正規表現も使用可能です
- Parameter handling
引き継ぎ先のリクエスト(エンドポイントB)の設定
引き継ぎ先のリクエストであるエンドポイントBの設定をします。
引き継ぎ先のリクエストであるエンドポイントBを右クリックし、Extentions>Custom Parameter Handler>Send to CPH を押下し「CPH Config」タブに登録します。

引き継ぎ先のリクエストを「CPH Config」タブに登録
- Friendly name
- 任意の名前をつけます。ここでは「endpointB」と設定します
- また、本タブのチェックをつけます
- Scoping
- this tab will work 『only on』『requests』containing this expression の設定にします
- 空欄にはエンドポイントBのリクエストラインを設定します。ここでは「POST /api/endpointB HTTP/2」と設定します。RegExをチェックすれば、正規表現も使用可能です
- Parameter handling
- 1) Find matches to this expression
- ここでは、エンドポイントBのレスポンスのどこに値を埋め込むかの設定をします。エンドポイントBのリクエストボディ
{"uuid":"{hogehoge}"}の{hogehoge}に埋め込みたいので、正規表現で"uuid":".*"と設定し、RegExをチェックします
- ここでは、エンドポイントBのレスポンスのどこに値を埋め込むかの設定をします。エンドポイントBのリクエストボディ
- 3) Replace each target with this expression
- ここでは、エンドポイントBのレスポンスをどのように置き換えるかを設定します。
"uuid":"\g<token>"と設定します。\g<token>が置き換え対象の目印になります - The value I need is dynamicのチェックをつけます
- ここでは、エンドポイントBのレスポンスをどのように置き換えるかを設定します。
- 4) In the expression above, refer to the named RegEx groups you'll define below in order to insert
- プルダウンでは、「values in the cached response of a previous CPH tab」を選択します
- その下のプルダウンでは、先ほど設定した引き継ぎ元の設定を選択します。ここでは「endpointA」を選択します
- その下の空欄には、引き継ぎ元のどの部分を参照して抜き出すかを設定します。ここでは、エンドポイントAのレスポンスボディ
{"result":"{hogehoge}"}の{hogehoge}を抜き出したいので、正規表現を使用し、"result":"(?P<token>[0-9a-z-]*)"と設定します。抜き出し対象の目印が?P<token>になります。この<token>は上記 3)で設定した\g<token>の文字列と合わせておく必要があります。この設定についての公式記述は、4) の
マークをクリックすると、見にくいですが解説をみることができます

「CPH Config」エンドポイントBの設定
- 1) Find matches to this expression
設定は以上になります。
確認
それでは実際にRepeaterで送信して動作確認をしていきます。
エンドポイントBを送信すると、200OKが返却されたので、成功しています。
リクエストのボディは変化していないので、本当に成功しているかが分かりにくいですが、Repeaterで送信するたびに、CPH Configの4) のレスポンスが変化しているので、意図した動作をしていることがわかります。

【動作確認結果】エンドポイントBをRepeaterで送信してみて200が返却されていればOK

Repeaterで送信するたびに、CPH Configのレスポンスが変化しているので、正常に動いていることがわかる
動作確認がうまくいかないとき
- 設定反映に少し時間がかかるので(おおよそ1分程度)、うまくいかなくてもRepeaterで何度か送信を試してみてください。(筆者も、Custom Parameter Handlerの設定は特に変えてなくて、さっきまでうまくいかなかったのに、うまくいくようになった事象を経験しています)
- ExtensionsタブのCustom Parameter HandlerのOutputに本拡張機能のログが書き出されています。うまくいかない場合は、「CPH Config」タブのOptionsタブで、ロギングレベルをDEBUGにしてログを確認しながら設定を行なってください

ロギングレベルを設定する

Show in UIにログが書き出されている
設定の保存
CPH Configの設定はBurpを閉じると消えてしまうので、設定を保存しておきます。「CPH Config」タブのOptionsタブの Export Configから設定を書き出しておきましょう。書き出した設定を読み込みたい時は、Import Configで読み込みできます。

CPH Configの設定保存
