XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます(編集部)
皆さん、はじめまして。はせがわようすけと申します。
「教科書に載らないWebアプリケーションセキュリティ」ということで、Webアプリケーションのセキュリティに関連する、普段あまり見掛けないような小さな話題を取り上げていきたいと思います。
セキュアなWebアプリケーションを実現するために、開発者の方だけでなく、Webアプリケーションの脆弱性検査を行う方々にも読んでいただきたいと思っています。重箱の隅を楊枝でほじくるような小さな話題ばかりですが、皆さんよろしくお願いします。
さて第1回は、Internet ExplorerがHTMLを解釈する際の引用符の扱いについて説明します。
皆さんご存じのとおり、HTMLを動的に生成するWebアプリケーションにて属性値を出力する場合には、クロスサイトスクリプティング(XSS)への対策として、
とするのが定石だと思います。
もちろん、引用符としてダブルクオーテーション「"」ではなくシングルクオーテーション「'」を使う場合もあるでしょうが、原則としては同じように属性値を引用符でくくることと属性値内の引用符をエスケープする、の2点につきると思います。
ただし、2種類の引用符を混在させることは、コードを書く際にも混乱によるミスを生じかねないので、どちらかに統一するべきでしょう。
例えば<input>要素のvalue属性を出力する場合に、
<input type="text" value=[ここに外部由来の文字列]>
という形でvalue属性を引用符でくくっていなかった場合、攻撃者は「x onmouseover=alert(/xss/.source)」のような文字列を与えます。すると、生成されるHTMLは、
<input type="text" value=x onmouseover=alert(/xss/.source)>
のようになり、テキストボックス上でマウスカーソルを動かしたときに攻撃者のJavaScriptが実行されてしまい、XSSが成立してしまいます(ユーザーによる操作の介在なしにスクリプトを実行させる手段もありますが、それについてはここでは触れません)。
alertのカッコ内「/xss/.source」は、引用符を使わずに任意の文字列を表現する、攻撃者にしか役に立たないテクニックの1つです。
また、value属性を引用符でくくっていても、属性値内に含まれる引用符をエスケープしていない場合、つまり、
<input type="text" value="[ここに外部由来の文字列]">
のような状況だと攻撃者が「x" onmouseover="alert(/xss/.source)」という文字列を与えることで、
<input type="text" value="x" onmouseover="alert(/xss/.source)">
のようなHTMLが生成され、XSSが成立してしまいます。
繰り返しになりますが、HTMLの属性値を生成する場合には、
というのが大原則です。
Copyright © ITmedia, Inc. All Rights Reserved.