My Photo

« クロスサイト・スクリプティング(XSS)その2 | Main | クロスサイト・スクリプティング(XSS)その4 »

September 17, 2013

クロスサイト・スクリプティング(XSS)その3

JavaScriptの動的生成

最近のWebアプリケーションではJavaScriptの一部をサーバ側で動的に生成する例が多く見られるようになった。典型的なのはJavaScriptの文字列リテラルを生成する場合である。

イベントハンドラのXSS

次のスクリプトはonloadイベントで呼び出される関数の引数を生成している。

<head><script>
function init (a) { /* 処理 */ }
</script></head>
<body onload="init('<?php echo htmlspecialchars($_GET['name'], ENT_QUOTES) ?>'">
</body>

htmlspecialchars()でエスケープしているので問題ないように思えるが、実際にはXSS脆弱性がある。
「name=');alert(document.cookie)//」
というクエリストリングを指定してスクリプトを実行すると、HTMLは以下のようになる。

<body onload="init('&#039;);alert(document.cookie)//')">

属性値は文字参照が解釈されるので、以下のJavaScriptが実行される。
#クエリストリングの末尾のスラッシュ2つは余計な"')"をコメントアウトしている。

init('');alert(document.cookie)//')

脆弱性の原因はJavaScriptの文字列リテラレルのエスケープがされていなかったことである。そのため、入力パラメータ中のシングルクウォートがデータとしての文字ではなくJavaScriptの文字列終端に使われ、alert()の挿入を許す結果となった。

対策は後述。

JavaScriptの文字列リテラルのエスケープとして最低限必要な文字列は下表。

文字 エスケープ後
\ \\
' \'
" \"
改行 \n

script要素のXSS

script要素内でJavaScriptの一部を動的に生成する場合、script要素内ではタグや文字列参照を解釈しないのでHTMLエスケープは不要で、JavaScript文字列リテラルのエスケープを行う。しかし、それだけでは脆弱性が残る。
以下のスクリプトは脆弱性がある。

<script>
$('#name').text('<?php echo escape_js($_GET['name']); ?>');
</script>

escape_js()はJavaScript文字列リテラルをエスケープする関数とする。
「</script><script>alert(document.cookie)//」
というクエリストリングを指定してスクリプトを実行すると、script要素は以下のようになる。

<script>
$('#name').text('</script><script>alert(document.cookie)//');
</sciprt>

"</script>"でscript要素が一旦終端して、次の"<script>"で始まるscript要素でalert()が実行される。

JavaScriptの文字列リテラルの動的生成の対策

  1. JavaScriptの文字列リテラルとしてエスケープする。
  2. イベントハンドラ中の場合は1の結果をHTMLエスケープする
  3. スクリプト要素内の場合は1の結果に"</"という文字列が出現しないようにする。

JavaScriptのエスケープルールは複雑なため対処漏れが生じやすく、基本的にJavaScriptの動的生成は避けるべきである。
しかし、やむを得なず行う場合の対策として以下の2つがある。

  • Unicodeエスケープ
    英数字以外をすべてをエスケープする。UnicodeコードポイントU+XXXXの文字を\uXXXXで表す。
    実際には英数字以外にもマイナスとピリオドもエスケープしなくてセキュリティ上は問題ない。
  • script要素の外部でパラメータ定義してJavaScriptから参照する方法
    type属性がhiddeのinput要素などの値を動的に生成して、それをJavaScriptから参照する。
    この方法であればJavaScriptの動的生成をせずに済む。

参考文献:体系的に学ぶWebアプリケーションの作り方 4.3.2 クロスサイトスクリプティング(発展編)

体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
徳丸 浩

ソフトバンククリエイティブ 2011-03-03
売り上げランキング : 4070

Amazonで詳しく見る
by G-Tools

« クロスサイト・スクリプティング(XSS)その2 | Main | クロスサイト・スクリプティング(XSS)その4 »

プログラミング、技術情報」カテゴリの記事

PHP」カテゴリの記事

セキュリティ」カテゴリの記事

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference クロスサイト・スクリプティング(XSS)その3:

« クロスサイト・スクリプティング(XSS)その2 | Main | クロスサイト・スクリプティング(XSS)その4 »

June 2021
Sun Mon Tue Wed Thu Fri Sat
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof