一問飛ばしてた…
問題4. Stored XSS via HTML Attribute
調査
4問目は「You can also do XSS by injecting a value into an HTML attribute. Inject a script by setting the color value in a profile.」。プロフィールのcolorを使用して、HTML属性ににスクリプトを埋め込めるか。
ProfileのColor欄に好きな色の名前を入れてみる。
すると、Home画面のユーザー名が、入力した色で表示される。
これは、ProfileのColor欄に入力した値を使用して、以下のようなコードを生成しているため。
<b><span style='color:green'>GOLEM-XIV</span></b>
ということで、この部分にコードを仕込めないか考えてみる。
脆弱性の確認
ProfileのColor欄に、以下のコードを入力。
' onmouseover="alert(document.cookie)" '
すると、以下のようなコードが生成される。
<b><span style='color:' onmouseover="alert(document.cookie)" ''>GOLEM-XIV</span></b>
ユーザー名(GOLEM-XIV)の上をマウスが通過するとダイアログが表示され、スクリプトの埋め込みに成功したことがわかる。
解決方法
今回の場合、タグのエスケープ処理では防ぐことができない。今回の例では、<や>のタグを使用していない。
そもそも、今回の場合、Colorの欄にColor以外の値を入れられることが問題。よって、入力可能な値(”RED”などの特定色名や、”#FF0000″など)であるかをプログラム中でチェックし、入力可能な値でなければ、エラーとする。(ホワイトリスト方式)
補足1 ホワイトリスト方式とブラックリスト方式
入力値をチェックするには、大きく以下の2通りが存在する。
- ホワイトリスト方式
- 入力可能な値をリストアップしておき、それ以外の値であればエラーとする。
- ブラックリスト方式
- 入力不可な値をリストアップしておき、その値に合致すればエラーとする。
今回の例で言えば、onmouseoverをリストに登録しておき、onmouseoverが入力値に出現したらエラーとするのがブラックリスト方式。しかしながら、ブラックリスト方式は漏れが出やすいのが欠点である(例えば、onmouseoutがリストから漏れてしまうと、脆弱性となる)。今回のケースでは、ホワイトリスト方式の方が、安全な実装が容易だと思う。
ちなみに、ホワイトリストとブラックリストに関する興味深い記事があった。ふむふむ。ホワイトリストとブラックリスト: ホワイトリスト方式の優位は神話 – 徳丸浩の日記(2008-07-16)