ミニミニブログにCSRF脆弱性
前回に引き続き、はじめてのPHPプログラミング 基本編5.3対応のゆるいところ第三段は、本書に紹介されているミニミニブログにクロスサイト・リクエストフォージェリ(CSRF)脆弱性があるというものだ。
このミニミニブログは、BASIC認証を利用していて、twitterやwassrなどのように一行コメントが書き込めるというものだ。BASIC認証、投稿機能があればCSRF脆弱性の対策が必要だが、本書にはCSRFに対する解説は特にないので、調べるまでもなくCSRF脆弱性があるのだろうと思っていた。
しかし、人様の書籍に確認もしないで脆弱性指摘をするのも失礼なので、以下のように簡単な検証コードを書いて試してみた。
このミニミニブログは、BASIC認証を利用していて、twitterやwassrなどのように一行コメントが書き込めるというものだ。BASIC認証、投稿機能があればCSRF脆弱性の対策が必要だが、本書にはCSRFに対する解説は特にないので、調べるまでもなくCSRF脆弱性があるのだろうと思っていた。
しかし、人様の書籍に確認もしないで脆弱性指摘をするのも失礼なので、以下のように簡単な検証コードを書いて試してみた。
<html><body> <form action="http://localhost/hajimete_php5/miniblog/index.php" method="post"> <input type="hidden" name="input_text" value="こんにちはこんにちは、僕本当はPHP嫌いなんだ"> <input type="submit" value="投稿する"> </form> <script> document.forms[0].submit(); </script> </body></html>
ごらんのようになんのヒネリもないCSRFだが、あっさり動いた。現実にこれを悪用する場合は、非表示のiframe要素に埋め込むなどして、ユーザには見えないところで処理されるようにする(悪用禁止)。
[使用前]
[使用後]
CSRFは、他のXSSやSQLインジェクションとは異なり、意識的に対策しない限り混入してしまう。一方、XSSやSQLインジェクションは、「どんな文字に対しても正しく処理できるようにする」という意識があれば自然に脆弱性対策になるので、この点がCSRFに対する意識付けが重要な理由である。
だから、本書のような入門書であっても、CSRFの解説はして欲しいと思う。CSRFに対する啓蒙は重要だ。なにせ、ルータやファイアウォールのようなセキュリティ製品であってもCSRF脆弱性が珍しくないのだから。
なお対策としては、トークン埋め込みがよいと思うが詳しくは、「安全なウェブサイトの作り方」などを参照していただきたい。