Files
ARTEX/skills/php2shell/SKILL.md
BaaRai 750f4eb091 feat(skill): php2shell - gated session.upload_progress LFI-to-RCE skill with vendored PoCs
Implements #109. Skills ship the chain-1 workflow (session file injection
through upload_progress filename + app LFI -> RCE, CVE-2026-109618/109619)
with hard gates: authorized targets only, program zero-day policy checked
before any live attempt (patches landed 2026-10-21 for 8.2-8.5), passive
detection before exploitation, lab-first practice via the vendored docker
lab, chains 2/3 (UAF, serializer mismatch) marked lab-only, one-shot
verification with a marker. Upstream PoCs vendored under scripts/poc/php2shell
with attribution and the MIT notice (upstream declares MIT in its README).
2026-10-21 14:52:40 +02:00

3.5 KiB

name, description
name description
php2shell Invoke this skill when a task holds an LFI/file-inclusion finding on a PHP target (or needs to assess one) and the target may run PHP 5.4-8.5.11 with default session.upload_progress settings: turns a read-only LFI into verified RCE via the session-file-injection chain (CVE-2026-109618/109619), lab-first and gated by program policy. Also covers passive detection of the vulnerable configuration.

php2shell: session.upload_progress LFI-to-RCE (CVE-2026-109618/109619)

Under an authorized engagement only. This skill upgrades an existing LFI/unsafe-include finding on a PHP target into RCE, or classifies the target as not affected, using the vendored PoCs under scripts/poc/php2shell/ (upstream: ikow/php2shell-poc, MIT; see the LICENSE there).

Hard gates (read before touching any target)

  1. Authorization: the target must be inside the task's authorized scope.
  2. Program policy first: many programs exclude or do not pay for recently-patched third-party/framework zero-days within ~14 days of the patch release. PHP patched these in 8.2.35/8.3.36/8.4.27/8.5.12 (2026-10-21). CHECK the program's policy on component zero-days BEFORE testing a live target, and reflect the policy in how the finding is claimed (often "reportable, not payable" or payable only after the clause lapses).
  3. Detection before exploitation: fingerprint passively first (response headers, error pages, X-Powered-By). Only targets on PHP 5.4.0-8.5.11 (any build with session.upload_progress enabled, the default) are candidates.
  4. Lab first: run chain 1 against the local lab (lab/setup.sh builds a vulnerable PHP 8.2 FPM+nginx environment) until the mechanism is understood, then one-shot the authorized target.
  5. Chains 2 and 3 (var_destroy UAF, serializer mismatch) are LAB-ONLY: never fire memory-corruption or serializer-confusion primitives at a remote target. Detection of their preconditions is fine.
  6. One-shot verification on the target: prove execution once (a marker echo), capture evidence, stop. No persistence, no further exploration through the shell.

Chain 1 workflow (session file injection + LFI -> RCE)

  1. Start with the task's LFI finding: note the include path parameter and its constraints (prefix/suffix, truncation, wrapper filters).
  2. Confirm the session path is reachable through that LFI: with session.upload_progress.enabled=On (default), an in-flight multipart POST with an attacker-named file field writes a session file under the session save path containing the raw filename.
  3. Inject PHP into the uploaded filename (not the file content): verify_session_injection.py demonstrates the full mechanics (session fixation via POST body PHPSESSID, raw filename storage, inclusion).
  4. Race the session file's lifetime: include it through the LFI while the upload is still in flight (or keep the upload connection open).
  5. Verify RCE with a single marker command; record the request sequence as evidence.

Detection without an LFI

The chains need an app-level file-inclusion primitive; without one the configuration is hardening-relevant, not exploitable. Report posture only.

Vendored artifacts

  • poc/verify_session_injection.py - chain 1 end-to-end against a lab URL
  • poc/verify_handler_mismatch.py - chain 3 (lab only)
  • poc/verify_uaf_asan.php - chain 2 under an ASAN PHP build (lab only)
  • lab/setup.sh - builds the vulnerable docker lab locally
  • docs/ANALYSIS.md, README.upstream.md - the upstream technical writeup