
PoC für CVE-2025-22131
PoC für CVE-2025-22131
PhpSpreadsheet ist eine Bibliothek, die in reinem PHP geschrieben ist und eine Reihe von Klassen bietet, mit denen Sie verschiedene Tabellenkalkulationsdateiformate wie Excel und LibreOffice Calc lesen und schreiben können.
phpspreadsheet Version <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 ist von einer Sicherheitslücke betroffen, bei der die Blattnamen nicht ordnungsgemäß bereinigt werden, was zu XSS führt.
Erstelle eine einfache xlsx-Datei mit mehr als einem Blatt und speichere sie.
Entpacke die Datei, aktualisiere den Blattnamen manuell auf die XSS-Payload.
Packe die Datei erneut.
Lade die xlsx-Datei auf den anfälligen Server hoch.
Exfiltriere das Cookie des Opfers auf die angegebene URL.
Hinweis: Ich habe die Payload verwendet, um das Cookie des Opfers zu exfiltrieren. Falls etwas anderes gewünscht wird, aktualisiere die Datei xl/workbook.xml entsprechend.
/**
* 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;
}
Hier wird $sheet->getTitle() nicht ordnungsgemäß mit htmlspecialchars() maskiert, weshalb ein Angreifer HTML einschleusen kann.
Beachten Sie, dass dieser Code nur ausgeführt wird, wenn mehr als ein Blatt vorhanden ist, daher ist es notwendig, eine xlsx-Datei mit mehr als einem Blatt zu haben.
Im PoC wird ein Bild-Tag verwendet, um dann die Cookies des Opfers an die URL des Angreifers zu exfiltrieren.