
PoC per CVE-2025-22131
PoC per CVE-2025-22131
PhpSpreadsheet è una libreria scritta in puro PHP e offre un insieme di classi che consentono di leggere e scrivere vari formati di fogli di calcolo come Excel e LibreOffice Calc.
La versione di phpspreadsheet <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 è affetta da una vulnerabilità in cui i nomi dei fogli non vengono adeguatamente sanitizzati, il che porta a XSS.
creare un semplice file xlsx con più di 1 foglio e salvarlo.
decomprimere il file, aggiornare manualmente il nome del foglio con il payload xss
ricomprimere il file
caricare il file xlsx sul server vulnerabile
esfiltrare il cookie della vittima sull'url fornito
Nota: ho usato il payload per esfiltrare il cookie della vittima; se si desidera altro, aggiornare di conseguenza il file xl/workbook.xml.
/**
* 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;
}
Qui $sheet->getTitle() non viene adeguatamente escapato usando htmlspecialchars(), motivo per cui un attaccante può iniettare HTML.
Nota che questo pezzo di codice viene eseguito solo quando ci sono più di 1 foglio, quindi è necessario avere un file xlsx con più di 1 foglio.
Nel PoC, viene usato un tag immagine per esfiltrare i cookie della vittima verso l'url dell'attaccante.