GitHub Advisoryadvisory · Packagist
GHSA-7cc9-j4mv-vcjp XXE in PHPSpreadsheet's XLSX reader
HIGH
Official page ↗
- Aliases
- CVE-2024-48917
- Ecosystem
- Packagist
- Packages
- phpoffice/phpspreadsheet, phpoffice/phpexcel
- Severity
- High
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
- Weaknesses
- CWE-611
- Reviewed
- 2024-11-18
Affected packages
• Packagist phpoffice/phpspreadsheet: < 1.29.4 → fixed in 1.29.4
• Packagist phpoffice/phpspreadsheet: >= 2.0.0, < 2.1.3 → fixed in 2.1.3
• Packagist phpoffice/phpspreadsheet: >= 2.2.0, < 2.3.2 → fixed in 2.3.2
• Packagist phpoffice/phpspreadsheet: >= 3.3.0, < 3.4.0 → fixed in 3.4.0
• Packagist phpoffice/phpexcel: <= 1.8.2 (no fix yet)
Description
Summary
The XmlScanner class has a scan method which should prevent XXE attacks.
However, we found another bypass than the previously reported `CVE-2024-47873`, the regexes from the findCharSet method, which is used for determining the current encoding can be bypassed by using a payload in the encoding UTF-7, and adding at end of the file a comment with the value `encoding="UTF-8"` with `"`, which is matched by the first regex, so that `encoding='UTF-7'` with single quotes `'` in the XML header is not matched by the second regex:
```
$patterns = [
'/encoding\\s*=\\s*"([^"]*]?)"/',
"/encoding\\s*=\\s*'([^']*?)'/",
];
```
A payload for the `workbook.xml` file can for example be created with CyberChef')&input=Pz4KPCFET0NUWVBFIGZvbyBbCiAgPCFFTEVNRU5UIGZvbyBBTlkgPgogIDwhRU5USVRZIHh4ZSBTWVNURU0gImZpbGU6Ly8vZXRjL3Bhc3N3ZCIgPl0%2BCjxmb28%2BJnh4ZTs8L2Zvbz4K).
If you open an Excel file containing the payload from the link above stored in the `workbook.xml` file with PhpSpreadsheet, you will receive an HTTP request on `127.0.0.1:12345`. You can test that an HTTP request is created by running the `nc -nlvp 12345` command before opening the file containing the payload with PhpSpreadsheet.
To create the payload you need:
1. Create a file containing `setReadDataOnly(true);
$worksheetData = $reader->listWorksheetInfo($inputFileName);
foreach ($worksheetData as $worksheet) {
$sheetName = $worksheet['worksheetName'];
echo "$sheetName";
/ Load $inputFileName to a Spreadsheet Object /
$reader->setLoadSheetsOnly($sheetName);
$spreadsheet = $reader->load($inputFileName);
$worksheet = $spreadsheet->getActiveSheet();
print_r($worksheet->toArray());
}
```
• Run the following command: `php -S 127.0.0.1:8080`
• Add the payload.xlsx file in the folder and open in a browser. You will see an HTTP request on netcat .
Impact
An attacker can bypass the sanitizer and achieve an XXE attack_Processing).
Related
Alias · CVE (1)
- CVE-2024-48917 PhpSpreadsheet is a PHP library for reading and writing spreadsheet files. vulnerability
Weakness · CWE (1)
- CWE-611 Improper Restriction of XML External Entity Reference weakness
References
- https://github.com/PHPOffice/PhpSpreadsheet/security/advisories/GHSA-7cc9-j4mv-vcjp web
- https://nvd.nist.gov/vuln/detail/CVE-2024-48917 advisory
- https://github.com/PHPOffice/PhpSpreadsheet package
- https://github.com/PHPOffice/PhpSpreadsheet/blob/39fc51309181e82593b06e2fa8e45ef8333a0335/src/PhpSpreadsheet/Reader/Security/XmlScanner.php web
- https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing web