XSSによる攻撃(その4)

一問飛ばしてた…

問題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欄に好きな色の名前を入れてみる。

f:id:GOLEM-XIV:20100531232844p:image

すると、Home画面のユーザー名が、入力した色で表示される。

f:id:GOLEM-XIV:20100531232845p:image

これは、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)の上をマウスが通過するとダイアログが表示され、スクリプトの埋め込みに成功したことがわかる。

f:id:GOLEM-XIV:20100531233944p:image

解決方法

今回の場合、タグのエスケープ処理では防ぐことができない。今回の例では、<や>のタグを使用していない。

そもそも、今回の場合、Colorの欄にColor以外の値を入れられることが問題。よって、入力可能な値(”RED”などの特定色名や、”#FF0000″など)であるかをプログラム中でチェックし、入力可能な値でなければ、エラーとする。(ホワイトリスト方式)

補足1 ホワイトリスト方式とブラックリスト方式

入力値をチェックするには、大きく以下の2通りが存在する。

ホワイトリスト方式
入力可能な値をリストアップしておき、それ以外の値であればエラーとする。
ブラックリスト方式
入力不可な値をリストアップしておき、その値に合致すればエラーとする。

今回の例で言えば、onmouseoverをリストに登録しておき、onmouseoverが入力値に出現したらエラーとするのがブラックリスト方式。しかしながら、ブラックリスト方式は漏れが出やすいのが欠点である(例えば、onmouseoutがリストから漏れてしまうと、脆弱性となる)。今回のケースでは、ホワイトリスト方式の方が、安全な実装が容易だと思う。

ちなみに、ホワイトリストとブラックリストに関する興味深い記事があった。ふむふむ。ホワイトリストとブラックリスト: ホワイトリスト方式の優位は神話 – 徳丸浩の日記(2008-07-16)

コメントを残す

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