CVE-2025-22131 的 PoC(概念验证)
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。
创建一个包含超过 1 个工作表的简单 xlsx 文件并保存。
解压该文件,手动将工作表名称更新为 xss 载荷
再次压缩该文件
将 xlsx 文件上传到易受攻击的服务器
在给定的 URL 上窃取受害者的 cookie
注意: 我使用了窃取受害者 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 个时运行,因此必须有一个包含超过 1 个工作表的 xlsx 文件。
在 PoC 中,使用了一个图片标签来将受害者的 cookie 窃取到攻击者的 URL。