前提
CSRF攻撃対策について調べています。
前提として以下を仮定します
- a.com は攻撃者の管理下にあるWebサイト
- b.com は攻撃対象の掲示板Webサイト
攻撃シナリオ
- 攻撃者が a.com に以下スクリプトを追加する
js
1const formData = new FormData(); 2formData.append("message", "hello"); 3 4await fetch('https://b.com/post', { 5 metho: 'post', 6 data: formData 7})
2 ユーザーがa.comにアクセスする
3. (1)のスクリプトが実行される
4. b.comにhello
が書き込まれる
質問
画像引用元: https://tech.basicinc.jp/articles/231
上記画像について、「攻撃者はトークンを知ることができない」と書いています。
しかし、攻撃シナリオの1を以下の様に変更した場合、トークンを知ることが可能になり、攻撃が成立するのではないでしょうか?
該当のソースコード
js
1// トークンを取得する 2const response = await fetch('https://b.com/') 3const html = await response.text() 4// 正規表現やDOMセレクタを利用してトークンを取得する 5const csrfToken = html.getCSRFToken() 6 7const formData = new FormData(); 8formData.append("message", "hello"); 9// CSRFトークンを追加する 10formData.append("csrfToken ", csrfToken); 11 12await fetch('https://b.com/post', { 13 metho: 'post', 14 data: formData 15})
試したこと
a.com を localhost:80、b.com を localhost:81 としてローカル環境で試してみました。
しかし、Google ChromeではCORSの問題が発生して実際に攻撃は成功しませんでした。
(こちらはまた別問題な気がするので、質問が複雑にならないように今は問題を保留します。)
本来であれば「単純リクエスト」に該当するので、GETでCSRFトークンが取得できてしまうと思います。
https://developer.mozilla.org/ja/docs/Web/HTTP/CORS#%E5%8D%98%E7%B4%94%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88
補足情報(FW/ツールのバージョンなど)
- Google Chrome 121.0.6167.161
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/02/12 16:57 編集
2024/02/13 01:21 編集
2024/02/13 01:13
2024/02/14 13:25 編集
2024/02/14 23:50
2024/02/15 14:34