Yahoo知恵袋にXSS脆弱性がみつかったそうなので、原因を調べてみました

[`tweetmeme` not found]
[`evernote` not found]
このエントリーをはてなブックマークに追加
はてなブックマーク - Yahoo知恵袋にXSS脆弱性がみつかったそうなので、原因を調べてみました
Facebook にシェア
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`grow` not found]

下記のURLで脆弱性をテストすることができます。

<script>alert(“xss”);</script> これであなたもおしまいです。 – Yahoo!知恵袋

いったん表示させてリロードするか、ほかの知恵袋を見るたびにalertが表示されます。

このページ自体はアラートが表示されるだけですが、ほかのページを見ている場合や、悪意のあるページなどを表示すると危険ですので自己責任で確認しましょう。

 

XSS脆弱性は他人事じゃないのでソースを見てつらつらと考えてみました。

はき出されているHTMLはエスケープ処理はされていて、なんでalertがでるかなーと不思議。

image

どうやらLocalStrage領域に保存されているche_qa_view_historyがXSSの元凶になっていたようです。

Yahoo知恵袋では「あなたが最近見たQ&A」のタイトルを保存して、ページを表示する際にこのブロックに表示するようになっています。

image

このブロックですね。

 

ページタイトルをLocalStrageに保存する際に#quesのテキストから取得しているのですが、ここでエスケープ処理が解除されています。

http://detail.chiebukuro.yahoo.co.jp/common/history.jsの90行目付近です。

ページタイトルを「var title = $(‘#ques’).find(‘span’).text();」で取得しているのですが、text()で取得するとエスケープされた文字は解除されるようです。

 

このように、テキストとして取得されます。

image

 

では、どうやればXSSを防げるのか。text()ではなく、html()として取得すれば防げそうな気がします。

image

 

おお、良い感じにエスケープされていますね。コメント文もついてきましたが、タイトルを表示する分には消えてくれますので、よしとしましょう。

まとめ

  • Jqueryのtext()で取った値はエスケープされていないものになる
  • LocalStrageに保存したものをHTMLで表示するときにもXSS脆弱性に気をつけよう!

追記 2013/07/22 11:30

最近見たQ&Aの履歴ブロックが消され、history.jsも読み込まなくなっているようです。さすが対応が早いですね。

コメントを残す

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

CAPTCHA