
Dies ist ein PoC für CVE-2023-27372 und erzeugt eine vollständig interaktive Shell.
Es handelt sich um eine Deserialisierungsschwachstelle, die die gefährliche Verwendung des #ENV-Tags während der Passwort-Zurücksetzen-Funktion (spip.php?page=spip_pass) innerhalb von /ecrire/balise/formulaire_.php ausnutzt. Genauer gesagt diese Zeile:
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;
}
Die protege_champ-Funktion leidet unter verschiedenen Schwachstellen. Die zur Validierung der Eingabe verwendete Regex-Prüfung ist fehlerhaft und kann leicht umgangen werden. Der Code ruft die unserialize()-Funktion ohne ordnungsgemäße Validierung auf, was die Ausführung von beliebigem Code ermöglicht. Manuelle Ausnutzung kann extrem einfach durchgeführt werden. Wenn wir beispielsweise phpinfo(); ausführen möchten, können wir Folgendes tun:
oubli=s:19:"<?phpinfo(); ?>";
Wenn der Server die erwartete Ausgabe zurückgibt, ist er angreifbar. Wie kann man das patchen? Eigentlich ganz einfach. Unten habe ich einen grundlegenden Patch geschrieben:
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;
}
Die gepatchte protege_champ()-Funktion beinhaltet Eingabevalidierung, Bereinigung und Behandlung von schädlichen Eingaben.