DOM(Document Object Model)ベースのXSS(クロスサイトスクリプティング)についてです。
XSSには、反射型と格納型とDOM based XSSの3つに分けられます。
多くのサイトなので解説がされているのが、反射型のXSSです。対策の中心はエスケープ処理です。
IPAのサイトが分かりやすすぎるので、改めて解説する気も起きなくなります・・・。
https://www.ipa.go.jp/files/000024729.pdf

が、私なりに書いてみると、

➀従来のXSS(反射型XSS)
クライアント→(URLにアクセス)→サーバ
       ←(コンテンツを送る)
       →(スクリプトを入れて送る)
      ←(スクリプトを組み込まれたものがクライアントに送付)
 発露

②DOM based XSS

クライアント→(URLにアクセス)→ サーバ
       ←(コンテンツを送る)
 発露

※javaScriptなので、サーバは無関係にクライアント側で実施される
 また、サーバにJavaScript部分の記載は送られないので、サーバにログも残らない。

攻撃手法ですが、具体的にはURLに#とスクリプトを付与します。

H26秋SC午後Ⅱ問2をみてみましょう。
問題文
(Ⅰ)DOMベースのXSSの対策
JavaScriptによるWebページ操作に問題がある場合に起きるXSSは,DOMベースのXSSと呼ばれている。JavaScriptを利用する場合は,注意が必要である。
例えば,図2に示すHTML(HTTP://www.example.jp/domXSS.html)があった場合に,図3に示すURIにブラウザからアクセスすると,“1"という警告ダイアログが表示される。
<html>
<body>
<script>
 document.write(decodeURIComponent(location.hash));
</script>
</body>
</html>
図2 HTML  (HTTP://www.example.jp/domXSS.html)

http://www.example.jp/domxss.html〔 g 〕<script>alert(1)〔 h 〕
図3 警告ダイアログが表示されるURI

 反射型(reflected型,non-persistent型)のXSSと違って,DOMベースのXSSでは攻撃者が注入するデータがWebサイトからの応答中に出力されない。ブラウザ上のHTMLデータに入力データを動的に挿入するようなJavaScriptが応答中に含まれていると,入力データにスクリプトが含まれていたときに,そのスクリプトがブラウザ上で実行されてしまう。そのため、DOMベースのXSSは,③反射型のXSSとは診断方法が異なる。
 DOMベースのXSSの対策のためには,"document.write", "innerHTML"などの,動的にブラウザ上のHTMLデータを操作するメソッドやプロパティを使用するのではなく,"createElement"などのDOM操作用のメソッドやプロパティを使用して,ブラウザ上のHTMLデータを構築することが必要である。
図2のスクリプトを簡単に言うと、「リンクのうちhash(#)以降の文字列をブラウザに表示しなさい」ということです。
 もう少し詳しく説明します。

document.write(decodeURIComponent(location.hash));

hash(ハッシュ)とは記号の「#」のことです。
 ・location.hashによりURIにおけるハッシュ(#)以降の部分を取得する。
 ・decodeURIComponentによりdecodeされた状態の文字にする。
 ・document.write関数によりハッシュ(#)以降の文字列をブラウザに表示する。

では、この仕組みを用いて、問題文にある「"1"という警告ダイアログを表示」させるにはどうしたらいいか。
#のあとに警告ダイアログが表示させるスクリプト文字を挿入します。
 http://www.example.jp/domXSS.html#<script>alert(1)</script>
 この結果、#以降の<script>alert(1)</script>が文字として取得され,警告ダイアログが表示されます。
aa