
これはCVE-2023-27372のPoCであり、完全に対話型のシェルを起動します。
これは、パスワードリセット機能 (spip.php?page=spip_pass) 中に /ecrire/balise/formulaire_.php 内で #ENV タグの危険な使用を悪用する、デシリアライゼーションの欠陥です。具体的には次の行です:
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() 関数には、入力検証、サニタイズ、および悪意のある入力の処理が含まれています。