Lucene search
+L

WordPress Divi Form Builder CVE-2026-5118 detection

🗓️ 26 Jul 2026 08:19:05Reported by KittySploitType 
kittysploit
 kittysploit
🔗 kittysploit.com👁 1 Views

Unauthenticated privilege escalation in Divi Form Builder via de_fb_ajax_submit_ajax_handler.

Related
Refs
Code
ReporterTitlePublishedViews
Family
githubexploit
GithubExploit
Exploit for CVE-2026-5118
22 Sep 202623:45
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-5118
21 May 202613:08
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-5118
13 Jul 202605:45
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-5118
21 May 202610:12
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-5118
21 May 202622:45
–githubexploit
githubexploit
GithubExploit
Exploit for CVE-2026-5118
22 May 202607:53
–githubexploit
attackerkb
attackerkb
CVE-2026-5118
21 May 202611:32
–attackerkb
circl
Circl
CVE-2026-5118
21 May 202611:00
–circl
cnnvd
CNNVD
WordPress plugin Divi Form Builder 安全漏洞
21 May 202600:00
–cnnvd
cve
CVE
CVE-2026-5118
21 May 202611:32
–cve
Rows per page
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""CVE-2026-5118 — Divi Form Builder unauthenticated privilege escalation detection."""

import re
from typing import Optional, Tuple

from kittysploit import *
from lib.protocols.http.http_client import Http_client
from lib.protocols.http.wordpress import Wordpress


class Module(Scanner, Http_client, Wordpress):
    __info__ = {
        "name": "WordPress Divi Form Builder CVE-2026-5118 detection",
        "description": (
            "Detects Divi Engine Divi Form Builder and flags versions <= 5.1.2 "
            "affected by CVE-2026-5118 (unauthenticated admin creation via "
            "de_fb_ajax_submit_ajax_handler role=administrator). Looks for "
            "fb_nonce / de_fb_obj markers and plugin assets. Fixed in 5.1.3+."
        ),
        "author": ["KittySploit Team"],
        "severity": "critical",
        "cve": "CVE-2026-5118",
        "references": [
            "https://nvd.nist.gov/vuln/detail/CVE-2026-5118",
            "https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/divi-form-builder/divi-form-builder-512-unauthenticated-privilege-escalation-via-role",
            "https://diviengine.com/divi-form-builder-changelog/",
            "https://nefariousplan.com/posts/divi-form-builder-cve-2026-5118-administrator-existed",
        ],
        "modules": [
            "auxiliary/admin/http/wp_plugin_divi_form_builder_cve_2026_5118",
        ],
        "tags": [
            "web",
            "scanner",
            "wordpress",
            "divi",
            "divi-form-builder",
            "privilege-escalation",
            "cve-2026-5118",
        ],
        "agent": {
            "risk": "active",
            "effects": ["network_probe"],
            "expected_requests": 4,
            "reversible": True,
            "approval_required": False,
            "produces": ["tech_hints", "risk_signals", "endpoints"],
            "cost": 1.0,
            "noise": 0.2,
            "value": 1.0,
            "requires": {
                "min_endpoints": 0,
                "min_params": 0,
                "tech_hints_any": ["wordpress", "divi"],
                "tech_hints_all": [],
                "specializations_any": [],
                "risk_signals_any": [],
                "auth_session": False,
                "capabilities_any": [],
                "capabilities_all": [],
                "confidence_min": {},
                "confidence_min_any": {},
                "endpoint_pattern_any": [
                    "/wp-admin/admin-ajax.php",
                    "/wp-content/plugins/divi-form-builder/",
                ],
                "param_any": ["fb_nonce", "role"],
                "api_surface_ready": False,
            },
            "chain": {
                "produces_capabilities": [
                    {"capability": "admin_access", "from_detail": "wordpress"},
                ],
                "consumes_capabilities": [],
                "option_bindings": {},
                "suggested_followups": [
                    "auxiliary/admin/http/wp_plugin_divi_form_builder_cve_2026_5118",
                ],
            },
        },
    }

    _PLUGIN_SLUG = "divi-form-builder"
    _MAX_AFFECTED = (5, 1, 2)
    _NONCE_RES = (
        re.compile(r'fb_nonce["\']?\s*[:=]\s*["\']([^"\']+)', re.I),
        re.compile(r'name=["\']fb_nonce["\'][^>]*value=["\']([^"\']+)', re.I),
        re.compile(r'"fb_nonce"\s*:\s*"([a-f0-9]+)"', re.I),
    )

    path = OptString("/", "WordPress base path", required=False)
    probe_paths = OptString(
        "/",
        "Comma-separated paths to scan for fb_nonce (in addition to /)",
        required=False,
        advanced=True,
    )

    def _base(self) -> str:
        return self.wp_normalize_base_path(str(self.path or "/"))

    def _join(self, suffix: str) -> str:
        root = self._base()
        if not suffix.startswith("/"):
            suffix = "/" + suffix
        if root == "/":
            return suffix
        return root.rstrip("/") + suffix

    def _timeout(self) -> int:
        return max(int(self.timeout or 15), 10)

    def _find_nonce(self, html: str) -> Optional[str]:
        for pattern in self._NONCE_RES:
            match = pattern.search(html or "")
            if match:
                return match.group(1)
        return None

    def _looks_like_dfb(self, html: str) -> bool:
        text = (html or "").lower()
        markers = (
            "fb_nonce",
            "de_fb_obj",
            "de_fb_ajax",
            "divi-form-builder",
            "divi_form_builder",
            "de-fb-",
        )
        return any(m in text for m in markers)

    def run(self):
        version = self.wp_plugin_version(self._PLUGIN_SLUG, self._base())
        nonce_found = False
        dfb_surface = False

        paths = ["/"]
        extra = str(self.probe_paths or "").strip()
        if extra:
            for part in extra.split(","):
                part = part.strip()
                if part and part not in paths:
                    paths.append(part)

        for path in paths:
            response = self.http_request(
                method="GET",
                path=self._join(path),
                allow_redirects=True,
                timeout=self._timeout(),
            )
            if not response or response.status_code != 200:
                continue
            html = response.text or ""
            if self._looks_like_dfb(html):
                dfb_surface = True
                print_info(f"Divi Form Builder markers at {path}")
            if self._find_nonce(html):
                nonce_found = True
                print_success(f"fb_nonce present at {path}")

        # Asset probe
        asset = self.http_request(
            method="GET",
            path=self._join(f"/wp-content/plugins/{self._PLUGIN_SLUG}/readme.txt"),
            allow_redirects=True,
            timeout=self._timeout(),
        )
        if asset and asset.status_code == 200 and "divi" in (asset.text or "").lower():
            dfb_surface = True
            if not version:
                version = self.wp_extract_version_from_readme(asset.text or "") or version

        if not dfb_surface and not version:
            print_error("Divi Form Builder not detected")
            return False

        print_success("Divi Form Builder surface detected")
        if version:
            print_info(f"Version: {version}")
            vt = self.wp_version_to_tuple(version)
            if vt and vt <= self._MAX_AFFECTED:
                self.set_info(
                    severity="critical",
                    cve="CVE-2026-5118",
                    reason=(
                        f"Divi Form Builder {version} <= 5.1.2 "
                        f"(fb_nonce={'yes' if nonce_found else 'no'})"
                    ),
                )
                print_warning("Version in CVE-2026-5118 affected range")
                return True
            self.set_info(
                severity="info",
                reason=f"Divi Form Builder {version} appears patched (>= 5.1.3)",
            )
            print_success("Version appears patched for CVE-2026-5118")
            return False

        # No version — nonce alone is enough to suggest active exploit path
        if nonce_found:
            self.set_info(
                severity="high",
                cve="CVE-2026-5118",
                reason=(
                    "fb_nonce / Divi Form Builder present; version unknown "
                    "(confirm with auxiliary)"
                ),
                confidence="medium",
            )
            print_warning("Plugin markers + fb_nonce — version unknown")
            return False

        self.set_info(
            severity="medium",
            cve="CVE-2026-5118",
            reason="Divi Form Builder likely present; fb_nonce not found on probed paths",
            confidence="low",
        )
        print_info("Plugin likely present; try more probe_paths or run the auxiliary")
        return False

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation

29 Sep 2026 10:07Current
5.7Medium risk
Vulners AI Score5.7
CVSS 3.19.8
EPSS0.00528
SSVC
1