以下の内容はhttps://cysec148.hatenablog.com/entry/2025/08/21/170907より取得しました。


【有料試作版】PortSwigger LAB解説:DOM XSS in document.write sink using source location.search(document.write × location.search でDOM XSS)

Hello there, ('ω')ノ

動画

www.youtube.com


ねらい

検索ページが、URLのクエリ(location.search)をそのままdocument.writeでページに書き込んでいます。これにより、検索語がタグや属性の中へ無加工で挿入され、XSSが成立します。ゴールはalert(1)を出すこと。


何が危ないの?(一枚絵で理解)

  • データの出どころ(ソース):URLの?search=…(= location.search
  • 書き込み先(シンク)document.write(=HTMLとして解釈・挿入)
  • 観察:ランダム文字を検索すると、その文字列がimg の src属性の中に出力される
  • 突破口:属性のクォートを閉じて抜け出す(break out) → 好きなタグを生やしてイベントでJS実行

攻略手順(なぜそうするか付き)

1) 正常系の確認

  1. 検索ボックスに英数字(例:abc123)を入れて検索。
  2. DevToolsで要素を検査し、入力値がHTML上でimg src="…abc123…"のように属性値として出力されているのを確認。 → 属性内出力=クォートを閉じれば脱出可能という仮説が立つ。

2) 属性からの脱出と実行

検索欄に次を入力:

"><svg onload=alert(1)>
  • 最初の " で img の src 属性を終了
  • > で img タグ自体を閉じる
  • 続いて <svg onload=…> を挿入し、onloadでJSを実行 → ページ再描画時に alert(1) が出れば成功

※ URL直打ち派は、クエリにURLエンコードしてもOK: ?search=%22%3E%3Csvg%20onload%3Dalert(1)%3E


なぜこのペイロードが効くの?

  • document.write は文字列をそのままHTMLとして解釈して挿入します(エスケープなし)。
  • すでにimg の src="…ここ…"という属性コンテキストにいるため、"で属性を閉じれば外へ出られます。
  • svg は HTML で有効な要素で、onload イベントが発火してJSを呼べます。
  • サニタイズが無い/不十分 → 属性→要素→イベントの連鎖で XSS。

つまずきポイントと対処

  • 改行や全角が混じると失敗:コピペ時は半角/改行なしを確認。
  • CSP がある場合:APPRENTICEでは通常緩い想定。もし弾かれるなら onload の代替(onerror 付き img など)を試す。
  • URLで試すと通らない:クエリに入れるときは必ずエンコード(" → %22, 空白 → %20)。

コピペ用(フォーム入力向け)

"><svg onload=alert(1)>

コピペ用(URL直指定向け)

?search=%22%3E%3Csvg%20onload%3Dalert(1)%3E

実務の学び(防御)

  • document.write を使わない(少なくともユーザ入力を渡さない)。
  • 出力はコンテキスト安全に(属性なら適切なエンコード、テキストなら textContent など)。
  • テンプレート/フレームワークのサニタイズを正しく使う。
  • CSP を導入してインライン実行・イベントハンドラを抑制。

まとめ

このLABの核心は、location.search → document.write という危険な直結と、出力先が属性コンテキストである点。 クォートを閉じて脱出 → 任意タグ → onload で実行という最短ルートで、alert(1) を発火させて完了です。

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/08/21/170907より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14