Ad Inserter <= 2.8.16 - Insecure Direct Object Reference to Authenticated (Contributor+) Arbitrary Post Content Disclosure via 'data' Shortcode Attribute
Description
The Ad Inserter – Ad Manager & AdSense Ads plugin for WordPress is vulnerable to Insecure Direct Object Reference in versions up to and including 2.8.16 via the 'data' attribute of the [adinserter] shortcode. This is due to the replace_ai_tags() function processing a {reusable-block-N} tag pattern that calls get_post_field('post_content', N) without verifying the requesting user's capability with current_user_can('read_post'), without restricting the post type to 'wp_block', and without checking the post status. This makes it possible for authenticated attackers, with Contributor-level access and above, to read the full content of arbitrary posts including Private, Draft, Pending, Trashed, and password-protected posts owned by other users, by placing the shortcode in a post they own and previewing it.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:NTechnical Details
What Changed in the Fix
Changes introduced in v2.8.17
Source Code
WordPress.org SVNThis research plan outlines the steps to demonstrate the Insecure Direct Object Reference (IDOR) vulnerability in the Ad Inserter plugin (CVE-2026-11900), which allows authenticated users (Contributor+) to disclose the content of arbitrary posts via a shortcode attribute. ### 1. Vulnerability Summa…
Show full research plan
This research plan outlines the steps to demonstrate the Insecure Direct Object Reference (IDOR) vulnerability in the Ad Inserter plugin (CVE-2026-11900), which allows authenticated users (Contributor+) to disclose the content of arbitrary posts via a shortcode attribute.
1. Vulnerability Summary
The Ad Inserter plugin's replace_ai_tags() function is responsible for expanding various dynamic tags (placeholders) within ad block configurations and shortcodes. In versions up to and including 2.8.16, this function processes a {reusable-block-N} tag pattern where N is a post ID. The function retrieves the content using get_post_field('post_content', N) but fails to verify if the current user has permissions to read that specific post, nor does it restrict the post type to wp_block.
By placing the [adinserter] shortcode in a post and using the data attribute with this tag, a Contributor (who can create and preview their own posts) can force the server to fetch and display the content of any post (Drafts, Private, Password-protected) in the preview.
2. Attack Vector Analysis
- Entry Point:
[adinserter]shortcode. - Vulnerable Parameter: The
dataattribute. - Payload:
{reusable-block-POST_ID}. - Authentication: Authenticated, Contributor level or higher.
- Precondition: At least one Ad Inserter block must be configured to output the
datacontent (using the{#}or{DATA}tag). This is a standard feature used to pass dynamic data to ad blocks.
3. Code Flow
- Contributor creates a post containing:
[adinserter block="X" data="{reusable-block-Y}"]. - When the post is previewed, WordPress calls the shortcode handler for
adinserter. - The handler (likely
ai_shortcode) parses the attributes, includingdata. - The plugin's rendering engine calls
replace_ai_tags()on thedatavalue. replace_ai_tags()identifies the{reusable-block-Y}pattern.get_post_field('post_content', Y)is called without checkingcurrent_user_can('read_post', Y).- The content of post
Yis inserted into thedatavariable. - If Block
Xis configured with the{#}tag, the plugin replaces{#}with the "data" (the secret post content). - The rendered preview displays the content of post
Y.
4. Nonce Acquisition Strategy
This exploit does not target a specific AJAX or Admin action but rather a shortcode processed during post rendering.
- Saving/Creating the Post: Requires the standard WordPress
_wpnoncefor post updates. - Triggering the Leak: Occurs via a GET request to the post's preview URL. No plugin-specific nonce is required for shortcode execution.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.