Shikata Ga Nai

Private? There is no such things.

DOM XSSの様々なソースとシンクの攻撃手法まとめ

Hello there, ('ω')ノ

🎯 DOMベースXSSの基本原理

DOMベースXSSは、ユーザー入力(ソース)がJavaScriptコードによって危険な関数(シンク)に渡され、結果として悪意のあるスクリプトがブラウザ上で実行されてしまう脆弱性です。


🔁 ソースからシンクへの流れ

DOM XSSの攻撃が成立するには、「ソース → シンク」というパスが存在する必要があります。

  • ソース例

    • location.search(クエリパラメータ)
    • location.hash(URLフラグメント)
    • document.referrer(遷移元URL)
    • localStorage, sessionStorage など
  • シンク例

    • innerHTML
    • document.write
    • eval
    • setTimeout / setInterval
    • location.href

🧨 攻撃手法:document.writeシンクの例

たとえば、アプリが次のようなJavaScriptコードを使っていたとします:

document.write('Welcome ' + location.hash);

URLに以下のように入力することで、任意のスクリプトが実行されます:

https://vulnerable-website.com/#<script>alert(document.domain)</script>

この結果、以下のようにHTMLが書き換えられ、スクリプトが実行されます:

Welcome <script>alert(document.domain)</script>

🧠 攻撃を成功させるコツ

  1. ソースを特定 ChromeのDevToolsで location, document.referrer, document.URL などの使用箇所を探す。

  2. シンクの特性を知る innerHTML → タグの挿入可能 eval → コードの直接実行 document.write → HTML構造の変更可能

  3. ペイロードの調整 コンテキストに応じて <script>, onerror, autofocus などを使い分ける。

  4. フィルタリングやエンコードの回避 文字列がエンコードされるか、JS側で変換処理されるかを確認する。


🧪 例:他のシンクも含むペイロード例

  • innerHTML を使う場合:
  element.innerHTML = location.hash;

→ ペイロード:

  #<img src=1 onerror=alert(1)>
  • eval を使う場合:
  eval(location.search.slice(1));

→ ペイロード:

  ?alert(document.cookie)

📝 まとめ

シンク 説明 ペイロード例
document.write HTMLを直接書き込む <script>alert(1)</script>
innerHTML HTMLとして挿入 <img src=1 onerror=alert(1)>
eval 文字列をJSとして実行 alert(document.cookie)
setTimeout, setInterval 第一引数が文字列のときコード実行 setTimeout("alert(1)", 1000)

Best regards, (^^ゞ