・4.17 JavaScriptの問題
4.17.1 DOM Based XSS
DOM Based XSS脆弱性が生まれる原因●外部からHTMLタグを挿入して、DOMを操作している●evalなどの機能で、外部からJavaScriptを実行している●XMLHttpRequestリクエストのURLが未検証である●Location.href や ｓｒｃ属性、href属性のURLが未検証である

HTMLタグなどが有効になる機能
document.write() / document.writeln()interHTML / outerHTML
jQuery の html() jQuery() $()evalインジェクションの原理でJavaScriptが動く機能
eval()
setTimeout() / setInterval()
Functionコンストラクタ

javascriptスキームやvbscriptスキームを指定する機能
JavaScriptのlocation.href
a要素のhref属性やiframe要素のsrc属性など

DOM Based XSS脆弱性の対策●DOM操作、記号の適切なエスケープ・innerHTMLプロパティをtextContentプロパティに置き換える・document.writeでは代替DOM機能がないので、HTMLエスケープを実装する●eval、setTimeout、Functionコンストラクタの引数に外部から値を渡さない●URLをｈｔｔｐかｈｔｔｐｓに限定する●ｊQueryセレクタを動的に生成しない●最新のライブラリを用いる
ｊQuery 1.8.3（脆弱） → jQuery 3.2.1（対策版）●XMLHｔｔｐRequestのURLを検証する
固定テーブルを用いる方法

4h-001 ： innerHTMLによるDOM Based XSS(正常系)【ブラウザ】

【サーバ： 4h/4h-001.ｈｔｍｌ 】

innerHTMLによるDOM BASE XSS
URLの＃より後の記述部分（フラグメント識別子またはハッシュなどと呼びます）
を変化させると表示部分が変わるアプリケーションです
jQueryのｈｔｍｌ（）メソッドでも同様にDOM BASE XSSの可能性があります【ブラウザ→サーバ： リクエスト 4h/4h-001.ｈｔｍｌ → レスポンス 】

4h-001 ： innerHTMLによるDOM Based XSS(攻撃)【ブラウザ】

【サーバ： 4h/4h-001.ｈｔｍｌ 】

innerHTMLによるDOM BASE XSS
URLの＃より後の記述部分（フラグメント識別子またはハッシュなどと呼びます）を変化させると表示部分が変わるアプリケーションです
jQueryのｈｔｍｌ（）メソッドでも同様にDOM BASE XSSの可能性があります【ブラウザ→サーバ： リクエスト 4h/4h-001.ｈｔｍｌ → レスポンス 】

4h-001a ： 4h-001 の対策版(攻撃)【ブラウザ】

【サーバ： 4h/4h-001a.ｈｔｍｌ 】

innerHTMLによるDOM BASE XSS
URLの＃より後の記述部分（フラグメント識別子またはハッシュなどと呼びます）を変化させると表示部分が変わるアプリケーションです
jQueryのｈｔｍｌ（）メソッドでも同様にDOM BASE XSSの可能性があります
innerHTMLプロパティをtextContentプロパティに置き換えて対策しています【ブラウザ→サーバ： リクエスト 4h/4g-001a.html → レスポンス 】

4h-002 ： アクセス解析(document.write; 正常系)
【ブラウザ】【サーバ： 4h/4h-002.ｈｔｍｌ 】【サーバ： 4h/4h-003.ｈｔｍｌ 】

Base64エンコードされたデータは、１ドット四方のGIF画像データで、見えないダミー画像として使用します
document.writeによるDOM BASE XSS
innerHTMLでは、script要素を注入してもJavascriptは実行されませんが、document.writeではJavascriptを実行し、DOM BASE XSSが可能です【ブラウザ→サーバ： リクエスト 4h/4g-002.html → レスポンス 】

4h-002 ： アクセス解析(document.write; XSS攻撃)【ブラウザ】「OK」をクリックし、「F12」キーで「インスペクター」タブをクリックして、script要素が注入されているのを確認します【サーバ： 4h/4h-002.ｈｔｍｌ 】【サーバ： 4h/4h-003.ｈｔｍｌ 】

Base64エンコードされたデータは、１ドット四方のGIF画像データで、見えないダミー画像として使用します
document.writeによるDOM BASE XSS
innerHTMLでは、script要素を注入してもJavascriptは実行されませんが、document.writeではJavascriptを実行し、DOM BASE XSSが可能です【ブラウザ→サーバ： リクエスト 4h/4g-002.html → レスポンス 】

4h-002a ： アクセス解析対策版(document.write; XSS攻撃)【ブラウザ】

【サーバ： 4h/4h-002a.ｈｔｍｌ 】【サーバ： 4h/4h-003.ｈｔｍｌ 】

Base64エンコードされたデータは、１ドット四方のGIF画像データで、見えないダミー画像として使用します

escape_html関数で対策しています
document.writeによるDOM BASE XSS
innerHTMLでは、script要素を注入してもJavascriptは実行されませんが、document.writeではJavascriptを実行し、DOM BASE XSSが可能です【ブラウザ→サーバ： リクエスト 4h/4g-002a.html → レスポンス 】

4h-004 ： XMLHttpRequestのURL未検証(正常系)【ブラウザ】

XMLHttpRequestリクエストで読み込むURLを検証していないとフラグメント識別子の外部URL指定内容から、DOM Base XSSが発生します【サーバ： 4h/4h-004.ｈｔｍｌ 】

XMLHttpRequestリクエストで読み込むURLを検証していないとフラグメント識別子の外部URL指定内容から、DOM Base XSSが発生します【ブラウザ→サーバ： リクエスト 4h/4g-004.html → レスポンス 】

【ブラウザ→サーバ： リクエスト 4h/4h-004.html#menu_a → レスポンス 】

4h-004 ： XMLHttpRequestのURL未検証(XSS攻撃)【ブラウザ】

【サーバ： 4h/4h-004.ｈｔｍｌ 】【サーバ： 4h/4h-900.php 】

CORSによって、「example.jp」オリジンからの読み込みを許可しているので、「4h-004.ｈｔｍｌ」からのXMLHttpRequestリクエストからのアクセスで読み込まれてしまいます
XMLHttpRequestリクエストで読み込むURLを検証していないとフラグメント識別子の外部URL指定内容から、DOM Base XSSが発生します【ブラウザ→サーバ： リクエスト 4h/4g-004.html → レスポンス 】

4h-004a ： XMLHttpRequestのURL検証版(正常系)【ブラウザ】

【サーバ： 4h/4h-004a.ｈｔｍｌ 】

固定テーブルから、外部から危険なURLを指定できないようにしています

XMLHttpRequestリクエストで読み込むURLを検証していないとフラグメント識別子の外部URL指定内容から、DOM Base XSSが発生します【ブラウザ→サーバ： リクエスト 4h/4g-004a.html → レスポンス 】

【ブラウザ→サーバ： リクエスト 4h/4h-004a.html#menu_a → レスポンス 】

4h-004a ： XMLHttpRequestのURL検証版(XSS攻撃)【ブラウザ】

【サーバ： 4h/4h-004a.ｈｔｍｌ 】【サーバ： 4h/4h-900.php 】

CORSによって、「example.jp」オリジンからの読み込みを許可しているので、「4h-004.ｈｔｍｌ」からのXMLHttpRequestリクエストからのアクセスで読み込まれてしまいます
固定テーブルから、外部から危険なURLを指定できないようにしています
XMLHttpRequestリクエストで読み込むURLを検証していないとフラグメント識別子の外部URL指定内容から、DOM Base XSSが発生します【ブラウザ→サーバ： リクエスト 4h/4g-004a.html → レスポンス 】

【ブラウザ→サーバ： リクエスト 4h/#menu_a → レスポンス 】

4h-004a ： XMLHttpRequestのURL検証版(XSS攻撃)【ブラウザ】

【サーバ： 4g/4g-005.ｈｔｍｌ 】

URI.min.jsはクエリ文字列を簡単に取り扱うためのライブラリです

ｊQueryセレクタ
記述例$('#idname')$('.classname')$('input[name="foo"]')説明
id属性がidnameであるものを取得
class属性がclassnameであるものを取得
input属性がname属性がfooのものを取得＄関数（jQuery）はHTMLタグ文字を指定して、DOM要素を生成できます
ｊQuery固有の問題として、セレクタというｊQueryの機能の不適切な利用によるXSS脆弱性があります
セレクタ指定文字列に外部文字列が混入して、XSS脆弱性となる場合があります【ブラウザ→サーバ： リクエスト 4g/4g-005.html → レスポンス 】

【ブラウザ→サーバ： リクエスト js/URI.min.js → レスポンス 】【ブラウザ→サーバ： リクエスト js/jqurey-1.8.3.js → レスポンス 】

4h-005 ： jQueryのセレクタの動的生成によるXSS(攻撃)【ブラウザ】

【サーバ： 4g/4g-005.ｈｔｍｌ 】

URI.min.jsはクエリ文字列を簡単に取り扱うためのライブラリです

ｊQueryセレクタ
記述例$('#idname')$('.classname')$('input[name="foo"]')説明
id属性がidnameであるものを取得
class属性がclassnameであるものを取得
input属性がname属性がfooのものを取得＄関数（jQuery）はHTMLタグ文字を指定して、DOM要素を生成できます
ｊQuery固有の問題として、セレクタというｊQueryの機能の不適切な利用によるXSS脆弱性があります
セレクタ指定文字列に外部文字列が混入して、XSS脆弱性となる場合があります【ブラウザ→サーバ： リクエスト 4g/4g-005.html → レスポンス 】

【ブラウザ→サーバ： リクエスト js/URI.min.js → レスポンス 】【ブラウザ→サーバ： リクエスト js/jqurey-1.8.3.js → レスポンス 】

4h-005a ： jQueryのセレクタの動的生成によるXSS findメソッドによる対策(攻撃)【ブラウザ】【サーバ： 4g/4g-005a.ｈｔｍｌ 】

findメソッドを使用することで、動的にHTMLを生成されることはなくなります
ただし、セレクタの構造は変えられるので、値の検証も必要です【ブラウザ→サーバ： リクエスト 4g/4g-005a.html → レスポンス 】

【ブラウザ→サーバ： リクエスト js/URI.min.js → レスポンス 】【ブラウザ→サーバ： リクエスト js/jqurey-1.8.3.js → レスポンス 】

4h-005b ： jQueryのセレクタの動的生成によるXSS パラメータの整数化(攻撃)【ブラウザ】【サーバ： 4g/4g-005b.ｈｔｍｌ 】

【ブラウザ→サーバ： リクエスト 4g/4g-005b.html → レスポンス 】

【ブラウザ→サーバ： リクエスト js/URI.min.js → レスポンス 】【ブラウザ→サーバ： リクエスト js/jqurey-1.8.3.js → レスポンス 】

4h-005c ： jQueryのセレクタの動的生成によるXSS(対策済みjQuery)(攻撃)【ブラウザ】【サーバ： 4g/4g-005ｃ.ｈｔｍｌ 】

新しいｊQueryを使うだけで DOM Base XSS は回避できる【ブラウザ→サーバ： リクエスト 4g/4g-005ｃ.html → レスポンス 】

【ブラウザ→サーバ： リクエスト js/URI.min.js → レスポンス 】【ブラウザ→サーバ： リクエスト js/jqurey-1.8.3.js → レスポンス 】

4h-006 ： javascriptスキームによるXSS（正常系）【ブラウザ】【サーバ： 4g/4g-006.ｈｔｍｌ 】【サーバ： 4g/4g-007.ｈｔｍｌ 】

【ブラウザ→サーバ： リクエスト 4g/4g-006.html → レスポンス 】【ブラウザ→サーバ： リクエスト 4g/4g-007.html → レスポンス 】

4h-006 ： javascriptスキームによるXSS（攻撃）【ブラウザ】

URLを外部から指定できる属性に、JavaScriptスキームを指定できる場合XSS脆弱性になります【サーバ： 4g/4g-006.ｈｔｍｌ 】【ブラウザ→サーバ： リクエスト 4g/4g-006.html → レスポンス 】【サーバ： 4g/4g-007.ｈｔｍｌ 】

4h-006a ： javascriptスキームによるXSS対策版（正常系）【ブラウザ】【サーバ： 4g/4g-006a.ｈｔｍｌ 】【サーバ： 4g/4g-007.ｈｔｍｌ 】

オープンリダイレクト脆弱性は残ります（２シート後の「オープンリダイレクト」参照）

【ブラウザ→サーバ： リクエスト 4g/4g-006a.html → レスポンス 】【ブラウザ→サーバ： リクエスト 4g/4g-007.html → レスポンス 】

4h-006a ： javascriptスキームによるXSS対策版（攻撃）【ブラウザ】

【サーバ： 4g/4g-006.ｈｔｍｌ 】【サーバ： 4g/4g-007.ｈｔｍｌ 】

オープンリダイレクト脆弱性は残ります（２シート後の「オープンリダイレクト」参照）【ブラウザ→サーバ： リクエスト 4g/4g-006a.html → レスポンス 】

4h-008 ： setTimeoutによるXSS（正常系; 3秒待つ）【ブラウザ】【サーバ： 4g/4g-008.ｈｔｍｌ 】

【ブラウザ→サーバ： リクエスト 4g/4g-008.html → レスポンス 】

4h-008 ： setTimeoutによるXSS（攻撃）【ブラウザ】

【サーバ： 4g/4g-008.ｈｔｍｌ 】【ブラウザ→サーバ： リクエスト 4g/4g-008.html → レスポンス 】

4h-008 ： setTimeoutによるXSS（対策版への攻撃）【ブラウザ】

【サーバ： 4g/4g-008.ｈｔｍｌ 】

setTimeoutに、関数リテラルやクロージャーを渡すことで対策します【ブラウザ→サーバ： リクエスト 4g/4g-008a.html → レスポンス 】