
php2shell (CVE-2026-109618 और CVE-2026-109619) के लिए उच्च-निष्ठा स्कैनर
PHP अनुप्रयोगों में CVE-2026-109618 और CVE-2026-109619 का पता लगाने के लिए एक कमांड-लाइन टूल।
स्कैनर एक न्यूनतम multipart नियंत्रण अनुरोध भेजता है, जिसके बाद अधिकतम तीन तैयार किए गए multipart प्रोब भेजता है। प्रोब 62 स्तरों तक नेस्टेड PHP array कुंजियों का उपयोग करते हैं और 1 MiB से बढ़कर 20 MiB तक जाते हैं, जो Assetnote के आंतरिक स्कैनर द्वारा उपयोग किए जाने वाले पहचान तर्क से मेल खाता है।
किसी लक्ष्य को भेद्य तब रिपोर्ट किया जाता है जब प्रोब PHP मेमोरी-समाप्ति त्रुटि, एक विभेदक खाली HTTP 500, PHP-FPM वर्कर विफलता, या कोई घोषित PHP संस्करण जो असंशोधित (unpatched) ज्ञात है, उत्पन्न करता है। प्रारंभिक 5xx प्रतिक्रियाएँ, सामान्य अनुरोध-अस्वीकृति स्थितियाँ, और PHP fatal-error हस्ताक्षर के बिना गैर-रिक्त HTTP 500 प्रतिक्रियाएँ क्रैश संकेतों के रूप में नहीं मानी जाती हैं।
स्कैनर डिफ़ॉल्ट रूप से /index.php का परीक्षण करता है। URL में दिया गया पथ संरक्षित रहता है, और --path या --path-file से कस्टम पथों का परीक्षण किया जा सकता है। phpMyAdmin लक्ष्यों का स्वचालित रूप से /show_config_errors.php पर पुनः परीक्षण किया जाता है। रीडायरेक्ट का पालन नहीं किया जाता है।
डिफ़ॉल्ट --sapi auto मोड mod_php और PHP-FPM दोनों के निर्णय नियमों को लागू करता है, जो Assetnote के postmodules के संयुक्त व्यवहार से मेल खाता है। पहचान को किसी ज्ञात SAPI तक सीमित करने के लिए --sapi mod_php या --sapi fpm का उपयोग करें।
प्रत्येक परीक्षित पथ को एक 42-बाइट नियंत्रण अनुरोध और तीन प्रोब प्राप्त हो सकते हैं, जो कुल मिलाकर लगभग 29 MiB होते हैं। निर्णय तय होते ही प्रोबिंग रुक जाती है, और डुप्लिकेट इनपुट URL केवल एक बार स्कैन किए जाते हैं।
pip install -r requirements.txt
एकल होस्ट स्कैन करें:
python3 scanner.py -u https://example.com
होस्ट्स की एक सूची स्कैन करें:
python3 scanner.py -l hosts.txt
कई थ्रेड्स के साथ स्कैन करें और परिणाम सहेजें:
python3 scanner.py -l hosts.txt -t 20 -o results.json
कस्टम हेडर के साथ स्कैन करें:
python3 scanner.py -u https://example.com -H "Authorization: Bearer token" -H "Cookie: session=abc"
कस्टम पथ स्कैन करें:
python3 scanner.py -u https://example.com --path /phpinfo.php
python3 scanner.py -u https://example.com --path /index.php --path /admin.php
python3 scanner.py -u https://example.com --path-file paths.txt
केवल PHP-FPM निर्णय नियमों का उपयोग करें:
python3 scanner.py -u https://example.com --sapi fpm
-u, --url Single URL to check
-l, --list File containing hosts (one per line)
-t, --threads Number of concurrent threads (default: 10)
--timeout Request timeout in seconds (default: 60)
-o, --output Output file for results (JSON)
--all-results Save all results, not just vulnerable hosts
-k, --insecure Disable TLS certificate verification
-H, --header Custom header (can be used multiple times)
-v, --verbose Show verdict reasons and response snippets
-q, --quiet Only output vulnerable hosts
--no-color Disable colored output
--sapi Verdict rules: auto, mod_php, or fpm (default: auto)
--path Custom path to test (can be used multiple times)
--path-file File containing paths to test (one per line)
php2shell की पहली, मूल खोज Calif टीम को श्रेय दी जाती है। आप उनका लेख यहाँ पढ़ सकते हैं: https://calif.io/php2shell/.
स्कैनर को Assetnote Security Research Team ने Searchlight's Exposure Platform के लिए बनाए गए लॉजिक का उपयोग करके बनाया है।
परिणाम टर्मिनल पर प्रिंट होते हैं। -o का उपयोग करते समय, कमज़ोर होस्ट को verdict कारण और redacted HTTP request/response साक्ष्य के साथ एक JSON फ़ाइल में सहेजा जाता है।
विशिष्ट PHP कॉन्फ़िगरेशन पर, स्कैनर एक false positive रिपोर्ट कर सकता है जब इसका multipart probe PHP की memory_limit से अधिक हो जाता है। तब patched और कमज़ोर संस्करण समान खाली HTTP 500 प्रतिक्रिया लौटा सकते हैं।
यह patched PHP 8.4.27 पर 2M से 32M तक के memory_limit मानों के साथ, और PHP 8.3.36 पर 128M पर जब max_multipart_body_parts को 2785 या अधिक पर सेट किया गया हो, पुनरुत्पादित किया गया था। सटीक सीमा बिल्ड के बीच भिन्न हो सकती है।
जब PHP अपना संस्करण प्रकट नहीं करता है, तो स्कैनर इस सुरक्षित post-patch OOM को कमज़ोर pre-patch व्यवहार से अलग नहीं कर सकता। इसलिए परिणामों को स्थापित PHP संस्करण और किसी भी vendor backports के विरुद्ध सत्यापित किया जाना चाहिए