DOM-based XSS 発生する原因

DOM-based XSSとは

Dom-based XSS とは、ブラウザ上で動作するJavaScript上のコードに問題があるために発生します。 主に以下のJavaScriptのメソッド、プロパティを使用した際に、発生する可能性が高いです。

  • document.write()
  • document.writeln()
  • document.domain
  • element.innerHTML
  • element.outerHTML
  • element.insertAdjacentHTML
  • element.onevent

これらのメソッド、プロパティの使用方法を間違えるとDOM-based XSSの原因に繋がります。 どういった時にXSSが実行されるのか、見ていきます。

document.write()

document.write()とは

文字列や変数の値を表示させるメソッドです。 以下の用に使用すると、HTML上に「Hello World」と表示させることができます。

document.write('Hello World')

また、以下のHTMLのタグを含めた使用方法もできます。こう使用することにより、HTMLのタグが反映され、「Hello World」が見出しとして大きく表示されます。

document.write('<h1>Hello World</h1>')

document.write()のDOM-based XSS

DOM-based XSSが発生する原因は、利用者から入力を受け取り、document.write()に反映されることにより発生します。 例

let input = '<img src=1 onerror=alert(1)>' // 利用者の入力値
document.write(input)  // DOM-based XSSの発火原因

DOM-based XSSの発生原因 結論

基本的に、利用者から入力を受け取り、任意のメソッド、プロパティに反映させることにより、DOM-based XSSの発生原因になります。

BurpSuite Extender 開発1

拡張機能名を設定する方法

from burp import IBurpExtender

class BurpExtender(IBurpExtender):
    def registerExtenderCallbacks(self, callbacks):
        # 拡張機能名を「Hello」に設定します。
        callbacks.setExtensionName("Hello")

拡張機能名を「Hello」と設定することで「Extender > Extensions」に反映されます。

タブ作成

from burp import IBurpExtender,ITab
from javax.swing import JPanel
from java.awt import BorderLayout


class BurpExtender(IBurpExtender,ITab):

    # タブnameを「New Tab」に設定
    def getTabCaption(self):
        return "New Tab"

    # UIを設定
    def getUiComponent(self):
        panel = JPanel(BorderLayout())
        return panel

    def registerExtenderCallbacks(self, callbacks):
        # BurpのUIに追加
        callbacks.addSuiteTab(self)

以下のようにタブに「New Tab」を追加できます。