Security blog by Ierae Security,Inc.

脆弱性診断技術や関連情報を発信するブログメディア

Webアプリケーション診断ツール「Burp Suite」のExtention紹介(二重登録エラー回避機能)

Burp suite

こんにちは。牧田です。

Webアプリケーション診断において、Burp SuiteのMacro機能で対応できない案件がたまにあります。
例えば、会員登録の確定処理において、指定したメールアドレスが既に登録済みだとエラーになってしまうような場合です。
本来は正常に登録できるリクエストに対して診断を行いたいところですが、こういう場合はIntruderやScannerをかけても二重登録エラーになってしまうため、きちんと診断することができません。(よって、手動でひたすら頑張ることになります…)

今回はそんな時に使えるExtentionの紹介です。
このExtentionを使うことによって、指定したパラメータの値を任意のものに変更できるので、例えば、会員登録の確定処理で毎回メールアドレスを有効なものに変更しつつ、他のパラメータに対するスキャンができるようになります。

なお、Pythonで書くのは初めてなので、サンプルコードの紹介程度ということでよろしくお願いいたします。

ソースコード


# coding: UTF-8

from burp import IBurpExtender
from burp import IBurpExtenderCallbacks
from burp import ITab
from burp import IHttpListener
from burp import IParameter
from javax import swing

count = 0

class BurpExtender(IBurpExtender,ITab,IHttpListener,IParameter):

    def processHttpMessage(self, toolFlag, messageIsRequest, currentRequest):
        #Requestではない場合はスルー
        if not messageIsRequest:
            return

        #対象スコープではない場合はスルー
        if not self._callbacks.isInScope( currentRequest.getUrl() ):
            return

        #対象パラメータ名、置換後のリスト取得
        target = self._jTextIn.getText()
        words = self._jTextOut.getText().split("\n")
        while "" in words: words.remove("")

        #対象パラメータの値を置換
        if target != '':
            parameters = self._helpers.analyzeRequest(currentRequest.getRequest()).getParameters()
            for parameter in parameters:
                if target == parameter.getName():
                    current_value = parameter.getValue()

                    #リストが空の場合は数値を元の値の末尾に追加する
                    if not words:
                        global count
                        word = current_value + str(count)
                        count += 1
                        
                    #リストの上から値を取得
                    else:
                        words = self._jTextOut.getText().split("\n")
                        word = words[0]
                        words.pop(0)
                        newwords = '\n'.join(words)
                        self._jTextOut.setText(newwords)

                    print "changed:" + word

                    #値を置換して送信する
                    newMessage = self._helpers.updateParameter(currentRequest.getRequest(), self._helpers.buildParameter(target,word,parameter.getType()))
                    currentRequest.setRequest(newMessage)

        return

    def	registerExtenderCallbacks(self, callbacks):
        print "Parameter changer"

        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()

        callbacks.setExtensionName("Parameter changer")
        callbacks.registerHttpListener(self)

        #GUIの構築...最低限のところのみ
        self._jPanel = swing.JPanel()
        self._jPanel.setLayout(swing.BoxLayout(self._jPanel, swing.BoxLayout.Y_AXIS))
        self._jTextIn = swing.JTextField()
        self._jTextIn.setText("Write your parameter name")
        self._jScrollPaneIn = swing.JScrollPane(self._jTextIn)
        self._jTextOut = swing.JTextArea("Write your word list")
        self._jScrollPaneOut = swing.JScrollPane(self._jTextOut)
        self._jPanel.add(self._jScrollPaneIn)
        self._jPanel.add(self._jScrollPaneOut)

        callbacks.customizeUiComponent(self._jPanel)
        callbacks.addSuiteTab(self)
        return

    def getTabCaption(self):
        return "Parameter changer"

    def getUiComponent(self):
        return self._jPanel

 

使い方

1. Burp ExtenderのPython Environmentを設定する。
※参考 https://portswigger.net/burp/help/extender.html#options_pythonenv

2. Burp ExtentionsからAddボタンを押下してPythonとしてコードを読み込む。

3. 新しくできたタブ(Parameter changer)に対象パラメータと置換する値を設定する。値が空の場合は0からインクリメントされた数値が挿入される。

Burp Suite画面1

4. Targetのスコープに対象ドメインを指定する。

5. 設定せずに実施するとメールアドレスが登録済みというエラーメッセージが表示される。

Burp Suite画面2

6. 設定すると正常に登録される。

Burp Suite画面3

7. 置換内容を確認する。注意点として、置換のタイミングがBurpToolからメッセージが離れた後のため、Logger++や二重proxyにしないと内容が確認できない。

Burp Suite画面4

執筆者コメント

今回は試しにPythonで書いてみましたが、さくさく書けるので相性良さそうですね。また小ネタをアップしたいと思います。

イエラエセキュリティ社のWebアプリケーション診断サービスに関するご依頼もお待ちしております。