被はてなブックマーク画像表示ページにXSS攻撃してみる。

HTML5, Webサービス, API, はてなブックマーク

09:05:12, by dozo Email , 168 words, 13887 views   Japanese (JP) del.icio.us

インジェクション系は軽く見てる人ほどかかりやすい。

(ノ・・)ン。。。。。。(((●コロコロッ

「dozoさんはブックマーク数表示しないんですか?(・ω・)」
「うん。XSS攻撃されるのがいやだから。(・∀・)」
「・・・(゜Д゜)」

アレ?(・ω・)
オレなんか変なこと言ったか?
オレの中では常識だったんだが。。




うちのサイトはb2evolution。
動的にページを生成するサイトである。
index.php以下はpathinfoのパラメータなので自由に記述ができる。
逆に言えばいつでも攻撃の対象となるわけで、
うっかりescapeし忘れるとあっという間にやられてしまうわけである。



被はてなブックマーク画像取得の仕様は
ブックマーク数を画像で取得するAPI
http://b.hatena.ne.jp/entry/image/エントリーのURL

という URL を指定すると、そのエントリーのブックマーク数を画像で取得することが可能です。

例えば http://d.hatena.ne.jp/ のブックマーク数を対象とした場合、
<img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/">

と記述することで と画像でブックマーク数を表示することができます。これにより、任意のウェブページにブックマーク数を表示させることが可能です。


となっている。
問題なのはAPIに渡すURL(URI).
<img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/">

通常こういったものを使用する時は以下のようにURLエンコードしていなければならない。
<img src="http://b.hatena.ne.jp/entry/image/http%3A%2F%2Fd.hatena.ne.jp">

が、URLエンコードした状態で使用すると、
被はてなブックマーク画像APIはちゃんと動かないのである。


ちょっと実験。
例えば以下のURI。
http://hain.jp/index.php/tech-j/2007/04/09/p140
ブックマーク数13(執筆当時)のぺーじなのだが、
これにエスケープありとエスケープ無しで被ブックマーク数画像を貼ってみる。
出力されたHTMLソースはこんな感じ。

<h5>はてブ画像XSS実験</h5>
エスケープあり:<br />
<img src="http://b.hatena.ne.jp/entry/image/http://hain.jp%2Findex.php%2Ftech-j%2F2007%2F04%2F09%2Fp140" alt="はてなブックマーク" />
エスケープ無し:<br />
<img src="http://b.hatena.ne.jp/entry/image/http://hain.jp/index.php/tech-j/2007/04/09/p140" alt="はてなブックマーク" />


結果は。
被はてなブックマーク画像表示ページにXSS攻撃してみる。
エスケープした方は動いていないことがわかる。



この状態でURIに細工をする。
こんな感じのURIでどうだろうか?
http://hain.jp/index.php/tech-j/2007/04/09/p140"/><b>hoge</b>
ブラウザはIE6。

結果は?






[More:]



被はてなブックマーク画像表示ページにXSS攻撃してみる。

Bタグが有効になり、hogeが太字で綺麗に表示されているのがわかる。
これがSCRIPTタグに変わったら。。。
なにもはてなブックマークに限ったことではなく、
URIを指定するAPIを使用していて、
なおかつエスケープ処理を怠った場合、全部該当する。

件数取得API使ってるから大丈夫だもん(・∀・)
と思っている人はちょっと待って欲しい。
件数取得のXMLRPCにも同じ事が言えるわけで、
通信の際にXMLを生成した時点で同様のことが発生するはず。
ライブラリもCDATAで送信されている場合もあるので、
必ずしもエスケープ処理はしていない。
自前でXMLを作っている人はさらに要注意だ。


単に埋め込まれるだけダロ(゜Д゜)?
と思うような人がターゲットだ。
私も最初はそう思ったが、
攻撃可能なアドレスをいろんな掲示板サイトなどで公開されたりすることも考えられる。
世の中HTMLについて知らない人の方が大半なわけで、
海外のよーわからんサーバやASPにページを一枚置いておき、
「女子○生○×△□」などのキャッチーなタイトルでXSSできるサイトにリンクを張るなり、iframeに埋め込むなりするだけでCookie位は楽勝で取れるだろう。


あの「はてな」が作ったんだから大丈夫だよ(・ω・)
などと思っている人は、
あるある見たから納豆を買う人と同じである。



このXSS攻撃の該当者はかなり少ないと思った。
条件は以下内容が全部該当するサイト。
  1. URIをなんらかのキーにして動的にページを生成するサイト
    (WordPress, P_BLOG等のブログ・CMS・Wikiツール、特にPHP製に多そう。)
  2. ページが存在しない時に表示されるエラーページにはてな画像を置いているサイト



追記:
ブログシステムに用意されているAPIを利用するという手がありました。
Wordpressではてなの被ブックマーク数を表示する方法
勉強になります。
APIなら各種エスケープ処理を施しているはずなので、
安全に使用できますね。
b2evolutionやdokuwikiでもページのURIを取得するAPIはあるはずなので、
それを使って設置してみようかと思います。


Trackback address for this post:

http://hain.jp/htsrv/trackback.php/145

Comments, Trackbacks:

Comment from: SES [Visitor]
ん~と、これはサイトのオーナーが自分のサイトに任意のタグを仕込むことが可能というだけの話ですよね。この脆弱性(?)を使って、一体誰が誰をどうやって攻撃できるんでしょうか??? 文章の煽り具合といい、はてなに対するFUDをばら撒くのが目的の記事ですか?
PermalinkPermalink 2007/05/09 @ 23:56
Comment from: student [Visitor]
>ページが存在しない時に表示されるエラーページにはてな画像を置いているサイト

がミソではないでしょうか。

通常、アクセスしたページのURLからこのブックマーク数の画像へのURLを自動的に引き渡すので、悪意のある存在しないURLにターゲットをアクセスさせればいいだけで、なにも攻撃者がHTMLを書き換える必要もない。
まぁ、エラー表示画面にリダイレクトさせるのが普通だとは思いますが、WEBアプリによっては、そのままのURL上にこの画像とエラー文を表示するものがあるかもしれませんね。
勉強になりました。
PermalinkPermalink 2007/05/14 @ 11:49

Leave a comment:

Your email address will not be displayed on this site.
Your URL will be displayed.

Allowed XHTML tags: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(Line breaks become <br />)
(Set cookies for name, email and url)
(Allow users to contact you through a message form (your email will NOT be displayed.))
This is a captcha-picture. It is used to prevent mass-access by robots.

Please enter the characters from the image above. (case insensitive)

powered by b2evolution

shinobi

Neighbors
Relative
Favorites

極論istの技術屋を始めて早幾年。 流れの速い業界の波にもまれながらも精一杯生きている様をとくとごらんあれ。

Archives
スポンサー

Latest bookmark
Search

Categories

Who's Online?
Misc
Syndicate this blog XML

Valid XHTML 1.0! Valid CSS! Valid RSS 2.0! Valid Atom 1.0!