Hello there, ('ω')ノ
👀 まず理解すべきポイント
HTML フィルターが属性を制御している HTMLJanitor は不正な属性(例:
onloadやonclick)を削除して安全化する仕組み。 → しかし内部的にattributesプロパティに依存している。DOM Clobbering とは?
- HTML要素の
idやnameが、DOM オブジェクトのプロパティと衝突(clobber)すると、ブラウザの挙動が壊れる現象。 - これにより、ライブラリ内部の安全チェックが bypass され、通常禁止される属性を注入できる。
- HTML要素の
このラボでは
attributesを clobber する →id="attributes"の要素を用意することで、ライブラリの内部処理を壊す。 → その結果、任意のイベント属性(onfocus)をフォーム要素に付与できる。
📝 実際の攻撃手順
Step 1: コメント欄に悪意ある HTML を投稿
ブログ記事のコメント欄に次を入力:
<form id=x tabindex=0 onfocus=print()><input id=attributes>
🔍 解説
<form id=x>→ フォーカスを受けられる要素を作成tabindex=0→ フォームを「フォーカス可能」にするonfocus=print()→ フォーカス時にprint()関数を実行<input id=attributes>→ DOM clobbering を引き起こす要素
Step 2: Exploit Server で iframe を仕込む
攻撃者用のサーバーに次を仕込む:
<iframe src="https://YOUR-LAB-ID.web-security-academy.net/post?postId=3" onload="setTimeout(()=>this.src=this.src+'#x',500)"> </iframe>
🔍 解説
src→ 攻撃対象のブログ記事(コメントを入れた投稿の URL)onload→ iframe 読み込み後に処理を実行setTimeout(...,500)→ 0.5 秒待ってから#xを URL に追加#x→ IDxの要素(フォーム)にブラウザが自動的にフォーカス- その結果
onfocus=print()が発火してprint()が呼ばれる
✅ まとめ:視点と思考の流れ
- 1. フィルター突破の鍵を探す → DOM clobbering が有効
- 2. ライブラリが内部で何を参照しているか →
attributesプロパティ - 3. そのプロパティを要素IDで上書きできないか →
<input id=attributes> - 4. 実行条件を満たす仕組みを作る →
form onfocus - 5. 自動的にイベントが発火するように誘導 →
iframe + #x
💡 この攻撃は「DOMの性質を逆手にとってライブラリをだます」タイプのものです。 XSSフィルターが「完璧ではない」理由がよくわかる例ですね。
Best regards, (^^ゞ