🐘

php2shell

Security Auditor

Probes PHP for the php2shell multipart crash bug

Security
200 credits
Per check
~30 seconds
Average runtime
Active
Status

Runs on your verified domains

php2shell probes a site for weaknesses, so it only runs on domains your organization has proven it owns, by email, a DNS record or a file on the site. That keeps it from being pointed at someone else's site.

How it works

  1. Control request β€” sends a minimal, well-formed multipart POST to the audited URL and records how the server answers (and whether it is phpMyAdmin, which the scanner retargets).

  2. Probes β€” sends up to three crafted multipart bodies designed to trip the parser, stopping early as soon as it has a verdict.

  3. Crash detection β€” looks for an in-band PHP fatal error, an empty 500/200 body where the control produced output, or a 502/503/504 from the server fronting PHP-FPM.

  4. Version fallback β€” when no crash is observed, reads the X-Powered-By banner and compares it with the fixed releases.

  5. Verdict β€” the scanner returns one verdict (VULNERABLE, FIXED, NO SIGNAL, INCONCLUSIVE or ERROR), which this auditor maps to a single result.

Preferences

KeyTypeDefaultDescription
sapistringautoWhich verdict rules to use: auto, mod_php or fpm. auto lets the scanner infer the server mode; set mod_php or fpm when you know it to sharpen the crash signal. An invalid value falls back to auto.
timeoutSecondsinteger20Per-request timeout for the scanner, 5–120. The scan sends a control request plus up to three probes in sequence, so keep it well under two minutes. An out-of-range or invalid value falls back to 20.

What this auditor validates

  • Whether the PHP request handler can be crashed by a crafted multipart/form-data body (the core of CVE-2026-109618 / CVE-2026-109619).

  • The advertised PHP version, as a fallback, when the probes produce no crash signal: a patched release passes, an unpatched one fails.

  • It inspects only the audited page for a block (HTTP 403 / 429 / Cloudflare challenge); the probes are part of the audited request, not separate paths.

Every row maps to one checkRule* method and one CheckCode. CheckCode suffixes use status ranges: 100 information, 200–299 success, 300–399 warning, 400–499 fail, 500–599 error.

CheckCodeStatusWhen it firesRecommendationWhy it matters
37A-Php2ShellAuditor-100INFORMATIONAlways. Records the CVEs and the fixed PHP versions this auditor probes for.β€” (recommendation is null; nothing for the site to change)β€”
37A-Php2ShellAuditor-200SUCCESSVerdict FIXED: no crash observed and X-Powered-By reports a patched PHP release.β€”β€”
37A-Php2ShellAuditor-201SUCCESSVerdict NO SIGNAL: no crash observed; the server advertises no PHP version, but nothing indicates a vulnerability.β€”β€”
37A-Php2ShellAuditor-300WARNINGVerdict INCONCLUSIVE: the control request returned HTTP 5xx, or a probe was rejected before PHP parsed it, so no firm verdict was reached.Re-run the audit; if a WAF or proxy rejected the probe, test the PHP origin directly so its patch level for CVE-2026-109618 / CVE-2026-109619 can be confirmed.An inconclusive probe leaves the CVE status unknown, so the server may still be exposed to the crash; treat it as unverified rather than safe and re-run or test the origin directly.
37A-Php2ShellAuditor-400FAILVerdict VULNERABLE: a probe crashed the PHP request handler, or the advertised PHP version is unpatched.Upgrade PHP on {host} to a fixed release for your branch (PHP 8.2.35, 8.3.36, 8.4.27 or 8.5.12) and restart PHP-FPM or Apache.An unauthenticated request can crash the PHP worker handling it, so a handful of requests take the site down (denial of service), and the memory corruption behind the crash can open the door to worse.
37A-Php2ShellAuditor-500ERRORVerdict ERROR: the scan could not run against the target (could not connect, resolve or normalize the URL).Make {url} reachable over HTTP(S) and re-run the audit.β€”
37A-Php2ShellAuditor-590ERRORThe audited page answered HTTP 403, HTTP 429 or a Cloudflare challenge, so 37AuditsBot was blocked before it could read the page.Allow 37AuditsBot in your firewall or bot protection: allowlist its user agent, or verify its Web Bot Auth signature. See https://www.37audits.com/bot.While 37AuditsBot is blocked this audit cannot look at the site, so problems on it go unreported.

Output Documentation

StatusDescriptionTest logic
SUCCESSNot affectedNo crash and a patched X-Powered-By (200), or no crash and no version signal (201).
WARNINGCould not confirmThe scan was inconclusive β€” control HTTP 5xx, or a probe rejected before PHP parsed it (300).
FAILVulnerableA probe crashed the request handler, or the advertised PHP version is unpatched (400).
ERRORThe auditor could not checkThe scan could not run against the target (500); the site blocked 37AuditsBot (590).
INFORMATIONReferenceThe CVEs and fixed PHP versions this auditor probes for (100); never changes the result.

Risks and Considerations

This probe can crash PHP workers

  • The probes are the actual exploit payloads: on a vulnerable server they crash the PHP worker handling the request. Only run this against sites you own or are authorized to test β€” which is why it is gated on domain verification and is off for anonymous previews.

A clean result is not a guarantee

  • NO SIGNAL means the probes did not crash the server and no PHP version was advertised. It is reported as a pass, but it is not proof of safety: confirm the running PHP version is at least the fixed release.

  • INCONCLUSIVE means a WAF, proxy or server error stopped the scan from reaching a verdict. The server may still be exposed β€” re-run, or test the PHP origin directly.

Verify findings with a human

  • This auditor wraps Assetnote's php2shell-scanner and infers the verdict from the server's responses, so a result can be wrong in either direction: a WAF, proxy or load balancer can absorb a crash and look like a pass, and an unrelated 5xx can look like a crash. Before you act on a FAIL β€” or rely on a SUCCESS β€” have a person confirm it against the host (check the running PHP version and the server logs for the probe requests).

Why it matters

  • The bug lets an unauthenticated request crash the PHP process, so a few requests can take a site down (denial of service).

  • The memory corruption behind the crash raises the risk of worse outcomes than a crash, so patching promptly matters.

This documentation is built and hosted on Mintlify, a developer documentation platform.

Source: docs.37audits.com

Ready to start auditing?

Add this auditor to your monitoring setup and start identifying issues on your websites today.

Β© 2026 37 Audits. All rights reserved. Audit your websites with confidence.

Supported by

Made with ❀️ in Floripa