
Questo è un PoC per CVE-2023-27372 e genera una shell completamente interattiva.
È un difetto di deserializzazione che sfrutta l'uso pericoloso del tag #ENV durante la funzionalità di reset della password (spip.php?page=spip_pass) all'interno di /ecrire/balise/formulaire_.php. Nello specifico questa riga:
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;
}
La funzione protege_champ presenta diversi difetti. Il controllo tramite espressione regolare (RE) utilizzato per validare l'input è imperfetto e può essere bypassato facilmente. Il codice chiama la funzione unserialize() senza una validazione adeguata, consentendo l'esecuzione di codice arbitrario. Lo sfruttamento manuale può essere effettuato con estrema facilità. Ad esempio, se volessimo eseguire phpinfo();, potremmo fare:
oubli=s:19:"<?phpinfo(); ?>";
Se il server restituisce l'output atteso, è vulnerabile. Come possiamo correggerla? In realtà abbastanza semplicemente. Di seguito ho scritto una patch di base:
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;
}
La funzione protege_champ() corretta include la validazione dell'input, la sanificazione e la gestione di input malevoli.