
PoC para CVE-2025-22131
PoC para CVE-2025-22131
PhpSpreadsheet es una biblioteca escrita en PHP puro y ofrece un conjunto de clases que te permiten leer y escribir varios formatos de archivos de hoja de cálculo como Excel y LibreOffice Calc.
phpspreadsheet versión <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 se ve afectada por una vulnerabilidad donde los nombres de las hojas no se sanitizan adecuadamente lo que conduce a XSS.
crea un archivo xlsx simple con más de 1 hoja y guárdalo.
descomprime el archivo, actualiza el nombre de la hoja manualmente con el payload xss
vuelve a comprimir el archivo
sube el archivo xlsx al servidor vulnerable
exfiltra la cookie de la víctima en la url proporcionada
Nota: He usado el payload para exfiltrar la cookie de la víctima, si se desea otra cosa, actualiza el archivo xl/workbook.xml en consecuencia.
/**
* 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;
}
Aquí $sheet->getTitle() no se escapa correctamente usando htmlspecialchars(), razón por la cual un atacante puede inyectar HTML.
Ten en cuenta que este fragmento de código solo se ejecuta cuando hay más de 1 hoja, por lo que es necesario tener un archivo xlsx con más de 1 hoja.
En el PoC, se usa una etiqueta de imagen para luego exfiltrar las cookies de la víctima a la url del atacante.