今回は,ratproxyが検出する特徴的なぜい弱性として,JavaScript関数に関するものを紹介しましょう。DOM(document object model)の仕組みを使ったクロスサイト・スクリプティング(XSS)のぜい弱性(DOM Based XSS)です。

 DOM Based XSSは,XSSの中では比較的新しいタイプのぜい弱性で,業界団体のサイトなどで紹介されています。ここでは詳細な説明は割愛しますが,簡単に言うと,Webサーバーを経由させずに標的ユーザーのブラウザ上で悪意あるスクリプトを実行させられるぜい弱性です。

 ぜい弱性のある簡単なサンプルJavaScriptコードを以下に示します。これは,かつてBugzillaで発見されたぜい弱性です。

<script>
document.write("<p>URL: " + document.location + "</p>");
</script>

 このコードでは,locationがそのまま(エスケープされずに)HTMLに出力されています。そのため,locationに「<script>alert(123)</script>」のような攻撃コードを含めると,攻撃コードが実行されてしまいます(ユーザがInternet Explorerを使用している場合)。

 従来の通常のXSSぜい弱性は,サーバー側のWebアプリケーション・コードの欠陥が原因ですが,DOM Based XSSはクライアント側で実行されるJavaScriptコードに欠陥があって発生します。そこが従来型のXSSとの違いです。

 上記サンプルは,document.write()が使用されているぜい弱なコードですが,innerHTMLプロパティを使ったJavaScriptコードにも,似たようなぜい弱性が見つかることがあります。innerHTMLプロパティはDOMの要素の一つで,「オブジェクト内のHTML」を意味します。最近のWeb2.0的なWebアプリケーションには,JavaScriptによってドキュメントをコントロールするものが多く,この種のぜい弱性が潜んでいるケースが増えてきています。

 対策は,以下のようにJavaScript内でHTMLの特殊文字をエスケープするか,DOM関数を使います。

(エスケープする方法)
<script>
// htmlescape関数は別途自作する必要がある
document.write("<p>URL: " + htmlescape(document.location) + "</p>");
</script>
(DOM関数を使う方法)
<p id="zzz"></p>
<script>
var p = document.createTextNode("URL: " + document.location);
document.getElementById('zzz').appendChild(p);
</script>

 ただし,この二つの方法は,JavaScript関数を自作したりDOM関数を使ったりと,比較的コーディングの手間が掛かります。特に理由がなければ,サーバ・サイドでHTMLを生成する方式にした方がよいでしょう。

ratproxyでの検査

 ratproxyはJavaScriptコード内に,write(), writeln(), innerHTML, outerHTMLといった関数やプロパティが使用されている場合に,それをぜい弱性(の候補)として報告します。JavaScriptコードで動的にHTMLを生成する際に,これらの関数やプロパティが使用されるためです。しかし,上記の関数やプロパティが使われているすべての個所がぜい弱なわけではありません。ratproxyは,「write」や「innerHTML」などを単純な文字列検索によって探すため,誤検出は少なからず発生します。

寺田 健(てらだ たけし)
三井物産セキュアディレクション
技術部 セキュリティアセスメントグループ
シニアテクニカルコンサルタント
ポータル・サイトなどでのWebアプリケーションのシステム開発・運用経験を活かし,セキュリティ・コンサルタントとして,主にWebアプリケーションのぜい弱性検査に従事している。ECサイトや金融機関などのWebサイト検査の実績を持つ。CISSP,情報セキュリティアドミニストレータ。