
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 につながる脆弱性の影響を受けます。
シートが2つ以上ある単純な xlsx ファイルを作成して保存する。
ファイルを解凍し、シート名を手動で XSS ペイロードに書き換える。
ファイルを再度 zip 化する。
影響を受けるサーバーに 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 を注入できます。
このコードはシートが2つ以上ある場合にのみ実行されるため、2つ以上のシートを含む xlsx ファイルが必要です。
PoC では、画像タグを使用して被害者の Cookie を攻撃者の URL へ外部送信しています。