| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2007-08-29 TwitterのXSS対策は変だ
● Twitterのクロスサイト・スクリプティング(XSS)対策は変だ
Twitterが流行している。私もヘビーユーザとは言えないものの、結構愛用している(http://twitter.com/ockeghem)。このTwitterのXSS対策が変だなと思う事象があったので報告する。
あらかじめお断りしておくが、TwitterにXSS脆弱性がある(実際にはあったようだが)という報告ではなく、対策の方法がおかしいという報告である。
まずは、どうも変だと思うようになった事例を紹介する。
事例1 モバイル版の二重エスケイプ
私は主に、通勤などの移動中に、W-Zero3で閲覧・書き込みしている。モバイル版(http://m.twitter.com/)を主に利用しているが、「<」などの記号が二重にエスケープされていることに気がついた。
twitter.comでの表示

m.twitter.comでの表示

事例2 検索画面が変
「Find&Invite」という機能でお友達候補を検索できるのだが、この機能が変だ。「lt」という単語で検索すると、「<」がヒットする。検索結果の例を下図に示す(私のプロファイル)。

しかしこの表示は実はおかしくて、私のプロファイルは実際には下図のように設定されているのだ。

すなわち、ltで検索すると、「<」がヒットされていることになる。そして、ネタばれのように、検索結果表示では「<」の部分が「<」と表示される。
3.事例3 文字数制限が変
Twitterの氏名欄(Full Name)は20文字までという制限になっているが、「<」などの文字を使うと、より少ない文字しか入らない。ここで、「<1234567890123>」という15文字の名前を入れてみる。
すると、下図のように、「<1234567890123>」というように文字列が化けてしまう。

おそらく、内部的には「<1234567890123>」と格納しようとしたものの、これだと21文字になるので、末尾のセミコロンが削除されてしまったのだろう。
結論:Twitterは、HTMLエスケープされた状態で情報を保存している
もういいだろう。ソースを確認したわけではないが、これだけ状況証拠があれば十分だ。TwitterはHTMLエスケープされた文字列をDBに保存していることは間違いない。しかし、この方法は間違っている。HTML表示する直前にHTMLエスケープするという原則に反しているからだが、その結果として、上記に見るような悪影響が出ている。設計ミスというほかないだろう。
さて、文字列をHTMLエスケープされた状態で保存したために悪影響が出ていることは報告の通りだが、この方法のメリットはあるだろうか?一つ思いつくことは、DB格納の段階でまとめてHTMLエスケープすることにより、HTMLのエスケープもれによるXSS脆弱性が発生することを防ぎたかったのかもしれない。
しかしながら、この方法ではかえってXSS脆弱性を招きやすいと私は思う。DBの値はエスケープ済みだが、画面からの入力値(などDB以外の値)はエスケープされていない。両者が混在することによって、エスケープすべきものとしなくてよいものの区別が煩雑になり、結果としてXSS脆弱性が発生しやすくなると思われる。現実問題、TwitterではXSS脆弱性が報告されているようである。
TwitterのXSS対策はサニタイズではなくエスケープという正しい方法を使っているが、エスケープする場所がよくなかった。Twitterそのものの改良も期待するが、読者が抱えるプロジェクトのセキュリティ対策の参考になれば幸いである。
追記(2007/08/29 19:30)
<と>以外の記号について調べると、「&」、「"」、「'」については何もエスケープされていないことが分かった。ひどい仕様だ。このため、画面から「<」と入力すると、これらの記号はそのままDBに入り、そのまま表示されるので、「<」に文字化けする。その他、XSSになりそうな爆弾もありそうだ。
twitter.comのようなアドホックなXSS対策は見たことがなく、ある意味興味深い。
[TrackBack URL: http://www.tokumaru.org/d/tb.rb/20070829]
本日のリンク元
その他のリンク元
- http://www.pluto.dti.ne.jp/~rinou/ ×268
- http://bakera.jp/ebi/topic/2986 ×215
- http://www.tokumaru.org/ ×142
- http://b.hatena.ne.jp/HiromitsuTakagi/ ×93
- http://bakera.jp/ebi ×50
- http://b.hatena.ne.jp/HiromitsuTakagi/20070901 ×47
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×37
- http://d.hatena.ne.jp/tessy/20070827/1188221438 ×30
- http://d.hatena.ne.jp/tessy/ ×22
- http://b.hatena.ne.jp/ockeghem/ ×14
- http://b.hatena.ne.jp/HiromitsuTakagi/?of=20 ×10
- http://bakera.jp/ebi/2007/9 ×7
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×6
- http://bakera.jp/ebi/2007/9/2 ×6
- http://feed-tv.com/know94space/play ×6
- http://d.hatena.ne.jp/tessy/20070902/1188727522 ×5
- http://b.hatena.ne.jp/t/これはひどい ×5
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×5
- http://d.hatena.ne.jp/tessy/20070827 ×5
- http://b.hatena.ne.jp/t/twitter ×4
- http://b.hatena.ne.jp/entrylist?sort=hot&of=100&th... ×4
- http://b.hatena.ne.jp/HiromitsuTakagi/セキュリティ/ ×4
- http://d.hatena.ne.jp/hosu/20070830 ×4
- http://a.hatena.ne.jp/harupu/ ×4
- http://a.hatena.ne.jp/ockeghem/ ×4
- http://d.hatena.ne.jp/ockeghem/20070528 ×3
- http://b.hatena.ne.jp/HiromitsuTakagi/XSS/ ×3
- http://d.hatena.ne.jp/otsune/ ×3
- http://www.pluto.dti.ne.jp/rinou/ ×3
- http://b.hatena.ne.jp/keyword/XSS脆弱性 ×3
- http://avemaria.livedoor.biz/archives/50696168.htm... ×3
- http://fastladder.com/subscribe/http://www.tokumar... ×3
- http://clip.livedoor.com/clips/poolmmjp ×3
- http://xn--n8j3a4dxap8m.gaasuu.com/entry/1581 ×3
- http://b.hatena.ne.jp/entrylist?sort=hot&of=50&thr... ×3
- http://d.hatena.ne.jp/ockeghem/about ×3
- http://www.pluto.dti.ne.jp/rinou/saji/200708.html ×3
- http://b.hatena.ne.jp/entry/5151918 ×2
- http://b.hatena.ne.jp/HiromitsuTakagi/?of=180 ×2
- http://www.tokumaru.org ×2
- http://del.icio.us/fujiwara/security ×2
- http://b.hatena.ne.jp/otsune/ ×2
- http://d.hatena.ne.jp/ockeghem/20070528/1180387214... ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=150&th... ×2
- http://www.pluto.dti.ne.jp/~rinou/index.html ×2
- http://b.hatena.ne.jp/KAZUMiX/favorite ×2
- http://b.hatena.ne.jp/TAKESAKO/イメージファイト/ ×2
- http://dragon.jp/column/archives/cookie.html ×2
- http://b.hatena.ne.jp/otsune/20070902 ×2
- http://labs.ceek.jp/hbnews/ ×2
- http://b.hatena.ne.jp/Kanatoko/favorite ×2
- http://labs.cybozu.co.jp/blog/takesako/2007/08/lls... ×2
- http://b.hatena.ne.jp/entrylist?sort=hot&of=200&th... ×2
- http://reader.livedoor.com/subscribe/http://www.to... ×2
- http://reader.livedoor.com/subscribe/http://www.to... ×2
- http://b.hatena.ne.jp/keyword/サニタイズ ×2
- http://b.hatena.ne.jp/rna/ ×2
- http://www.tokumaru.org/was/ ×2
- http://reader.livedoor.com/ranking/hot.html ×2
- http://d.hatena.ne.jp/keyword/XSS脆弱性 ×2
- http://xn--n8j3a4dxap8m.gaasuu.com/upcoming/page/3... ×1
- http://momegoto.g.hatena.ne.jp/ ×1
- http://wafful.org/mod_imagefight/mod_imagefight.c ×1
- http://r.hatena.ne.jp/pero1/セキュリティ/ ×1
- http://hsj.jp/index.html ×1
- http://buzzurl.jp/entry/http://www.tokumaru.org/d/... ×1
- http://clip.livedoor.com/clips/poolmmjp?p=1 ×1
- http://tokumaru.org/ ×1
- http://twitter.com/ockeghem?page=2 ×1
- http://www.tokumaru.org/index.html ×1
- http://labs.ceek.jp/hbnews/list.cgi ×1
- http://www.tokumaru.org/index.htm ×1
- http://d.hatena.ne.jp/hnw/20070530 ×1
- http://twitter.com/ockeghem ×1
- http://tokumaru.org/was/ ×1
- http://s.luna.tv/search.aspx?q=HTML 属性値 エスケープ&st=2... ×1
- http://labs.ceek.jp/hbnews/list.cgi?p=2&c=1 ×1
- http://d.hatena.ne.jp/ockeghem/?of=5 ×1
- http://search.live.com/spresults.aspx?q=XSS対策&form... ×1
- http://del.icio.us/bis.cu.it ×1
- http://d.hatena.ne.jp/ockeghem/20070827/1188225663... ×1
- http://xn--n8j3a4dxap8m.gaasuu.com/tag/xss ×1
- http://b.hatena.ne.jp/yocchan731/favorite ×1
- http://xn--n8j3a4dxap8m.gaasuu.com/user/HiromitsuT... ×1
- http://d.hatena.ne.jp/ockeghem/20070224 ×1
- http://www.pluto.dti.ne.jp/~rinou/saji/200708.html... ×1
- http://d.hatena.ne.jp/tessy/?of=45 ×1
- http://nogue.cocolog-nifty.com/diary/ ×1
- http://r.hatena.ne.jp/NSR250R-SP/受信箱/ ×1
- http://del.icio.us/otsune?setcount=100 ×1
- http://labs.ceek.jp/hbnews/list.cgi?p=1&c=0 ×1
- http://bon.sagool.jp/user/nazoking/hot?of=40 ×1
- http://labs.ceek.jp/hbnews/list.cgi?k=5&p=1&c=0 ×1
- http://www.tokumaru.org/d/20070829.html ×1
- http://hsj.jp/junknews/ ×1
- http://d.hatena.ne.jp/tessy/200708 ×1
- http://b.hatena.ne.jp/wata_d/favorite ×1
- http://clip.livedoor.com/recent/?p=5 ×1
- http://r.hatena.ne.jp/Kur/ ×1
- http://d.hatena.ne.jp/teracc/20070715 ×1
検索
- XSS対策 ×17 / XSS 対策 ×15 / XSS ×12 / xss ×10 / xss 対策 ×8 / xss対策 ×8 / クロスサイトスクリプティング 対策 ×5 / 徳丸 XSS ×4 / 徳丸 浩 ×3 / twitter ×3 / XSS エスケープ ×3 / mod_imagefight ×2 / twitter html表示 ×2 / 徳丸浩 ×2 / IEEE754 ×2 / クロスサイトスクリプティング 事例 ×2 / クロス サイト スクリプティング 対策 ×2 / 徳丸 金床 ×2 / クロスサイトスクリプティング エスケープ ×2 / サニタイズ ×2 / HTML "&" xss ×2 / 画像 javascript xss ×2 / twitter 文字化け ×2 / twitter XSS ×2 / ruby 文字列 エスケープ ×1 / サニタイズ言うな ×1 / エスケープ html 状態 ×1 / 二重にエスケープ ×1 / web サイト クロスサイトスクリプティング 脆弱性 ある web アプリケーション ×1 / 画像 xss サニタイズ ×1 / twitter クロスサイト ×1 / csrf 対策 apache ×1 / HTML エスケープ & ×1 / XSS 方法 ×1 / XSS ruby 対策 ×1 / twitter エスケープ ×1 / クロスサイトスクリプティング 対策方法 ×1 / xss 脆弱性 対策 ×1 / xss エスケープ ×1 / クロスサイト 20文字 ×1 / xss 徳丸 ×1 / hnw php round ×1 / m.twitter.com 文字化け ×1 / XSS 二重エスケープ ×1 / xss対策 ×1 / 画像ファイルにPHP攻撃コード ×1 / ieee754 仮数部 ×1 / ただし3の倍数のときは数の代わりに「Fizz」と ×1 / パディング C言語 ソース ×1 / サニタイズではなくエスケープ ×1 / エスケープ 脆弱性 ×1 / 文字参照 クロスサイト ×1 / SQLインジェクション 文字数制限 ×1 / XSS脆弱性 対策 ×1 / XSS 文字参照 ×1 / xss対策 記号 サニタイズ ×1 / クロスサイトスクリプティング対策 ×1 / 1から100までの数をプリントするプログラムを書け ×1 / Ruby エスケープしない ×1 / XSS セミコロン ×1 / クロスサイトスクリプティング 記号 lt ×1 / Twitter 脆弱性 ×1 / クロスサイトスクリプティング エスケープ & ×1 / html 文字参照 javascript エスケープ ×1 / 文字列をHTMLエスケープ ×1 / アプリケーション 権限管理 ×1 / twitter 文字数 制限 ×1 / xss w-zero3 ×1 / セミコロン エスケープ HTML ×1 / XSS対策 エスケープ ×1 / クロスサイト ブログ ×1 / tdiary エスケープ < ×1 / SQLインジェクション 対策 ×1 / XSS 脆弱性 検証 ×1 / '&のエスケープ' ×1 / xss対策 サニタイズ ×1 / SQL &のエスケープ ×1 / twitter xss ×1 / twitter db ×1 / お稽古 ×1 / 徳丸浩の日記 ×1 / tDiary Twitter "[日記]" ×1 / エスケープ SQL Server 方法 ×1 / 徳丸浩の日記 - 恐ろしい毒 - IEEE754のとりうる整数の範囲 ×1 / xss 脆弱性 対策 ×1 / XSS htmlエスケープ ×1 / tdiary htmlエスケープ ×1 / HTML 入力 XSS対策 ×1 / sql エスケープ "&" ×1 / エスケープしない html ×1 / IEEE-754 ×1 / xss 対策 ×1 / DB保存 エスケープ ×1 / XSS 対策 エスケープ ×1 / HTMLのescape ×1 / エスケープ 二重 ×1 / twitter 文字制限 ×1 / perl 有効桁数 ×1 / csrf対策 本 ×1 / JavaScript jpeg 画像 ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
& のエスケープですが、HTMLの文字参照になっている場合はエスケープしないという仕様のようです。&foo; とかすると &foo; になります。「"」「'」についてはブログなどの本文部分でも(tDiaryでも)エスケープしないのが普通じゃないでしょうか? twitter の仕様として妥当かどうかは疑問ですけど…
rnaさん、ツッコミありがとうございます。&のエスケープの件、ありがとうございます。そういうことですか。しかし、一貫性がなくて表示がおかしくなる点は問題ですよね。「'」と「"」は、属性値もエスケープされていない箇所がありまして、あやうくXSSかという感じです。