1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「不審なメールのリンク」の危険性を技術的に理解する。DVWAで学ぶCSRF攻撃のメカニズム

Posted at

概要

以前、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ユーザのパスワードを確認してみましょう。

スクリーンショット 2025-07-20 8.11.23.png

デフォルトのままなので、以下の通り入力すればValid password for 'admin'と表示され、adminユーザのパスワードがpasswordとなっていることがわかります。

Username: admin
Password: password

スクリーンショット 2025-07-20 8.15.16.png

続いて、New password:Confirm new password:newpassと入力してパスワード再設定をしてみます。

スクリーンショット 2025-07-20 8.22.39.png

すると、以下のようなリンクに遷移して、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ユーザのログインができなくなってしまいました。。
スクリーンショット 2025-07-20 8.51.26.png

3. 続いて、攻撃者が攻撃用リンクのパスワードパラメータに設定したhackedでログインできるか確認してみます。すると、、ログインできてしまいました。これで、攻撃者はadminユーザの乗っ取り完了です。
スクリーンショット 2025-07-20 8.50.23.png

基本的な対策について

基本的な対策については、以下のようなものがありますが、IPAのサイトにわかりやすく記載あったのでリンクしておきます。

  • CSRFトークンの導入
  • リクエストのRefererヘッダーのチェック
  • SameSite Cookie属性
  • CAPTCHAの導入
  • MFA認証
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?