phpSysInfo IP Allowlist Bypass via X-Forwarded-For Spoofing — CVE-2026-55584
by Muhammed Mirac Kayıkci (github.com/mirackayikci) · 2026-07-05
- Severity
- High
- CVE
- CVE-2026-55584 / GHSA-786w-p5pm-cvgh
- Category
- web
- Affected product
- phpSysInfo
- Affected versions
- <= 3.4.5 (fixed in 3.4.6, commit 019fa2d)
- Disclosed
- 2026-07-05
- Patch status
- patched
Tags
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | Unknown |
| Author / Researcher | Muhammed Mirac Kayıkci (github.com/mirackayikci) |
| CVE / Advisory | CVE-2026-55584 / GHSA-786w-p5pm-cvgh |
| Category | web |
| Severity | High |
| CVSS Score | 7.5 |
| Status | PoC |
| Tags | phpsysinfo, ip-spoofing, x-forwarded-for, access-control-bypass, cwe-290, information-disclosure |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | phpSysInfo |
| Versions Affected | <= 3.4.5 (fixed in 3.4.6, commit 019fa2d) |
| Language / Platform | PHP |
| Authentication Required | No |
| Network Access Required | Yes (HTTP access to xml.php) |
Summary
phpSysInfo’s PSI_ALLOWED IP allowlist feature determines the client IP by checking the attacker-controlled X-Forwarded-For header first, then Client-IP, and only falls back to the trustworthy REMOTE_ADDR socket address last. Because there is no concept of a trusted reverse proxy, any client can simply set an X-Forwarded-For (or Client-IP) header to an address present in the allowlist and be granted access, completely defeating the IP restriction and exposing full system information via xml.php.
Vulnerability Details
Root Cause
| |
CWE-290: Authentication Bypass by Spoofing — the code trusts client-supplied headers over the actual TCP-layer source address, with no trusted-proxy allowlist concept.
Attack Vector
- Attacker identifies (or guesses, e.g.
8.8.8.8) an IP address present in the target’sPSI_ALLOWEDconfiguration. - Attacker sends a request to
xml.phpwith anX-Forwarded-For(orClient-IP) header set to that allowed address. read_config.phpresolves the client IP from the spoofed header instead ofREMOTE_ADDR.- The allowlist check passes, and phpSysInfo returns full system information in the XML response.
Impact
Unauthenticated bypass of the intended IP-based access restriction, exposing detailed system/hardware/software information (CPU, memory, mounted filesystems, network interfaces, running services, OS/kernel version, etc.) to any remote attacker — useful for reconnaissance and further targeted attacks.
Environment / Lab Setup
Target: phpSysInfo <= 3.4.5 with PSI_ALLOWED configured to restrict xml.php to specific IP(s)
Attacker: curl (or any HTTP client capable of setting custom headers)
Proof of Concept
PoC Script
No standalone script is provided upstream — see
upstream-notes.mdin this folder for the original write-up. The PoC is the exactcurlcommands below, copied from the source repository.
| |
The first request is denied because the real source IP is not in the allowlist; the second and third requests spoof an allowed IP via X-Forwarded-For/Client-IP and successfully bypass the restriction, returning the full phpSysInfo XML output.
Detection & IOCs
Signs of compromise:
- Requests to
xml.phpcarryingX-Forwarded-FororClient-IPheaders set to allowlisted IPs while the true connecting peer differs - Repeated probing of
xml.phpwith varying spoofed IP header values - Unexpected disclosure of internal system information observed being scraped/exfiltrated
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update to phpSysInfo 3.4.6+ (commit 019fa2d), which defaults to REMOTE_ADDR and only honors X-Forwarded-For/Client-IP when the request comes from a configured trusted proxy |
| Interim mitigation | If upgrading is not immediately possible, disable the PSI_ALLOWED IP-based restriction in favor of authentication, or ensure phpSysInfo is not directly reachable from untrusted networks (place behind a properly configured, trusted-only reverse proxy) |
References
Notes
Mirrored from https://github.com/mirackayikci/CVE-2026-55584 on 2026-07-05. This entry has no dedicated PoC script in the source repository — the upstream README (copied here as upstream-notes.md) documents the vulnerability entirely through the curl commands reproduced above and a code excerpt.