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>
🧠 攻撃を成功させるコツ
ソースを特定 ChromeのDevToolsで
location
,document.referrer
,document.URL
などの使用箇所を探す。シンクの特性を知る
innerHTML
→ タグの挿入可能eval
→ コードの直接実行document.write
→ HTML構造の変更可能ペイロードの調整 コンテキストに応じて
<script>
,onerror
,autofocus
などを使い分ける。フィルタリングやエンコードの回避 文字列がエンコードされるか、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, (^^ゞ