Этот PoC был написан быстро, в нём нет ничего особенного.
Он эксплуатирует новую уязвимость CVE-2023-27372 SPIP RCE.
Это ошибка десериализации, которая использует опасное использование тега #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 страдает от различных недостатков. Проверка регулярного выражения, используемая для валидации ввода, некорректна и её легко обойти. Код вызывает функцию unserialize без надлежащей проверки, что позволяет выполнять произвольный код. Ручная эксплуатация выполняется чрезвычайно просто. Например, если мы хотим выполнить phpinfo();, мы можем сделать:
root@kitploit:~
oubli=s:19:"<?phpinfo(); ?>";
Если сервер возвращает ожидаемый результат, он уязвим. Как исправить? На самом деле довольно просто. Ниже я написал базовый патч: