私は現在コンピュータセキュリティ試験の勉強をしていて、過去の試験論文の次の質問に行き詰まっています。
1c <form action=”message.php” method=”get”>
2c <p>Message: <input type=”text” name=”message” /></p>
3c <p>Username: <input type=”text” name=”user” /></p>
4c <p>Password: <input type=”text” name=”pass” /></p>
5c <p><input type=”submit” /></p>
1s <?php
2s $user = $ ̇REQUEST[”user”];
3s $pass = $ ̇REQUEST[”pass”];
4s $message = $ ̇REQUEST[”message”];
5s $result = mysqli_multi_query($con,”UPDATE messages SET
6s message=”.$message.” WHERE user=”.$user.””);
7s $row = mysqli_fetch_array($result);
8s if (!empty($row)) {
9s echo ”Your message: ”.$message.” has been added”;
10s }
11s ?>
SQLインジェクション、XSS、クロスサイトリクエストフォージェリなどを探す必要があることはわかっています...
私の試み:
誰かがコードの脆弱な部分を強調表示したり、なぜそれらが脆弱なのか説明したりできると本当にありがたいです。
脆弱性1&2:
5s $result = mysqli_multi_query($con,”UPDATE messages SET
6s message=”.$message.” WHERE user=”.$user.””);
これらはSQLインジェクションの脆弱性です。プログラムは、信頼できないソースからの入力を使用して構築されたSQLクエリを呼び出します。あなたが指摘したように$USER
は脆弱ですが、$message
また〜だ。
脆弱性3:
8s if (!empty($row)) {
9s echo ”Your message: ”.$message.” has been added”;
10s }
これはXSSの脆弱性です。データがDBに格納されている(したがって永続化されている)ため、ソースコードの量が少ない場合、タイプを明確に分類することは困難ですが、ただし、サンプルコードでは、出力される他の領域は表示されないため、この時点で反映されていることのみを示すことができます。
潜在的な脆弱性4:
3s $pass = $ ̇REQUEST[”pass”];
コンピュータプログラムはコンテキストに大きく依存するため、このプログラムの作成者は認証を望んでいたように見えますが、そうではない場合があります。作成者が認証を希望した場合、$pass
はどこでもチェックされません。これが脆弱性であるかどうかに関係なく、これは未使用のコードです。未使用のコードを運用プログラムに残しておくことは悪い習慣です。
潜在的な脆弱性5:1c <form action=”message.php” method=”get”>
これは潜在的にCSRFの脆弱性です。ここでも、これは検証を行うことを意図しているプログラマーに依存しています。その場合、攻撃者が不正なリクエストを行うことを防ぐために、フォームの投稿にはユーザー固有のシークレットが含まれている必要があります。
潜在的な脆弱性6および7:
5s $result = mysqli_multi_query($con,”UPDATE messages SET
6s message=”.$message.” WHERE user=”.$user.””);
$message
および$USER
はXSSの脆弱性を格納している可能性がありますが、サンプルコードではこれらの変数が取得されることは示されていませんが、これらがプログラムの別の部分に表示されると想定してもかなり安全です。
潜在的な脆弱性8:4c <p>Password: <input type=”text” name=”pass” /></p>
これは潜在的にショルダーサーフィンの脆弱性です。この入力は難読化する必要があります。これも、プログラマが実際に検証しようとする意図、およびpass
入力フィールドの実際の意味に依存します。これはパスワードであると想定できますが、プログラマーから確認を得ない限り、それは単なる想定です。
潜在的な脆弱性9:
1c <form action=”message.php” method=”get”>
2c <p>Message: <input type=”text” name=”message” /></p>
3c <p>Username: <input type=”text” name=”user” /></p>
4c <p>Password: <input type=”text” name=”pass” /></p>
5c <p><input type=”submit” /></p>
これは潜在的にショルダーサーフィンの脆弱性です。これにより、URLにパスワードを表示するGETリクエストが発生し、ショルダーサーフィン攻撃が発生する可能性があります。もう一度、これはプログラマーの意図に依存します。