ホームページ >バックエンド開発 >PHPチュートリアル >PHP セキュリティ - セマンティック URL 攻撃
好奇心は多くの攻撃者の主な動機であり、セマンティック URL 攻撃はその好例です。このタイプの攻撃では、主に、何か興味深いものを発見することを期待して URL を編集します。たとえば、ユーザー chris がソフトウェア内のリンクをクリックして http://www.php.cn/ ページにアクセスした場合、 当然、ユーザーの値を変更して何が起こるか試してみることもできます。たとえば、http://www.php.cn/ にアクセスして、他の人の情報を参照できるかどうかを確認する場合があります。 GET データの操作は POST データの操作よりもわずかに便利であるだけですが、その露出により、特に初心者の攻撃者にとってはより頻繁に攻撃されることになります。
ほとんどの脆弱性は、特に複雑な原因ではなく、見落としによって発生します。経験豊富なプログラマの多くは、上記の URL を信頼することの危険性を容易に認識していますが、多くの場合、他の人から指摘されるまでそれに気づきません。
セマンティック URL 攻撃や脆弱性がどのように見逃されるかをより適切に示すために、ユーザーがログインして自分の電子メールを表示することを主な機能とする Web メール システムを考えてみましょう。ユーザー ログインに基づくシステムには、パスワード取得メカニズムが必要です。通常のアプローチは、攻撃者が知りそうにない質問をすることです (コンピュータのブランドなど、ただし、質問が正しく答えられた場合は、ユーザーが質問を指定して答えることができればより良いでしょう)。 , 指定したメールアドレスに新しいパスワードが送信されます。
Web メール システムの場合、登録時に電子メール アドレスを指定できない場合があるため、質問に正しく回答したユーザーは電子メール アドレスの入力を求められます (その電子メール アドレスに新しいパスワードが送信される際に、代替電子メール アドレス情報も収集される場合があります)。 。次のフォームは新しいメール アドレスを要求するために使用され、アカウント名はフォームの非表示フィールドに保存されます:
CODE:
<form action="reset.php" method="GET"> <input type="hidden" name="user" value="chris" /> <p>Please specify the email address where you want your new password sent:</p> <input type="text" name="email" /><br /> <input type="submit" value="Send Password" /> </form>
受信スクリプトreset.phpが、どのアカウントのパスワードがリセットされるか、新しいパスワードがどのメールアドレスに送信されるかなど、すべての情報を取得することがわかります。
ユーザーが (正しい質問に回答した後) 上記のフォームを参照できる場合は、そのユーザーが chris アカウントの法的所有者であると考える理由があります。代わりの電子メール アドレスとして chris@example.org を指定した場合、送信後に次の URL にリダイレクトされます:
CODE:
http://www.php.cn/
URL はブラウザ バーに表示されるので、ここまで進んだ人は誰でも、user 変数と mail 変数が何をするのかを簡単に確認できます。これに気づいたユーザーは、php@example.org が非常に素晴らしいアドレスであると考え、次のリンクにアクセスして試してみました。 http://www.php.cn/
replace.php がユーザーによって提供された情報を信頼する場合、これはセマンティック URL 攻撃の脆弱性です。この場合、システムは PHP アカウントの新しいパスワードを生成して chris@example.org に送信し、Chris が PHP アカウントを盗むことに成功します。
セッション追跡を使用すると、上記の状況を簡単に回避できます:
CODE:
<?php session_start(); $clean = array(); $email_pattern = '/^[^@\s<&>]+@([-a-z0-9]+\.)+[a-z]{2,}$/i'; if (preg_match($email_pattern, $_POST['email'])) { $clean['email'] = $_POST['email']; $user = $_SESSION['user']; $new_password = md5(uniqid(rand(), TRUE)); if ($_SESSION['verified']) { /* Update Password */ mail($clean['email'], 'Your New Password', $new_password); } } ?>
上記の例では、一部の詳細 (詳細な電子メール情報や適切なパスワードなど) が省略されていますが、ユーザーが提供したアカウントに対する信頼の欠如、そしてより重要なことに、ユーザーが質問に応答したかどうかを保存するためにセッション変数が使用されていることを示しています。質問に正しく答えたユーザー ($_SESSION['verified'])、および質問に正しく答えたユーザー ($_SESSION['user'])。この不信感こそが、アプリケーションの脆弱性を防ぐ鍵となります。
この例は完全に架空のものではありません。 2003 年 5 月に Microsoft によって発見されました。 パスポートの脆弱性に着想を得たもの。 http://www.php.cn/ にアクセスしてください。 具体的な例、議論、その他の情報を参照してください。
上記は、PHP セキュリティ セマンティック URL 攻撃の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) にご注意ください。