sWebMachineGun.exe実践編
今回は、データの作成画面(と削除画面)がターゲット
ポイントは、データ作成画面では、大量のデータ(つまりゴミデータ)が作成されるので、ちょっと画面が汚くなってしまうのが、アレな感じ
ポイントは、データ削除画面では、データを削除してしまうので、事前に置換方法ごとデータを作成しておく必要があるよね、という話
ポイントは、データ作成画面で作成したデータを削除したいのだが、それはどれなのかと特定することなのだが、多くは最大値だろうということ。
そういうことなので、これはCSRFトークン抽出機能で最大値を取り出すプラグインで可能だと思われる
ポイントは、データ作成画面でデータ作成が失敗した場合は、データ削除のリクエストをしてはいけない、ということ
データを作成していないのに、削除リクエストを送ってしまうと、IDが最大値のデータは、おそらく直前に登録したデータではない、ということだからね
診断対象
こんな感じ
つまり、データを作成しつつ、作成したデータも削除してしまいたい。という話
今回の場合、作成完了画面に「Id」の値が表示されているので、そのIdをCSRFトークンプラグインでCSRFTokenとして拾えれば、それを使って削除処理ができるので、そういうやり方もありだけど、今回は作成完了画面のレスポンスを使わない(無視する)事にする。
データ作成完了画面のレスポンスに、その作成したデータを削除するための鍵となる値が記述されない場合もあるので・・・今回はそういう場合、一覧画面から直前に作成したデータのIDを探そう。ということにしている
sWebMachineGun.exeの設定
メインの設定は、HTTPリクエストの設定と、置換方法の設定
sWebMachineGun.exeの設定1
「Request」タブに、三つのHTTPリクエストを設定する
この画面は、「一つのHTTPリクエスト(一番シンプル)」とかと大部分は同じだが、画面下部に【「登録しました」を見つけられなかったらセッション中断】というセッション継続の条件が記述されているところには注目してほしい。
これは、置換処理によって改変されたリクエストでは、バリデーション/サニタイズ/入力値チェックによってデータ登録が失敗する場合がある。その時はその後のデータ削除リクエストは中止する、ということを示している。
これによって、データが登録されたセッションの時だけ(登録したデータを)削除するリクエストが送られる、ということを示している。
二つ目のリクエストテンプレートは、登録データ一覧を表示する画面
このリクエストは特に説明する必要はないだろう。
三つのリクエストテンプレートは、登録データを削除するリクエスト・テンプレート
削除する「ID」をクエリ文字列で指定しているのだが、直前のリクエストで登録されたデータの一覧から、CSRFトークンの抽出機能(後述)により、直前に登録したデータのIDを抽出して、その値をマクロ「%%csrf0%」で呼び出している。
sWebMachineGun.exeの設定2
この画面は「置換したリクエストとは別のレスポンスを検査する場合(CSRFトークン)」とかと同じなので、説明は省略してもいいよね。
この画面で、変換対象ページをとりあえずNo0と指定している
(つまり、データ作成のリクエストが置換対象ということ)
sWebMachineGun.exeの設定4(CSRFトークンの設定)
「GeneralSetting」タブの「CSRF Token」ボタンで、表示されるダイアログで設定する。
作成したデータのID(削除する時に必要だよね)をどうやって抽出するのか、というのがポイントだと思うけど、それをCSRFトークンの抽出プラグインで、できるようにした。
今回の対象でも「id〇〇〇〇で登録しました」と作成完了画面で表示されるのであれば、CSRFトークン抽出機能を使って、その値を抽出すればいいのだが、作成完了画面では単に「登録しました」だけ表示される場合はどうすればいいのか、という問題に出くわしたのである。
そこで、登録データ一覧画面に戻れば、おそらくIDの値は最大値だろうと、大いに推定して、正規表現でCSRFトークンを抽出するプラグインに「IsMax」というオプションを設けた。
(このチェックボックスをそれまで使っていなかったので)
つまり、正規表現による抽出には「IsMax」チェックボックスをオンにして、正規表現で抽出した中で最大値が「%%csrf(番号)%」というマクロに保持されるので、それを使って、一番大きいIDのレコード(これはつまり直前に登録したデータだと思われる)を削除することができるだろう、と思うわけです。
画面では、
- 抽出方法として、正規表現「asp[^<]*"」で抽出して、さらに先読みと後読み機能を使って「(?<==)[0-9]+(?=")」という正規表現で、削除するレコードのIDを抽出する
- 貼付はしない→「None」
- リストの一番最初なので0番目、つまり「%%csrf0%」マクロに格納される
ということになっている
sWebMachineGun.exeの実行
実行前はこんな感じで、id=11が最大値で、これらは診断対象のお客さまが事前に作成していたデータ、というイメージかな
「Execute」ボタンで、実行できるのですが、結果はこんな感じで、
まず、1つ目のデータ作成のリクエストによって、データの作成が成功している
id=17で作成されている
その次のデータ一覧を呼び出した後の削除リクエストはこんな感じで、id=17、つまり先ほど作成したデータを削除している、データ作成後の後片付けに成功している
次に変数「age」についてだが、こちらの注目しているレコードでは数値ではない書き換えにしたので、作成を拒否されている
そして、続く一覧から削除については、「登録しました」が返却されなかったので、これらのリクエストテンプレートの送信は中断してくれたことが分かる
まぁ、こんな感じで、データを作成して削除して、、、を繰り返して、データ作成画面やデータ削除画面について、各パラメータをいろいろな値に置換しながら、診断できるだろう
注意事項
つまり、、、
- データ作成に数時間かかるような処理には向いていない
- データ作成後のデータのIDがハッシュ値とか、乱数とか、とにかく単純増加でない場合には向いていない(これはCSRFトークン抽出をスクリプトで行えば可能かもしれないが、毎回スクリプトを記述する必要はあるだろう)
- データ作成回数に(データを削除しても)制限がある場合も向いていない
そのうち、正規表現のCSRFトークン抽出プラグインに「ラスト」(ヒットした中で、最後のブツ)を入れようかと思案中...
通常のCSRFトークン抽出プラグインは、ヒットした中でも最初のブツ(処理の高速化のため)なので・・・