概要
以前、DVWAを使用して実際にSQLインジェクションとXSSを実践してみましたが、今回はCSRF(Cross Site Request Forgery)を試してみます。
CSRFとは、webアプリケーションでログインしているユーザが意図しない悪意のあるリクエストを送り、それをサーバ側が処理してしまうというような問題のことを指します。
ウェブサイトの中には、サービスの提供に際しログイン機能を設けているものがあります。ここで、ログインした利用者からのリクエストについて、その利用者が意図したリクエストであるかどうかを識別する仕組みを持たないウェブサイトは、外部サイトを経由した悪意のあるリクエストを受け入れてしまう場合があります。このようなウェブサイトにログインした利用者は、悪意のある人が用意した罠により、利用者が予期しない処理を実行させられてしまう可能性があります。このような問題を「CSRF(Cross-Site Request Forgeries/クロスサイト・リクエスト・フォージェリ)の脆弱性」と呼び、これを悪用した攻撃を、「CSRF攻撃」と呼びます。
出典 : https://www.ipa.go.jp/security/vuln/websecurity/csrf.html
この記事は人力で記載しています。
手順
現状のパスワード変更のリクエストを確認
まずは、アプリケーションのCSRF部分の動作の確認をしていきます。
Test Credentials
を押下して現状のadminユーザのパスワードを確認してみましょう。
デフォルトのままなので、以下の通り入力すればValid password for 'admin'
と表示され、adminユーザのパスワードがpassword
となっていることがわかります。
Username: admin
Password: password
続いて、New password:
とConfirm new password:
にnewpass
と入力してパスワード再設定をしてみます。
すると、以下のようなリンクに遷移して、URLのパラメータにパスワードがそのまま入ってしまっていることがわかります。
http://localhost:4280/vulnerabilities/csrf/?password_new=newpass&password_conf=newpass&Change=Change#
ブラウザの検証ツールなどを使用してどのようなリクエストを送っているか確認してみたところGETリクエストでパスワードの変更を行っていそうです。
Request URL http://localhost:4280/vulnerabilities/csrf/?password_new=newpass&password_conf=newpass&Change=Change
Request Method GET
Status Code 200 OK
Remote Address 127.0.0.1:4280
Referrer Policy strict-origin-when-cross-origin
DVWAのサーバ側のログでもリクエストの確認ができました。
192.168.97.1 - - [19/Jul/2025:22:19:19 +0000] "GET /vulnerabilities/csrf/?password_new=newpass&password_conf=newpass&Change=Change HTTP/1.1" 200 2471 "http://localhost:4280/vulnerabilities/csrf/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
再度adminユーザのパスワードが変わっているかを確認するために、Test Credentials
で確認してみましょう。以下の通り入力すればValid password for 'admin'
と表示され、adminユーザのパスワードがnewpass
となっていることがわかります。
Username: admin
Password: newpass
DBでも確認してみましたが、パスワードハッシュもちゃんと変わっていそうです。
--- before
MariaDB [dvwa]> select user,password from users where user = "admin";
+-------+----------------------------------+
| user | password |
+-------+----------------------------------+
| admin | 5f4dcc3b5aa765d61d8327deb882cf99 |
+-------+----------------------------------+
1 row in set (0.004 sec)
--- after
MariaDB [dvwa]> select user,password from users where user = "admin";
+-------+----------------------------------+
| user | password |
+-------+----------------------------------+
| admin | e6053eb8d35e02ae40beeeacef203c1a |
+-------+----------------------------------+
1 row in set (0.009 sec)
攻撃用のページを作成する
攻撃者は、先ほどのパスワードをURLパラメータに含んだリンクを悪用して、サイトやメールを作成してそのリンクを踏ませようとします。
まず、aタグを踏むと脆弱性のあるwebアプリケーションに遷移します。imgタグはユーザがページを開くだけで自動的に画像を読み込もうとするので、バックグラウンドで攻撃が実行されてしまいます。
See the Pen Untitled by 磯田将太 (@gluvomsj-the-sasster) on CodePen.
※ここのhtmlとjsはAIを用いて生成しました。
1. DVWAにログインしたまま、上記のhtmlの「ここをクリック!」の部分を押下
2. DVWAから一旦ログアウトして、adminユーザのパスワードnewpass
でログインできるか確認してみます。なんとnewpass
というパスワードを入力してもLogin failed
となってしまい、adminユーザのログインができなくなってしまいました。。
3. 続いて、攻撃者が攻撃用リンクのパスワードパラメータに設定したhacked
でログインできるか確認してみます。すると、、ログインできてしまいました。これで、攻撃者はadminユーザの乗っ取り完了です。
基本的な対策について
基本的な対策については、以下のようなものがありますが、IPAのサイトにわかりやすく記載あったのでリンクしておきます。
- CSRFトークンの導入
- リクエストのRefererヘッダーのチェック
- SameSite Cookie属性
- CAPTCHAの導入
- MFA認証