
استغلال إثبات المفهوم لـ CVE-2020-25867 يوضح تجاوز تخفيف نوع PHP لمصادقة مفتاح مشاركة تقويم SoPlanning.
نظام مفتاح المشاركة معرّض لهجوم PHP Type Juggling، مما يسمح للمهاجم بالوصول إلى محتوى التقويم دون معرفة مفتاح المشاركة.
لكي تكون الثغرة قابلة للاستغلال، يجب تفعيل مفتاح مشاركة التقويم.

بمجرد تفعيل هذه المشاركة، يمكن للمستخدم الوصول إلى التقويم دون مصادقة باستخدام مفتاح المشاركة.

بالطبع، إذا كان المفتاح غير صحيح، يتم رفض الوصول.
يقع التحقق من المفتاح في الملف ""
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if (strcmp($_GET['cle'],CONFIG_SECURE_KEY)==0)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}
تُستخدم دالة strcmp مع مقارنة غير صارمة. تعتمد نتيجة هذه المقارنة على ما يلي: جداول مقارنة أنواع PHP
نتيجة دالة strcmp موصوفة في الوثائق: [strcmp]'https://www.php.net/manual/en/function.strcmp.php)
تُرجع < 0 إذا كان str1 أصغر من str2؛ و> 0 إذا كان str1 أكبر من str2، و0 إذا كانا متساويين.
تُرجع هذه الدالة "NULL" إذا كانت إحدى المعاملات مصفوفة.
وفقًا لـجداول مقارنة أنواع PHP، تكون المقارنة غير الصارمة بين "NULL" و0 true
وبالتالي، إذا كانت $_GET['cle'] مصفوفة، تكون نتيجة الشرط true ويتم السماح بالوصول.
يُعرّف هذا الرابط $_GET['cle'] كمصفوفة: https://demo.soplanning.org/planning.php?public=1&cle[]=

يتم منح الوصول بصفة "Invité"
لإصلاح هذه الثغرة، يمكن استخدام مقارنة صارمة:
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if (strcmp($_GET['cle'],CONFIG_SECURE_KEY)===0)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}
أو يمكن إجراء المقارنة دون استخدام دالة strcmp.
if ( CONFIG_SOPLANNING_OPTION_ACCES == 2 && isset($_GET['public']) && isset($_GET['cle']))
{
if ($_GET['cle'] === CONFIG_SECURE_KEY)
{
$_SESSION['public']=1;
$_SESSION['user_id']='publicspl';
}
}