
PoC pour CVE-2025-22131
PoC pour CVE-2025-22131
PhpSpreadsheet est une bibliothèque écrite en PHP pur et propose un ensemble de classes qui permettent de lire et d'écrire divers formats de fichiers tableurs comme Excel et LibreOffice Calc.
phpspreadsheet version <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 est affectée par une vulnérabilité où les noms de feuilles ne sont pas correctement échappés, ce qui conduit à une XSS.
créez un fichier xlsx simple avec plus d'une feuille et sauvegardez-le.
décompressez le fichier, mettez à jour manuellement le nom de la feuille avec la charge utile XSS
recompressez le fichier
téléchargez le fichier xlsx sur le serveur vulnérable
exfiltrez le cookie de la victime vers l'URL donnée
Note : J'ai utilisé la charge utile pour exfiltrer le cookie de la victime ; si autre chose est souhaité, mettez à jour le fichier xl/workbook.xml en conséquence.
/**
* Generate sheet tabs.
*/
public function generateNavigation(): string
{
// Fetch sheets
$sheets = [];
if ($this->sheetIndex === null) {
$sheets = $this->spreadsheet->getAllSheets();
} else {
$sheets[] = $this->spreadsheet->getSheet($this->sheetIndex);
}
// Construct HTML
$html = '';
// Only if there are more than 1 sheets
if (count($sheets) > 1) {
// Loop all sheets
$sheetId = 0;
$html .= '<ul class="navigation">' . PHP_EOL;
foreach ($sheets as $sheet) {
$html .= ' <li class="sheet' . $sheetId . '"><a href="#sheet' . $sheetId . '">' . $sheet->getTitle() . '</a></li>' . PHP_EOL;
++$sheetId;
}
$html .= '</ul>' . PHP_EOL;
}
return $html;
}
Ici, $sheet->getTitle() n'est pas correctement échappé avec htmlspecialchars(), ce qui permet à un attaquant d'injecter du HTML.
Notez que ce morceau de code ne s'exécute que lorsqu'il y a plus d'une feuille, il est donc nécessaire d'avoir un fichier xlsx avec plus d'une feuille.
Dans le PoC, une balise image est utilisée pour exfiltrer les cookies de la victime vers l'URL de l'attaquant.