[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
徳丸浩の日記
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対策は見たことがなく、ある意味興味深い。
本日の日記はツッコミ数の制限を越えています。
本日のリンク元
その他のリンク元
- https://www.google.co.jp/ ×144
- http://d.hatena.ne.jp/IwamotoTakashi/20100415/p1 ×54
- http://www.tokumaru.org/was/ ×30
- http://bakera.jp/ebi/topic/2986 ×10
- http://parashuto.com/rriver/tools/wordpress-3-0-4-... ×3
- http://www.tokumaru.org/ ×3
- https://www.google.com/ ×2
- http://t.co/zR07I1Xkif ×2
- http://www.nminoru.jp/~nminoru/unix/apache.html ×1
- http://www.sunorbit.net/sun_wobble.htm ×1
- https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&... ×1
- http://www.askapache.com/ ×1
- http://wiki.hamakor.org.il/index.php?title=מיוחד:ד... ×1
- http://search.smt.docomo.ne.jp/result?search_box=T... ×1
- http://search.smt.docomo.ne.jp/result?MT=Twitter 変... ×1
- http://parashuto.com/rriver/wordpress-tips/wordpre... ×1
- http://parashuto.com/ ×1
- http://d.hatena.ne.jp/IwamotoTakashi/touch/2010041... ×1
- http://bakera.jp/ebi/2007/9/2 ×1
- http://api.twitter.com/1/statuses/show/47677072901... ×1
検索
- クロスサイトスクリプト twitter ×2 / Twitterのクロスサイト・スクリプティング(XSS)対策は変だ ×1 / twitter クロスサイト ×1 / twitter クロスサイトスクリプティング ×1 / twiter クロスサイト ×1 / cross twitter ×1 / xss twitter ×1 / 検索画面 xss ×1 / クロススクリプト ツイッター ×1 / クロスサイト スクリプト twitter ×1 / クロスサイトスクリプティング データベース ×1 / htmlentities htmlspecialchars セミコロン ×1
[PR]小規模ECサイトに最適なWAF、SiteGuard Lite
HASHコンサルティング株式会社
最近の記事
- 2011年08月30日
- 1. RSSフィードをリダイレクトします
- 2011年07月01日
- 1.
- 2011年03月29日
- 1. PDO/MySQL(Windows版)の文字エンコーディング指定の不具合原因
- 2011年03月22日
- 1. PHP5.3.6からPDOの文字エンコーディング指定が可能となったがWindows版では不具合(脆弱性)あり
- 2011年01月27日
- 1. CSRF対策のトークンをワンタイムにしたら意図に反して脆弱になった実装例
- 2011年01月04日
- 1. escapeshellcmdの危険な実例
- 2011年01月01日
- 1. PHPのescapeshellcmdの危険性
- 2010年10月03日
- 1. 問題点の概要
- 2010年09月27日
- 1. 文字コードに起因する脆弱性を防ぐ「やや安全な」php.ini設定
- 2010年07月25日
- 1. ツッコミSPAM対策で、ツッコミ抜きのRSSフィードを用意しました
- 2010年07月01日
- 1. ぼくがPDOを採用しなかったわけ(Shift_JISによるSQLインジェクション)
- 2010年04月06日
- 1. PROXY(プロキシ)経由でのDNSリバインディングと対策
- 2010年04月05日
- 1. JavaアプレットのDNSリバインディングはJRE側で対策済みだった
- 2010年03月29日
- 1. DNSリバインディングによる無線LANパスフレーズの読み出しに成功
- 2010年03月25日
- 1. DNSリバインディングによるルータへの侵入実験
- 2010年02月22日
- 1. ケータイtwitter(twtr.jp)においてDNS Rebinding攻撃に対する脆弱性を発見・通報し、即座に修正された
- 2010年02月12日
- 1. かんたんログイン手法の脆弱性に対する責任は誰にあるのか
- 2010年01月18日
- 1. iモードブラウザ2.0のXMLHttpRequestでPOSTデータの扱いが困難になった
- 2009年10月19日
- 1. quoteメソッドの数値データ対応を検証する
- 2009年10月14日
- 1. htmlspecialchars/htmlentitiesはBMP外の文字を正しく扱えない
- 2009年10月09日
- 1. htmlspecialcharsのShift_JISチェック漏れによるXSS回避策
- 2009年09月30日
- 1. htmlspecialcharsは不正な文字エンコーディングをどこまでチェックするか
- 2009年09月24日
- 1. SQLの暗黙の型変換はワナがいっぱい
- 2009年09月18日
- 1. 文字エンコーディングバリデーションは自動化が望ましい
- 2009年09月14日
- 1. 既にあたり前になりつつある文字エンコーディングバリデーション
- 2009年08月05日
- 1. 携帯JavaScriptとXSSの組み合わせによる「かんたんログイン」なりすましの可能性
- 2009年03月28日
- 1. IPAは脆弱性の呼び方を統一して欲しい
- 2009年03月27日
- 2009年03月11日
- 1. U+00A5を用いたXSSの可能性
- 2008年12月22日
- 1. JavaとMySQLの組み合わせでUnicodeのU+00A5を用いたSQLインジェクションの可能性
& のエスケープですが、HTMLの文字参照になっている場合はエスケープしないという仕様のようです。&foo; とかすると &foo; になります。「"」「'」についてはブログなどの本文部分でも(tDiaryでも)エスケープしないのが普通じゃないでしょうか? twitter の仕様として妥当かどうかは疑問ですけど…
rnaさん、ツッコミありがとうございます。&のエスケープの件、ありがとうございます。そういうことですか。しかし、一貫性がなくて表示がおかしくなる点は問題ですよね。「'」と「"」は、属性値もエスケープされていない箇所がありまして、あやうくXSSかという感じです。