
PoC для CVE-2025-22131
PoC для CVE-2025-22131
PhpSpreadsheet — это библиотека, написанная на чистом PHP, предлагающая набор классов, которые позволяют читать и записывать различные форматы файлов электронных таблиц, такие как Excel и LibreOffice Calc.
phpspreadsheet версии <1.29.8>=2.2.0, <2.3.6>=2.0.0, <2.1.7>=3.0.0, <3.8.0 подвержена уязвимости, при которой имена листов недостаточно санируются, что приводит к XSS.
создайте простой xlsx-файл с более чем 1 листом и сохраните его.
распакуйте файл, вручную измените имя листа на XSS-пейлоад
снова упакуйте файл
загрузите xlsx-файл на уязвимый сервер
извлеките cookie жертвы на указанный URL
Примечание: Я использовал пейлоад для извлечения cookie жертвы. Если требуется что-то другое, измените файл 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;
}
Здесь $sheet->getTitle() не экранируется должным образом с помощью htmlspecialchars(), поэтому злоумышленник может внедрить HTML.
Обратите внимание, что этот фрагмент кода выполняется только при наличии более 1 листа, поэтому необходим xlsx-файл с более чем 1 листом.
В PoC используется тег изображения для последующего извлечения cookie жертвы на URL атакующего.