はてなブログにあったセルフXSS 脆弱性"&'<<>\ Advent Calendar 2014 (19日目)
この記事は脆弱性"&'<<>\ Advent Calendar 2014の19日目の記事です。
前の記事はid:matsukawarさんのASPXのサイトのValidation機能からみるサイト攻撃ルート - matsukawarの日記です。
はてなブログの編集モードの一つに見たままモードというのが有り、そこにセルフXSSがあったので1年ほど前に報告しました。
はてなブログではyoutubeなどの別サイトの要素を読み込む場合iframeが使用されています。
そして、iframeのsrcはjavascript:
で始まるuriを書くとXSSが起こります。当時その対策として先頭がjavascript:
だったら置換する処理が書かれていたのですがそれが不十分でした。
html中に含まれる空白などはDOMが生成される際に無視されるためjava(空白)scirpt:
などが入力されるとセルフXSSとなりました。
”HTML編集”のタブで入力して、
”見たまま編集”のタブへ移動するとアラートが動作しました。
管理者画面上でのXSSでありますが、セルフXSS、つまりユーザが自分で入力する必要がある場所なので危険性としては通常のXSSよりも低いものです。
はてなブログにはリクエストパラメータにbody=
をつけることでURLの文字列を自動的に入れることもできるので、そちらも試してみたのですが途中でエスケープされるようでDom Based XSSとしては実行できないようでした。
HTML中で無視される文字列は色々パターンがある(XSS Filter Evasion Cheat Sheet - OWASP)ので、対策としては先頭をhttp://
かhttps://
に限定するのが最も簡単だと思います。
相対パスを取りたいときは、JavaScriptでリンク先URLがhttp/httpsか確認する方法 - 葉っぱ日記の記事のように一度aリンクを生成するのが良いようです。 はてなブログでは、一度適当なDOMを生成して、それにsrcを設定した後に危険であれば置換して、その後URLを取り出しているようです。
明日はにしむねあさんです。
追記:
http://t.co/PXMFO8DhTU これ自分も報告しててしばらく修正不完全で <!--> <tag> --> が通ったんだけど、今確認したら、そっちはtinymce側のアップデートで修正されてた
— mala (@bulkneets) December 24, 2014
更に追記:
malaさんの報告が去年の9月で、自分が報告したのが今年の2月だったのでduplicateだった様子。