クロスサイトリクエストフォージェリの続きです。
今回の話は、Mixiに常時ログインできるようになっていないとうまくいきません。
ニコニコ動画の右上あたりに、ブログに貼り付けボタンがあります。
<OPTION value=mixi|http://mixi.jp/favicon.ico|http://mixi.jp/proxy_post_video.pl?pid=NC&vid=sm9&video_title=%E6%96%B0%E3%83%BB%E8%B1%AA%E8%A1%80%E5%AF%BA%E4%B8%80%E6%97%8F%20-%E7%85%A9%E6%82%A9%E8%A7%A3%E6%94%BE%20-%20%E3%83%AC%E3%83%83%E3%83%84%E3%82%B4%E3%83%BC%EF%BC%81%E9%99%B0%E9%99%BD%E5%B8%AB selected>mixi</OPTION>
ちょっと試してみましょう。
ブラウザのURLに、
http://mixi.jp/proxy_post_video.pl?pid=NC&vid=sm9&video_title=%E6%96%B0%E3%83%BB%E8%B1%AA%E8%A1%80%E5%AF%BA%E4%B8%80%E6%97%8F%20-%E7%85%A9%E6%82%A9%E8%A7%A3%E6%94%BE%20-%20%E3%83%AC%E3%83%83%E3%83%84%E3%82%B4%E3%83%BC%EF%BC%81%E9%99%B0%E9%99%BD%E5%B8%AB
見事、新規日記の本文に内容が書き込まれています。
勿論ニコニコ動画はMixiのアカウント情報など知りませんし、URLにもそのようなものはありません。
URLを見るとproxy_post_video.plにパラメータを渡せばいいようです。
通常日記を書くのはadd_diary.plですから、外部からパラメータを送信すれば新たな日記を作成するようなプログラムを作成したようです。
かつてMixiには、外部から簡単に日記を作成できるというCSRF脆弱性そのものが存在していました。
http://www.atmarkit.co.jp/fsecurity/column/ueno/33.html
現在は対処されているということになっています。
どのように対策されているのでしょう。
通常日記を書くときの流れを順番に見てみましょう。
まず最初の日記を書くリンク。
<a href="http://mixi.jp/add_diary.pl?id=9999999">日記を書く</a>
普通にリンクが張ってあるだけです。
試しにIDを書き換えてみるとアクセスできません。
内部的にセッションで監視しているようです。
次に日記作成画面。
<form name="diary" method="post" enctype="multipart/form-data" action="add_diary.pl"> <input type="hidden" name="news_id" value=""> <input type="hidden" name="campaign_id" value=""> <input type="hidden" name="invite_campaign" value=""> <input type="hidden" name="id" value="9999999"> <input type="hidden" name="news_title" value=""> <input type="hidden" name="news_url" value=""> <input type="hidden" name="movie_id" value=""> <input type="hidden" name="movie_title" value=""> <input type="hidden" name="movie_url" value=""> <input type=hidden name=submit value=main> <input value="" name="diary_title" class="editareaWidth" size="40" /> <textarea name="diary_body" cols="65" rows="20" id="diaryBody"></textarea> <input type="file" size="40" name="photo1" /> <input type="file" size="40" name="photo2" /> <input type="file" size="40" name="photo3" /> <input type="checkbox" name="orig_size" checked="checked" id="origSize" /> <select NAME=tag_id><optgroup label="標準の公開設定"><option value="0" selected>全体に公開</option></optgroup><optgroup label="個別の公開設定"><option value="1" >非公開</option><option value="2" >友人まで公開</option><option value="3" >友人の友人まで公開</option><option value="4" >全体に公開</option></optgroup></select> <input type="submit" class="formBt01" value="入力内容を確認する" /> |
よくわからないパラメータがたくさんありますが、重要なのはdiary_titleとdiary_body、そしてtag_idでしょうか。
よく見ると送信先がadd_diary.plと、最初のURLと同じになっています。
いずれかのパラメータで振り分けているのでしょう。
次に送信確認画面です。
<form action="add_diary.pl" method="post"> <input type="hidden" name="submit" value="confirm" /> <input type="hidden" name="packed" value="" /> <input type="hidden" name="post_key" value="123456789abcdef0123456789abcdef0" /> <input type="hidden" name="news_id" value="" /> <input type="hidden" name="campaign_id" value="" /> <input type="hidden" name="invite_campaign" value=""> <input type="hidden" name="id" value="9999999" /> <input type="hidden" name="diary_title" value="タイトル" /> <input type="hidden" name="diary_body" value="本文" /> <input type="hidden" name="news_title" value="" /> <input type="hidden" name="news_url" value="" /> <input type="hidden" name="movie_id" value="" /> <input type="hidden" name="movie_title" value="" /> <input type="hidden" name="movie_url" value="" /> <input type="hidden" name="tag_id" value="0" /> <input type="submit" class="formBt01" value="作成する" /> </form> |
<input type=hidden name=submit value=main>
<input type="hidden" name="submit" value="confirm" />
名前からしてこのパラメータが怪しいですね。
内部的にここで振り分けていると思って間違いないでしょう。
では試してみましょう。
上のソースをメモ帳に貼り付けて、action="http://mixi.jp/add_diary.pl"と書き換えます。
ボタンを押すと、文字化けこそしていますが見事に日記が作成されました。
というわけで外部から日記を一気に書き込む条件がわかりました。
以上のパラメータを適切に設定してやればよいということになります。
同時にMixiのCSRF対策が判明しました。
submit=confirmのとき、すなわち日記作成の確定処理の際に、正しいidとpost_keyを一緒に送信しないといけないようにしてあります。
試しにどちらかを変更すると、日記の作成に失敗してしまいます。
現在のMixiに対してCSRFを行うためには、何処からかidとpost_keyを取得してこなければなりません。
さて、これを一体どうすればいいでしょうか。
リンクで飛んだ先から、リンクを踏んだ者のidを取得するのはちょっと困難です。
そのリンクを貼っている者のidは簡単に取得できますがあまり意味がありません。
ましてやpost_keyなどどうやって取得したものか。
cookieさえ覗ければ簡単ですが、Mixiで取得したcookieは、通常Mixi以外に開示されることはありません。
ちょっと現在の技術力では手の出しようがないみたいです。
なにやらCSRFの説明というよりMixiの穴探しになりましたが、CSRF対策を忘れるとどうなるか、そしてCSRF対策の方法はなんとなくわかったのではないでしょうか。