🎃

脆弱性診断における重複登録チェックの回避

に公開

何本か記事を投稿して、物書きの人すごいなぁと思っているMariydiです。

さて、色々Montoya APIについて話してきたところで、脆弱性診断で有用であろうものを1つ紹介したいと思います。箸休め回です。

ユーザ名 or メールアドレスの登録重複チェック

以下のようなシチュエーションにおいて、登録する際にユーザ名やメールアドレスの重複を許さない場合があります。

  • ECサイトでのユーザ登録
  • コーポレートサイトでの管理ユーザの登録
  • なにかの管理ツールでのユーザ登録
  • etc...

そういうサイトを相手にする場合、そのままScanを実行すると重複チェックが挟まってしまい正常な結果になりません。
そのため、重複チェックを回避して登録処理を実行してあげる必要があります。

乱数をいれる。

ユーザ名や、メールアドレスは数字を入れても問題がないことがほとんどです。
ユーザ名であればそのまま、メールアドレスならエイリアスに乱数を入れてあげるとよいでしょう。
例えば、 SHINDAN000000のような形で固定長にして数字の部分に乱数を入れてあげると、よりわかりやすくていいかもしれません(固定長にすることで衝突するかもしれませんが…)。
暗号論的疑似乱数を生成する必要もないので、 random.nextInt(1_000_000)とかで生成してあげると良いと思います。
また、乱数部分の桁数が増えたり減ったりした場合、たまーにScannerがSQLiあるんじゃない?!って言ってくることがあります。自分が作ったExtentionのおかげで追加の検証をする必要がでてしまうので、桁数は合わせておきましょう。

実装!

乱数を入れようと思っても場所がわからないと入れ損になっちゃうので、アンカーのような文字列を入れておきましょう。
具体的には、リクエストにFIZZという値を入れて送信して、Extention側でFIZZの文字列を乱数に置き換えるという処理にしてあげるとわかりやすいかと思います。

@Override
public RequestToBeSentAction handleHttpRequestToBeSent(HttpRequestToBeSent requestToBeSent) {
    Annotations annotations = requestToBeSent.annotations();
    String body = requestToBeSent.bodyToString();

    int number = random.nextInt(1_000_000);
    String randomString = "SHINDAN" + String.format("%06d", number);

    String result = body.replace("FIZZ", randomString);
    HttpRequest RequestRewriteBody = requestToBeSent.withBody(result);
    
    return continueWith(RequestRewriteBody,annotations);
}

連番をいれる。

乱数ではなく、連番をいれる方法もあります。
連番の管理はExtentionで行い、リクエストを編集したあとでインクリメントすることで対応することができます。ほかは乱数のときと一緒です。
ただ、これにはBurp Suite本体またはExtentionの無効化をするとカウントが初期値に戻るというデメリットもあります。

おしまい!

Discussion