Marsの5εcur1ty備忘録

不定期的にCTF、脆弱性検証、バグバウンティレポート分析など、情報セキュリティを中心とした技術ブログを更新します。

(CWE-79) DOM Based XSS

Cross-site Scripting (XSS) - DOM (CWE-79)

  • OWASPによる定義:

DOM Based XSS (or as it is called in some texts, “type-0 XSS”) is an XSS attack wherein the attack payload is executed as a result of modifying the DOM “environment” in the victim’s browser used by the original client side script, so that the client side code runs in an “unexpected” manner.

DOM Based XSS - OWASP

 DOM(Document Object Model)は、ブラウザ上のデータをサーバを介さず直接取得できるAPIのことです。ウェブ開発経験のある方は、「document.getElementFromId['number'].value=5」というようなコードを書いたことがあるでしょう。

 DOM based XSSは、JavaScriptで表示する箇所でDOM操作を通して発生するXSSのことです。つまり、Attackerが入力したJavaScriptコードがサーバに送られる前にブラウザがJavaScriptを実行してしまいます。これは、サーバから返ってくるJavaScriptを実行するリフレクト型XSSとストア型のXSSとは違います。

・DOM based XSS 実例:

www.youtube.com

 この例では、入力した文字列をその場で入力欄の上に表示しています。ここで、以下のように処理されます。

document.getElementById("greeting").innerHTML="Hello, "+ name + "!";

 入力欄の上にidがgreetingのラベルに"Hello, (入力内容)!"を表示します。  このnameに" <\img src = "http://evil****.com/?money_transfer=ok"/> ( \を無くす )を付けると、どうなるでしょうか。

document.getElementById("greeting").innerHTML="Hello, "+ " <\img src = "http://evil****.com/?money_transfer=ok"/> + "!"; ( \を無くす )

 文字列がimgタグだと解釈され、実行されてしまいました。

 ここまでになってもサーバとのやりとりはありません。これは、リフレクト型XSS&ストア型XSSとの一番大きい違いです。

・DOM based XSS が発生しやすい場所:
  • ソース(Source)とシンク(Sink)

 ソースとは、攻撃者がJavaScriptを入力する場所です。攻撃によって結果を返す箇所がシンクと呼びます。

  • よくあるソース

    location.href

    location.search

    location.hash

    document.cookie

    document.referer

    window.name

    localStorage

    sessionStorage

  • よくあるシンク

    document.write

    element.innerHTML

    eval

    setTimeout

    setInterval

    jQuery ( )

    $ ( )

    $.html ( )

・DOM based XSS による被害:

 OWASPの定義通り、ユーザに攻撃者が用意したJavaScriptコードを実行させ、"unexpected"なことを起こします。

Copyright Mars 2019