Scan for PHP2Shell and Node2Shell
PHP2Shell is a set of remote code execution vulnerabilities in PHP. Node2Shell is an out-of-bounds write vulnerability in the Node.js Brotli decoder. TotalAppSec detects both with six QIDs, grouped into two option profiles. The intrusive profile can crash an unpatched application, so use it only on patched systems or outside production.
New QIDs to detect PHP2Shell and Node2Shell
Six new QIDs detect PHP2Shell and Node2Shell. All six apply to both web applications and APIs. Four of them are non-intrusive, and two are intrusive.
Non-intrusive QIDs
These QIDs detect the vulnerabilities from the responses of the application and can be run in production.
|
QID |
Type |
Detection Title |
CVE IDs |
How the WAS Detects It |
|---|---|---|---|---|
|
520310 |
Potential |
PHP Remote Code Execution (RCE) Vulnerabilities |
CVE-2026-109618, CVE-2026-109619 |
Checks the PHP version in HTTP response headers, such as X-Powered-By and Server, and in application cookies. |
|
533086 |
Confirmed |
PHP Remote Code Execution Vulnerability |
CVE-2026-109618, CVE-2026-109619 |
Sends a POST request with a session ID that contains an invalid character. A vulnerable PHP version uses the ID and returns an error; a patched version ignores it and generates its own. |
|
520404 |
Potential |
PHP Session Upload Progress Enabled Remote Code Execution Vulnerability |
CVE-2026-115560 |
Checks the PHP version in HTTP response headers, such as X-Powered-By and Server, and in application cookies. |
|
533203 |
Confirmed |
Node.js Brotli Decoder Out-Of-Bounds Write Vulnerability |
CVE-2026-111497 |
Sends an HTTP POST request with a crafted Brotli-compressed payload and determines from the response whether the target host is vulnerable. |
Intrusive QIDs
These QIDs send payloads that can crash an unpatched application. Run them only on patched systems or outside production.
|
QID |
Type |
Detection Title |
CVE IDs |
How the WAS Detects It |
|---|---|---|---|---|
|
533068 |
Confirmed |
PHP2Shell Active Crash Detection |
CVE-2026-109618, CVE-2026-109619 |
Sends large payloads to test for memory exhaustion. |
|
533085 |
Confirmed |
Node.js Brotli Decoder Out-Of-Bounds Write Vulnerability |
CVE-2026-111497 |
Sends a binary payload under repeated stress and evaluates server stability. A vulnerable Node.js instance returns |
Before enabling intrusive QIDs in production, evaluate the potential operational impact, obtain the necessary approvals, and perform testing within an approved maintenance window. Avoid running intrusive QIDs against unpatched or unverified production systems.
Option Profiles
Two system-generated option profiles are available for scanning trending CVEs, such as PHP2Shell and Node2Shell. Select one of these profiles when launching a scan.
|
Option Profile |
Description |
|---|---|
|
Trending Vulnerability Options |
The scan is launched with non-intrusive QIDs (520310, 533086, 520404, and 533203) to detect trending CVEs. |
|
Trending Vulnerability Intrusive Options |
The scan is launched with intrusive QIDs (533068 and 533085) to verify the fixes on patched systems. |
How to Scan
Perform the following steps to scan the web applications and APIs for PHP2Shell and Node2Shell:
-
Start a new vulnerability scan. For details, see Launch Vulnerability Scan - Basic Information.
-
Select the applications by name or by tag. For details, see Tagging Web Applications.
-
Select the Option Profile, depending on the applications selected. For details, see Launch Vulnerability Scan - Scan Settings.
-
Click Launch Scan. For details, see Launch Vulnerability Scan - Review and Confirm.
Fix the Detected Vulnerabilities
Perform the following steps to fix the vulnerabilities reported by the scan:
-
Review the detections for QIDs 520310, 533086, 520404, and 533203. Start with your internet-facing assets, and then fix each affected runtime.
-
Upgrade each affected runtime to a fixed version.
- PHP: 8.5.12, 8.4.27, 8.3.36, or 8.2.35. You can also use the backported build from your distribution.
- Node.js: 22.23.4, 24.22.1, or 26.12.1. If you are running an end-of-life branch, such as 25.x, 23.x, 21.x, or 20.x or older, upgrade to one of the mentioned versions.
If you cannot upgrade right away, apply an temporary mitigation and restrict access to the service until it is patched. For example, set
session.upload_progress.enabled=0or limit the Brotli payload size at the proxy.For the fixed versions and the temporary mitigation, see the vendor advisories, for example:
-
Restart the affected services, such as mod_php, PHP-FPM, php-cgi, FrankenPHP, LiteSpeed, and any long-running Node.js services. Until you restart them, the running processes keep the vulnerable code in memory.
-
Scan the same applications again with the Trending Vulnerability Intrusive Options option profile to confirm the fix. Run this scan only on patched systems or outside production, with the necessary approvals and within an approved maintenance window.
-
If the QID is still reported, the fix is incomplete. Verify that the patched runtime is serving requests, then fix the application and rerun the scan.
FAQs
The following table provides the option profiles that include each QID and whether the QID is included in an AI-powered scan.
|
QIDs |
Option Profiles Including These QIDs |
Included in an AI-powered scan? |
|---|---|---|
|
520310, 533086, 520404, and 533203 |
Core, OWASP Top 10, and Everything |
Yes |
|
533068 and 533085 |
Trending Vulnerability Intrusive Options |
No |
- Detection scope Core: Includes all non-intrusive QIDs to detect PHP2Shell and Node2Shell.
- Detection scope Everything: Yes. This scope includes all non-intrusive QIDs.
- Categories: A new Intrusive Checks category covers intrusive QIDs such as 533068 and 533085.
- Custom search lists: The Trending Vulnerability Search List covers QIDs 520310, 533086, and 520404. The Trending Intrusive Search List covers QIDs 533068 and 533085.
Does an AI-powered scan test for the new QIDs?Does an AI-powered scan test for the new QIDs?
Yes. An AI-powered scan ignores the detection scope of the option profile. It includes:
- Mandatory QIDs
- Representative QIDs
- New QIDs released after the clustering date
- Authentication, redundant-link, and URL-exclusion QIDs
- QIDs from past findings and their related groups (clusters), if the application has scan history
When can a scan miss these vulnerabilities?When can a scan miss these vulnerabilities?
Version-based checks can result in false negatives if web servers or proxies strip response headers and hide the PHP version. However, you can often adjust the version visibility by modifying specific variables (for example, expose_php = Off) in the PHP configuration file.
For the complete PHP2Shell workflow across your Qualys applications, refer to the Find and Fix PHP2Shell: Onboarding Guide.