
هذا هو PoC للثغرة CVE-2023-27372 ويقوم بتشغيل شل تفاعلي بالكامل.
إنه خلل في إلغاء التسلسل يستغل الاستخدام الخطير لوسم #ENV أثناء ميزة إعادة تعيين كلمة المرور (spip.php?page=spip_pass) داخل /ecrire/balise/formulaire_.php وتحديدًا هذا السطر:
function protege_champ($texte){
if (is_array($texte))
$texte = array_map('protege_champ',$texte);
else {
// ne pas corrompre une valeur serialize
if (preg_match(",^[abis]:\d+[:;],", $texte) AND unserialize($texte)!=false)
return $texte;
$texte = entites_html($texte);
$texte = str_replace("'","'",$texte);
}
return $texte;
}
تعاني الدالة protege_champ من عدة عيوب. فحص التعبير النمطي (RE) المستخدم للتحقق من المُدخل معيب ويمكن تجاوزه بسهولة. يستدعي الكود الدالة unserialize() دون تحقق مناسب، مما يسمح بتنفيذ كود تعسفي. يمكن إجراء الاستغلال اليدوي بسهولة بالغة. على سبيل المثال، إذا أردنا تنفيذ phpinfo(); يمكننا أن نفعل:
oubli=s:19:"<?phpinfo(); ?>";
إذا أعاد الخادم الناتج المتوقع، فهو مُعرَّض للاستغلال. كيف يمكننا تصحيحها؟ في الواقع، الأمر بسيط للغاية. بالأسفل، كتبتُ تصحيحًا أساسيًا:
function protege_champ($texte) {
if (is_array($texte)) {
$texte = array_map('protege_champ', $texte);
} else {
if (!isValidInput($texte)) {
$texte = 'Malicious input detected';
} else {
$texte = entites_html($texte);
$texte = str_replace("'", "'", $texte);
}
}
return $texte;
}
الدالة المُصححة protege_champ() تتضمن التحقق من المُدخلات، والتعقيم، ومعالجة المُدخلات الخبيثة.