この問題が果たして「中級」なのかについては異論があると思います。きわめて易しいと思う人もいれば、きわめて難しいと思う人も多いと思います。中をとって中級としましたが、現実には難し目かと思います。
問題
今回の問題は、前回(初級編)のトークンチェック部分(chgmail.php内)のみを変更したものです。まずは変更箇所を説明します。前回のおさらい
今回のチェックプログラムは下記。トークンが空でないかempty()により確認していますが、トークンのチェックにstrcmpを使っているところが、なにやら匂いますねwif ($_POST['token'] !== $_SESSION['token']) { // ワンタイムトークン確認 die('正規の画面からご使用ください'); }
以下は、上記を含めたメールアドレス変更プログラム(chgmail.php)の全体です。その他のスクリプト(mypage.php、chgmailform.php)は前回と同じなので、初級編を参照ください。if (empty($_SESSION['token']) || empty($_POST['token']) || strcmp($_POST['token'], $_SESSION['token'])) { // ワンタイムトークン確認 die('正規の画面からご使用ください'); }
<?php // chgmail.php メールアドレス変更実行 session_start(); if (empty($_SESSION['id'])) { die('ログインしてください'); } $id = $_SESSION['id']; // ユーザIDの取り出し if (empty($_SESSION['token']) || empty($_POST['token']) || strcmp($_POST['token'], $_SESSION['token'])) { // ワンタイムトークン確認 die('正規の画面からご使用ください'); } unset($_SESSION['token']); // 使用済みトークンの削除 $mail = $_POST['mail']; $_SESSION['mail'] = $mail; ?> <body> <?php echo htmlspecialchars($id, ENT_COMPAT, 'UTF-8'); ?>さんのメールアドレスを<?php echo htmlspecialchars($mail, ENT_COMPAT, 'UTF-8'); ?>に変更しました<br> <a href="mypage.php">マイページ</a> </body>
実行例は初級編と同じですので、初級編の記事を参照ください。
設問
利用者(被害者)がmypage.phpを閲覧した状態(ログイン中を想定)で、罠ページを閲覧させることにより、CSRF攻撃でメールアドレスを変更してください。この攻撃を実現する罠ページのPoC(概念実証コード)が解答になります。解答は11月15日(木)に公開予定です。
0 件のコメント:
コメントを投稿