
مرجع CVE-2023-45503
في الإصدارات 1.1.4f والإصدارات السابقة من نظام إدارة المحتوى (CMS) Macrob7 Macs Framework، يؤدي التعامل غير الآمن مع مدخلات المستخدم إلى 16 ثغرة من نوع حقن SQL (SQL Injection). القدرة على تنفيذ استعلامات SQL عشوائية قد تؤدي إلى تسريب بيانات خاصة، بما في ذلك تجزئات كلمات مرور المستخدمين، وإمكانية تعديل بيانات اعتماد المستخدمين الآخرين ومستوى صلاحياتهم. يمكن أن يشمل الأثر تصعيد الصلاحيات واحتمالية تنفيذ تعليمات برمجية عن بُعد (RCE).
يمكن العثور على جدول بيانات يوضح كل نقطة نهاية (endpoint) متأثرة، والمعامل القابل للاستغلال، والدوال القابلة للاستغلال عبر هذا الرابط.
تصنيف CWE: CWE-89: Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection')
أبلغ عنها: Ally Petitt
المنتج المتأثر: Macrob7 Macs CMS
الإصدارات المتأثرة: 1.1.4f والإصدارات السابقة
في 16 موضعًا رصدتها، تم استلام مدخلات المستخدم دون تنظيف مناسب (sanitization) أو معالجة بالمعاملات (parameterization) بشكل صحيح. على سبيل المثال، في وظيفة "نسيان كلمة المرور" (Forgot Password) في نظام إدارة المحتوى هذا، يُطلب عنوان بريد إلكتروني.
Application/plugins/CMS/controllers/CMS.php:224
public function forgotPasswordProcess()
{
$this->loadModels();
$emailAddress = Post::getByKey('emailAddress');
$user = $this->usersModel->getUserByEmailAddress($emailAddress);
يتم بعد ذلك تمرير عنوان البريد الإلكتروني إلى الدالة getUserByEmailAddress()، والتي تمرر البريد الإلكتروني إلى ، وهي دالة لا توفر حماية صحيحة ضد استعلامات SQL المحقونة.
selectSingle()Application/plugins/CMS/models/Users_Model.php:41
public function getUserByEmailAddress($emailAddress)
{
return $this->selectSingle( $this->getCMSTableNameUsers(), array('EmailAddress'=>$emailAddress));
}
بعد ذلك، تستدعي الدالة selectSingle() الدالة select() مع تمرير مدخلات المستخدم إليها.
Application/core/DB.php:200
public function selectSingle($tableName, array $where = array(), array $fields = array('*'))
{
$return = $this->select($tableName, $where, $fields);
$single = NULL;
if( count($return) > 0 )
$single = $return[0];
return $single;
}
تقوم الدالة select() القابلة للاستغلال بعد ذلك بربط (concatenate) المعاملات الممررة إليها في استعلام SQL يتم تنفيذه لاحقًا.
Application/core/DB.php:186
public function select($tableName, array $where = array(), array $fields = array('*'))
{
$fieldsString = $this->generatePair($fields, ',');
$whereString = $this->generateKeyValuePair($where, '=', 'AND');
$sql = 'SELECT '.$fieldsString.' FROM '.$tableName;
if($whereString !='')
$whereString = ' WHERE '.$whereString;
$sql = $sql.' '.$whereString.';';
return $this->execute($sql)->fetchAll($this->returnType, $this->className);
}
بسبب عدم وجود تنظيف للمدخلات والتحقق منها ومعالجتها بالمعاملات (parameterization)، تظل هذه الدالة عرضة لهجمات حقن SQL.
لسوء الحظ، فإن عدم وجود صيانة لنظام إدارة المحتوى هذا يعني عدم توفر تحديث مصحح للثغرة. يمكن للمستخدمين الأفراد تعديل الكود البرمجي لاستخدام استعلامات SQL معتمدة على المعاملات بدلاً من الاعتماد على الربط (concatenation) لتمرير مدخلات المستخدم إلى قاعدة البيانات. تُعد العبارات المجهزة (Prepared Statements) مثالاً على إجراء تخفيفي يمكنه تحقيق ذلك.