DOM Based XSSを調べてみた【覚書】


 

ページ概要

XMLhttpParser (XHP)の問題が今でもよく起きているそうです。

XHPが htmlと解釈されるときに XSS問題となりうる可能性があります。 

発生箇所はサーバから、クライアントへの通信で起きています。

対策として、「htmlを直接操作しないでtextにエスケープする。」「扱うURLは限定する」ことなどがポイントです。

症状はXSSと同じ、JavaScript等の実行が任意のユーザから行われることが問題になります。

タイプ

(1) Reflected XSS (or Non Persistent)
サイトから、文字(HTML書き換え処理)をそのまま返信(被害者のブラウザで実行されてしまう)するタイプ

(2)Stored XSS
サイトに文字列としてスクリプト自身を格納するタイプ
表示するときに、無意識に入力したURLで自ら実行者となり、被害者のブラウザで実行されてしまいます。

(3)Dom Based XSS
サイトが動的にページを生成し、その時ユーザから任意のタグを入れた箇所を出力するタイプ


いずれも、トリガーは、「メール経由で被害者にその脆弱サイトのページのURLを書いたメールを送る」ことで、ユーザのブラウザである文字列を表示(脆弱性のあるサイト/クライアントシステムでは、特殊な処理を実行)する。

これらの端的な共通項はないかまとめ ると

いずれも Webページ出力処理に問題があるケース

問題の特徴

本質的にはDOMの場合も ユーザからの情報であれば、サニタイジングが必要。

Webアプリで多く、 アクセス解析に問題があるケースもある。 

サーバを介さないページでも問題は発生している。

NGな環境、OKな環境


IE8,9は エンコードされずそのまま出力してしまう。 FireFox17.0.1 やChrome24, Safari 5.1.7 Opera12.11 ならOK

jQueryの古い版 はNGだが、jQuery Mobile Beta2 で対応済み。

問題箇所:実は、具体的に考えておかないと、対応しきれない

開発者の気づきにくいところがあり、そこで問題が起こる。
例えばエンドユーザが使える機能にリファラーがある 。ページ解析の時も使われているが、refereは気づきにくい。ひとつ前のサイトやページで間接的に特殊文字列を渡される。

その他にも 

サーバを介さないページでも問題は発生している
どうやって?
⇛実はIE、FireFox、その他多くのクライアントにおいて#以降の文字列はサーバサイドに送出せず、クライアント内で処理を行います。


サーバ側でURLをエンコードしても無理です。
どんな時か?
TinyURLなどもある。直接的にエンコードできない。

問題のある実装例

innerHTML
document.write() の箇所で問題が起こっている。

動的に作成したurlについては全ブラウザで javascriptが実行される。

refererについては、 IEの古いバージョン8,9でのみエンコードされなかった。

対応例

  • innerTextにしたり createElementしたりする 。つまり htmlとして解釈させない。または標準ライブラリでエンコードさせる。
  • URLを動的に作成するときも制限、またはエンコードする。
  • jQueryのライブラリを最新にする。
  • IE8以降ならOption をヘッダに設定します(textエンコードしてくれず、htmlと自動解釈してしまう問題がある)。
  • chromeを最新にする。古い版ではchromeの拡張機能で、アドオン内のローカルファイルにアクセスできる。(cookieと少し違うだけのlocalStorageのWeb技術と連携して、情報が取得できる問題があるので)

 

Optionについて

特に重要なオプション設定は以下の設定です。

X-XSS-Protection:XSSフィルタの有効/無効
X-Frame-Options:コンテンツのフレーム内における表示を許す/許さない
X-Content-Type-Options:内容からのコンテントタイプの推測をする/しない
Content-Security-Policy:スクリプトのロードと実行等に強い制約を設ける

まとめ

ajaxや DOMなどで 出力する時は全てText形式で出力するように心がける。サーバ側で直接見えない処理とは関係なさそうな思わぬところにURLと連携する問題が潜んでることもある。

この件に関しては、IPAのサイトがわかりやすいです。対応例や、問題を起こすコードなどまとまっています。
Delicious にシェア
Digg にシェア
reddit にシェア
LinkedIn にシェア
LINEで送る
email this
Pocket




One thought on “DOM Based XSSを調べてみた【覚書】

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です