Hello there, ('ω')ノ
動画
ねらい
検索ページが、URLのクエリ(location.search)をそのままdocument.writeでページに書き込んでいます。これにより、検索語がタグや属性の中へ無加工で挿入され、XSSが成立します。ゴールはalert(1)を出すこと。
何が危ないの?(一枚絵で理解)
- データの出どころ(ソース):URLの?search=…(= location.search)
- 書き込み先(シンク):document.write(=HTMLとして解釈・挿入)
- 観察:ランダム文字を検索すると、その文字列がimg の src属性の中に出力される
- 突破口:属性のクォートを閉じて抜け出す(break out) → 好きなタグを生やしてイベントでJS実行
攻略手順(なぜそうするか付き)
1) 正常系の確認
- 検索ボックスに英数字(例:abc123)を入れて検索。
- 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, (^^ゞ