
Это 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() включает проверку ввода, очистку и обработку вредоносного ввода.