web-dev-qa-db-ja.com

このWebサイトでセキュリティの弱点を見つける(試験問題)

私は現在コンピュータセキュリティ試験の勉強をしていて、過去の試験論文の次の質問に行き詰まっています。

Question

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、クロスサイトリクエストフォージェリなどを探す必要があることはわかっています...

私の試み:

  • $ userはサニタイズされていないため、SQLインジェクションに使用できます
  • パスワードはどこでも確認されません(?)
  • echo $ messageも脆弱な部分のように見えますが(入力は再度サニタイズされません)、エクスプロイトが何かはわかりません(ある種のXSS?)

誰かがコードの脆弱な部分を強調表示したり、なぜそれらが脆弱なのか説明したりできると本当にありがたいです。

3
ischelp

脆弱性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リクエストが発生し、ショルダーサーフィン攻撃が発生する可能性があります。もう一度、これはプログラマーの意図に依存します。

2
meowcat