インジェクション系は軽く見てる人ほどかかりやすい。
(ノ・・)ン。。。。。。(((●コロコロッ
「dozoさんはブックマーク数表示しないんですか?(・ω・)」
「うん。XSS攻撃されるのがいやだから。(・∀・)」
「・・・(゜Д゜)」
アレ?(・ω・)
オレなんか変なこと言ったか?
オレの中では常識だったんだが。。
うちのサイトはb2evolution。
動的にページを生成するサイトである。
index.php以下はpathinfoのパラメータなので自由に記述ができる。
逆に言えばいつでも攻撃の対象となるわけで、
うっかりescapeし忘れるとあっという間にやられてしまうわけである。
被はてなブックマーク画像取得の仕様は
となっている。
問題なのはAPIに渡すURL(URI).
通常こういったものを使用する時は以下のように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="はてなブックマーク" />
結果は。

エスケープした方は動いていないことがわかる。
この状態でURIに細工をする。
こんな感じのURIでどうだろうか?
http://hain.jp/index.php/tech-j/2007/04/09/p140"/><b>hoge</b>
ブラウザはIE6。
結果は?
[More:]
Bタグが有効になり、hogeが太字で綺麗に表示されているのがわかる。
これがSCRIPTタグに変わったら。。。
なにもはてなブックマークに限ったことではなく、
URIを指定するAPIを使用していて、
なおかつエスケープ処理を怠った場合、全部該当する。
件数取得API使ってるから大丈夫だもん(・∀・)
と思っている人はちょっと待って欲しい。
件数取得のXMLRPCにも同じ事が言えるわけで、
通信の際にXMLを生成した時点で同様のことが発生するはず。
ライブラリもCDATAで送信されている場合もあるので、
必ずしもエスケープ処理はしていない。
自前でXMLを作っている人はさらに要注意だ。
単に埋め込まれるだけダロ(゜Д゜)?
と思うような人がターゲットだ。
私も最初はそう思ったが、
攻撃可能なアドレスをいろんな掲示板サイトなどで公開されたりすることも考えられる。
世の中HTMLについて知らない人の方が大半なわけで、
海外のよーわからんサーバやASPにページを一枚置いておき、
「女子○生○×△□」などのキャッチーなタイトルでXSSできるサイトにリンクを張るなり、iframeに埋め込むなりするだけでCookie位は楽勝で取れるだろう。
あの「はてな」が作ったんだから大丈夫だよ(・ω・)
などと思っている人は、
あるある見たから納豆を買う人と同じである。
このXSS攻撃の該当者はかなり少ないと思った。
条件は以下内容が全部該当するサイト。
- URIをなんらかのキーにして動的にページを生成するサイト
(WordPress, P_BLOG等のブログ・CMS・Wikiツール、特にPHP製に多そう。) - ページが存在しない時に表示されるエラーページにはてな画像を置いているサイト
追記:
ブログシステムに用意されているAPIを利用するという手がありました。
Wordpressではてなの被ブックマーク数を表示する方法
勉強になります。
APIなら各種エスケープ処理を施しているはずなので、
安全に使用できますね。
b2evolutionやdokuwikiでもページのURIを取得するAPIはあるはずなので、
それを使って設置してみようかと思います。