
PoC para CVE-2025-22131
PoC para CVE-2025-22131
PhpSpreadsheet é uma biblioteca escrita em PHP puro e oferece um conjunto de classes que permitem ler e escrever vários formatos de arquivo de planilha, como Excel e LibreOffice Calc.
A versão do phpspreadsheet <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 é afetada por uma vulnerabilidade em que os nomes das planilhas não são devidamente sanitizados, o que leva a XSS.
crie um arquivo xlsx simples com mais de 1 planilha e salve-o.
descompacte o arquivo, atualize o nome da planilha manualmente para o payload de xss
compacte o arquivo novamente
envie o arquivo xlsx para o servidor vulnerável
exfiltre o cookie da vítima para a url fornecida
Nota: Eu usei o payload para exfiltrar o cookie da vítima; se algo diferente for desejado, atualize o arquivo xl/workbook.xml de acordo.
/**
* 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;
}
Aqui, o $sheet->getTitle() não é devidamente escapado usando htmlspecialchars(), e é por isso que um atacante pode injetar HTML.
Observe que esse trecho de código só é executado quando há mais de 1 planilha, por isso é necessário ter um arquivo xlsx com mais de 1 planilha.
No PoC, uma tag de imagem é usada para exfiltrar os cookies da vítima para a url do atacante.