MediumGHSA-79xx-vf93-p7cxCVE-2025-22131

Cross-Site Scripting (XSS) vulnerability in generateNavigation() function in PhpSpreadsheet

Published 21 Jan 2025 · Updated 6 Mar 2025

Affected packages

Affected
>=3.0.0 <3.8.0
Fixed in
3.8.0
Update to the fixed version for your release line, for example:composer require phpoffice/phpspreadsheet:^3.8.0
Affected
<1.29.8
Fixed in
1.29.8
Update to the fixed version for your release line, for example:composer require phpoffice/phpspreadsheet:^1.29.8
Affected
>=2.0.0 <2.1.7
Fixed in
2.1.7
Update to the fixed version for your release line, for example:composer require phpoffice/phpspreadsheet:^2.1.7
Affected
>=2.2.0 <2.3.6
Fixed in
2.3.6
Update to the fixed version for your release line, for example:composer require phpoffice/phpspreadsheet:^2.3.6
Affected
<=1.8.2
Fixed in
No fix released

Details

Summary

The researcher discovered zero-day vulnerability Cross-Site Scripting (XSS) vulnerability in the code which translates the XLSX file into a HTML representation and displays it in the response.

Details

When generating the HTML from an xlsx file containing multiple sheets, a navigation menu is created. This menu includes the sheet names, which are not sanitized. As a result, an attacker can exploit this vulnerability to execute JavaScript code.

        // 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;
        }

PoC

1. Create an XLSX file with multiple sheets : !image

2. Generate the HTML content

<?php
	require __DIR__ . '/vendor/autoload.php';

	$inputFileName = 'payload.xlsx';
	$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($inputFileName);
	$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet);
	$writer->writeAllSheets();
	echo $writer->generateHTMLAll();
?>

3. Enjoy !image

Impact

XSS can cause a variety of problems for the end user that range in severity from an annoyance to complete account compromise. Example of impacts :

  • Disclosure of the user’s session cookie, allowing an attacker to hijack the user’s session and take over the account (Only if HttpOnly cookie's flag is set to false).
  • Redirecting the user to some other page or site (like phishing websites)
  • Modifying the content of the current page (add a fake login page that sends credentials to the attacker).
  • Automatically download malicious files.
  • Requests access to the victim geolocation / camera.
  • ...

Is GHSA-79xx-vf93-p7cx in any of your client repos?

Checking one package by hand is fine. Checking it across forty client projects is not. NPMscan reads the lockfiles in every GitHub repo you pick, finds each project with an affected phpoffice/phpspreadsheet, and gives you the command that fixes it.

References

Advisory data from OSV.dev (opens OSV.dev in a new tab), refreshed daily.