
Ceci est un PoC pour CVE-2023-27372 et génère un shell entièrement interactif.
C'est une faille de désérialisation qui exploite l'utilisation dangereuse de la balise #ENV lors de la fonctionnalité de réinitialisation de mot de passe (spip.php?page=spip_pass) dans /ecrire/balise/formulaire_.php Plus précisément cette ligne :
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 fonction protege_champ souffre de diverses failles. La vérification par expression régulière (RE) utilisée pour valider l'entrée est défaillante et peut être contournée facilement. Le code appelle la fonction unserialize() sans validation appropriée, permettant l'exécution de code arbitraire. L'exploitation manuelle peut être effectuée très facilement. Par exemple, si nous voulions exécuter nous pouvons faire :
phpinfo();oubli=s:19:"<?phpinfo(); ?>";
Si le serveur renvoie la sortie attendue, il est vulnérable. Comment le corriger ? Assez simplement en fait. Ci-dessous, j'ai écrit un correctif de 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 fonction protege_champ() corrigée inclut la validation des entrées, l'assainissement et la gestion des entrées malveillantes.