MediumGHSA-r8w8-74ww-j4whCVE-2024-45292

PhpSpreadsheet HTML writer is vulnerable to Cross-Site Scripting via JavaScript hyperlinks

Published 7 Oct 2024 · Updated 6 Mar 2025

Affected packages

Affected
>=2.2.0 <2.3.0
Fixed in
2.3.0
Update to the fixed version for your release line, for example:composer require phpoffice/phpspreadsheet:^2.3.0
Affected
<1.29.2
Fixed in
1.29.2
Update to the fixed version for your release line, for example:composer require phpoffice/phpspreadsheet:^1.29.2
Affected
>=2.0.0 <2.1.1
Fixed in
2.1.1
Update to the fixed version for your release line, for example:composer require phpoffice/phpspreadsheet:^2.1.1
Affected
<=1.8.2
Fixed in
No fix released

Details

Summary

\PhpOffice\PhpSpreadsheet\Writer\Html does not sanitize "javascript:" URLs from hyperlink href attributes, resulting in a Cross-Site Scripting vulnerability.

PoC

Example target script:

<?php

require 'vendor/autoload.php';

$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader("Xlsx");
$spreadsheet = $reader->load(__DIR__ . '/book.xlsx');

$writer = new \PhpOffice\PhpSpreadsheet\Writer\Html($spreadsheet);
print($writer->generateHTMLAll());

Save this file in the same directory: book.xlsx

Open index.php in a web browser and click on both links. The first demonstrates the vulnerability in a regular hyperlink and the second in a HYPERLINK() formula.

Is GHSA-r8w8-74ww-j4wh 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.