Dooodl <= 2.3.0 - Reflected Cross-Site Scripting
Description
The Dooodl plugin for WordPress is vulnerable to Reflected Cross-Site Scripting in versions up to, and including, 2.3.0 due to insufficient input sanitization and output escaping. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that execute if they can successfully trick a user 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:C/C:L/I:L/A:NTechnical Details
# Exploitation Research Plan - CVE-2025-68871 (Dooodl) ## 1. Vulnerability Summary The **Dooodl** plugin for WordPress (versions <= 2.3.0) is vulnerable to **Reflected Cross-Site Scripting (XSS)**. The vulnerability exists because the plugin accepts user-controlled input via URL parameters and refl…
Show full research plan
Exploitation Research Plan - CVE-2025-68871 (Dooodl)
1. Vulnerability Summary
The Dooodl plugin for WordPress (versions <= 2.3.0) is vulnerable to Reflected Cross-Site Scripting (XSS). The vulnerability exists because the plugin accepts user-controlled input via URL parameters and reflects it into the web page without proper sanitization (using sanitize_text_field or similar) or context-aware escaping (using esc_html, esc_attr, or esc_js). This allows an unauthenticated attacker to execute arbitrary JavaScript in the context of a user's browser session by tricking them into clicking a crafted link.
2. Attack Vector Analysis
- Endpoint: Any frontend page or post containing the
[dooodl]shortcode, or plugin-specific display pages. - Vulnerable Parameter:
id(inferred) ordoodle(inferred). - Authentication: None (Unauthenticated).
- Preconditions: A page must be published containing the
[dooodl]shortcode to trigger the vulnerable code path.
3. Code Flow (Inferred)
- Entry Point: The user visits a URL such as
http://site.com/?id=<payload>. - Processing: The plugin's shortcode handler (likely registered via
add_shortcode( 'dooodl', ... )) or a frontend initialization hook (likeinitorwp_enqueue_scripts) accesses the parameter directly via$_GET['id']. - Variable Assignment: The raw value is assigned to a variable used for rendering the drawing canvas or passed to a localized JavaScript object.
- Sink: The value is echoed into the HTML. Common sinks in this plugin type include:
- Inside an HTML attribute:
echo '<div id="dooodl-' . $_GET['id'] . '">'; - Inside a script tag via
wp_localize_script:wp_localize_script('dooodl-js', 'dooodl_vars', array('id' => $_GET['id'])); - Inside a hidden input field.
- Inside an HTML attribute:
4. Nonce Acquisition Strategy
Reflected XSS in GET parameters typically occurs during the initial page render and often does not require a nonce for the reflection itself. However, if the plugin requires a nonce to initialize its scripts, follow this strategy:
- Identify Shortcode: The primary shortcode is
[dooodl]. - Setup Page: Create a test page with the shortcode to ensure all plugin assets and parameters are loaded.
- Identify JS Variable: Look for the localization key. Based on common patterns, it is likely
dooodl_settingsordooodl_params(inferred). - Extraction:
- Use
browser_navigateto the page. - Use
browser_eval("window.dooodl_params?.nonce")(inferred) to check for available nonces if needed for subsequent AJAX actions.
- Use
5. Exploitation Strategy
- Discovery: Locate a page with the
[dooodl]shortcode. - Payload Crafting:
- If reflected in an attribute:
?id=123" onmouseover="alert(domain)" - If reflected in a JS block:
?id=123"};alert(document.domain);// - Generic breakout:
?id="><script>alert(document.domain)</script>
- If reflected in an attribute:
- Request: Perform a GET request to the target page with the payload using
http_request. - Verification: Search the response body for the unescaped payload string.
6. Test Data Setup
- Requirement: The plugin must be active.
- Post Creation:
wp post create --post_type=page --post_title="Doodle Page" --post_status=publish --post_content='[dooodl]' - Note the URL: The resulting page URL (e.g.,
/doodle-page/) will be the target for the reflection.
7. Expected Results
- The HTTP response should contain the literal payload string.
- Example: If the request is
GET /doodle-page/?id=%22%3E%3Cscript%3Ealert(1)%3C/script%3E, the source code of the returned page should contain"><script>alert(1)</script>instead of properly encoded">....
8. Verification Steps
- Manual Source Check:
# Use the execution agent's http_request to fetch the page # Look for the payload in the raw HTML response - Browser Confirmation: Use the
browser_navigatetool to the crafted URL and check for an alert dialog or evidence of script execution in the console/DOM.
9. Alternative Approaches
- Search Parameter: Check if the plugin registers a custom query variable for searching doodles (e.g.,
?s_doodle=<payload>). - Admin Reflection: Check if the
idparameter is reflected in the WordPress admin dashboard (e.g.,wp-admin/admin.php?page=dooodl&id=<payload>). This would require an active admin session but would increase severity. - AJAX Reflection: If the reflection happens via an AJAX call, check
admin-ajax.php?action=dooodl_get_data&id=<payload>. This would likely require thenoprivhandler for unauthenticated access.
Summary
The Dooodl plugin for WordPress is vulnerable to Reflected Cross-Site Scripting (XSS) in versions up to and including 2.3.0. This vulnerability exists because the plugin fails to properly sanitize user-controlled input from URL parameters before reflecting it back into the page, allowing attackers to execute arbitrary JavaScript in the context of a victim's browser.
Exploit Outline
The exploit targets unauthenticated users visiting a page containing the [dooodl] shortcode. An attacker crafts a malicious link targeting a page with this shortcode and appends a payload to a vulnerable GET parameter (likely 'id' or 'doodle'), such as ?id="><script>alert(document.domain)</script>. When a victim clicks the link, the plugin reflects the unescaped payload into the HTML response—potentially within an HTML attribute like a div ID or inside a script localization block—causing the browser to execute the injected script.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.