自分だけのクイズを作成しよう - Quipha
スポンサーリンク

【OWASP ZAP】CSRF対策ページに脆弱性診断

ツール他

当サイトではアフィリエイト広告を利用しています。

スポンサーリンク

はじめに

今回は、CSRFの対策を行っているサイトに対して、OWASP ZAPを利用して脆弱性診断を行います。
そのための設定や、実際に攻撃を行い動作確認を行いました。

OWASP ZAPのインストール方法や、基本的な使い方は以下にまとめましたのでご覧ください。

脆弱性の危険性を試した記事を以前まとめましたので、あわせてご覧ください。

Mac版のOWASP ZAPについては以下の記事をご覧ください。
本記事ではWindows版で解説していますが、使い方はMac版でも同様です。

動作環境
  • ホスト端末:Windows 10
  • OWASP ZAP 2.11.0

他にも私のブログで、ツールについて解説している記事がありますのでご覧ください。

CSRFとは

CSRFとはクロスサイトリクエストフォージェリの略で、脆弱性の一種です。
例えば、利用者が悪意のあるサイトにアクセスし、外部サイトに意図しないリクエストを送信されてしまう場合があります。

利用者が掲示板に、意図しない投稿をさせられた事件がありました。
サイト側がCSRFの対策が行われていないためでした。
(「ぼくはまちちゃん」 騒動など)

パソコン遠隔操作事件 - Wikipedia

CSRFの詳細については、IPAのサイトをご覧ください。
仕組みなどが理解できると思います。

安全なウェブサイトの作り方 - 1.6 CSRF(クロスサイト・リクエスト・フォージェリ) | 情報セキュリティ | IPA 独立行政法人 情報処理推進機構
情報処理推進機構(IPA)の「安全なウェブサイトの作り方 - 1.6 CSRF(クロスサイト・リクエスト・フォージェリ)」に関する情報です。

この対策が行われているサイトに対しては、都度生成されるトークンを利用し正規の送信か判断しており、OWASP ZAPで脆弱性診断を行う場合、設定を行う必要があります。

スポンサーリンク

OWASP ZAPの設定

対象サイト

今回は、Laravelで簡単なフォームを作成しました。
以下の記事で作成したフォームを利用します。

テンプレートファイルにフォームを用意します。

<html>
<body>
    <form method="POST" action="{{ route('login-result') }}">
        @csrf
        <input type="text" name="id" placeholder="ID"><br>
        <input type="text" name="password" placeholder="PASSWORD"><br>
        <input type="submit" value="ログイン">
    </form>
</body>
</html>

実際にブラウザでアクセスして、HTMLタグを確認します。
Laravelは自動でCSRFのトークンをフォームに挿入します。(_tokenという隠しパラメータ)

<html>
<body>
    <form method="POST" action="http://192.168.0.14:8000/login">
        <input type="hidden" name="_token" value="ZGpBv7i2MakcH82xqR9Nz5d6HPkO1NWjOOIpv6yl">
        <input type="text" name="login_id" placeholder="ID"><br>
        <input type="text" name="password" placeholder="PASSWORD"><br>
        <input type="submit" value="ログイン">
    </form>
</body>
</html>

画面を開いてSubmitボタンをクリックすれば、問題なくリクエストを送信できます。

もし不正なトークンを送信した場合は、LaravelのCSRF対策に弾かれ、レスポンスコード:419が返却されます。

設定

OWASP ZAPのオプションを開きます。

アンチCSRFトークンを開きます。
対象サイトでは、「_token」という名前のパラメータでしたので、トークンを追加します。
デフォルトで追加されていました。もし一覧にトークンがない場合は、追加しましょう。

設定画面に「現在はフォーム(FORM)パラメータトークンのみがサポート対象です」と記載がありました。
フォームの中のトークンについては対応してくれると思いますが、おそらくヘッダーに埋め込んだトークンなどは対応していないという意味だと思います。(例えばAjaxでカスタムヘッダーにX-CSRF-TOKENを追加してCSRF対策を行うなど)
どうしてもうまく行かない場合は、一時的にCSRF対策を無効にして、脆弱性診断を行うしか無いと思います。

次に動的スキャンを開きます。
「Handle anti-CSRF tokens.」にチェックが入っていることを確認します。

ちなみに、v2.10.0では「アンチCSRFトークン利用(テスト実装)」となっていました。
新しいバージョンでは実装が正式に採用されたようですね。

CSRF対策ページに攻撃

それでは攻撃を行ってみましょう。
CSRF対策されているPOSTリクエストに対して動的スキャンを行いました。

GETリクエストと、POSTリクエストが交互に呼ばれていました。
POSTリクエストのステータスコードが、「200 OK」で返って来ていますので成功しています。

GETリクエストのレスポンスを確認します。
一度GETでレスポンスを受け取り、新しいトークンを取得しているのが分かります。

今度は、POSTデータのリクエストの中身を確認しましょう。
送信データに含まれるトークンが、新しいトークンに書き換えて送信されていました。

念の為、アンチCSRFの設定を無効にして実施してみました。

GETリクエストは送信されず、POSTリクエストのみ送信され、CSRF対策に弾かれているのが分かります。
(Laravelはステータスコード:419を返却します)

スキャン時に登録された古いトークンがそのまま使われており、サーバーサイドで弾かれてしまいます。

さいごに

CSRFの対策がされているサイトに対して、脆弱性診断を行いました。
是非OWASP ZAPを利用して、脆弱性のないサイトを構築しましょう。

他にも私のブログで、ツールについて解説している記事がありますのでご覧ください。

\オススメ/
MacOSWindowsツールツール他
スポンサーリンク
この記事を共有
千草をフォローする
管理人

現役のITエンジニア。
気ままにコードや技術情報をまとめています。
Webアプリ/Windows・Macアプリ/モバイルアプリ/機械学習やIoT他。
(Java, PHP, Javascript, Swift, Python, C#, 他)
個人開発:Clibor, Quipha, TXT-Crypter
Kindle本: Laravel9 実践入門, 他

千草をフォローする

個人開発

Cliborはシンプルで高機能なクリップボード履歴ソフトです。
Mac版も公開しています。

自分だけの問題集や問題を作成し、クイズを行い学習に活用しましょう。

簡単にテキストを暗号・復号でき、秘密情報を守ります。

便利なツールを公開しています。
是非、活用してください!

コメント

タイトルとURLをコピーしました