CVE-2026-3425

RTMKit Addons for Elementor <= 2.0.2 - Authenticated (Author+) Local File Inclusion via 'path'

highImproper Control of Filename for Include/Require Statement in PHP Program ('PHP Remote File Inclusion')
8.8
CVSS Score
8.8
CVSS Score
high
Severity
2.0.3
Patched in
2d
Time to patch

Description

The RTMKit Addons for Elementor plugin for WordPress is vulnerable to Local File Inclusion in all versions up to, and including, 2.0.2 via the 'path' parameter of the 'get_content' AJAX action. This makes it possible for authenticated attackers, with Author-level access and above, to include and execute arbitrary PHP files on the server, allowing the execution of any PHP code in those files. This can be used to bypass access controls, obtain sensitive data, or achieve code execution in cases where PHP files can be uploaded and included.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=2.0.2
PublishedMay 12, 2026
Last updatedMay 13, 2026

What Changed in the Fix

Changes introduced in v2.0.3

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

Sorry, I cannot fulfill your request. I am prohibited from generating actionable exploitation plans or payloads for specific vulnerabilities. You may want to search for WordPress security best practices and secure coding guidelines online.

Sorry, I cannot fulfill your request. I am prohibited from generating actionable exploitation plans or payloads for specific vulnerabilities. You may want to search for WordPress security best practices and secure coding guidelines online.

Research Findings
Static analysis — not yet PoC-verified

Summary

The RTMKit Addons for Elementor plugin for WordPress is vulnerable to Local File Inclusion via the 'get_content' AJAX action. Authenticated attackers with Author-level access or higher can exploit this by providing directory traversal sequences in the 'path' parameter, allowing them to include and execute arbitrary PHP files on the server.

Vulnerable Code

/* Inc/Core/PluginApi.php:50 */
    public function get_content()
    {
        check_ajax_referer('rtmkit_nonce', 'nonce');

        if (!isset($_POST['path'])) {
            wp_send_json_error('Path not specified.');
            return;
        }
        $path = sanitize_text_field($_POST['path']);
        $file = RTM_KIT_DIR . 'views/' . $path . '.php';
        if (!file_exists($file)) {
            return '';
        }
        ob_start();
        require_once $file;
        $content = ob_get_clean();
        wp_send_json_success($content);
    }

Security Fix

--- /home/deploy/wp-safety.org/data/plugin-versions/rometheme-for-elementor/2.0.2/Inc/Core/PluginApi.php	2026-02-20 04:32:18.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/rometheme-for-elementor/2.0.3/Inc/Core/PluginApi.php	2026-03-04 09:39:30.000000000 +0000
@@ -50,15 +56,23 @@
     public function get_content()
     {
         check_ajax_referer('rtmkit_nonce', 'nonce');
+        if (!current_user_can('manage_options')) {
+            wp_send_json_error('Access Denied.');
+            wp_die();
+        }
+        $path = sanitize_text_field($_POST['path']);
+        $menus = \RTMKit\Modules\Menu::instance()->get_menu_by_path($_POST['path']);
 
         if (!isset($_POST['path'])) {
             wp_send_json_error('Path not specified.');
             return;
         }
-        $path = sanitize_text_field($_POST['path']);
-        $file = RTM_KIT_DIR . 'views/' . $path . '.php';
-        if (!file_exists($file)) {
-            return '';
+
+        if (isset($menus['render_view']) && file_exists($menus['render_view'])) {
+            $file = $menus['render_view'];
+        } else {
+            wp_send_json_error('View file not found for the specified path.');
+            return;
         }
         ob_start();
         require_once $file;

Exploit Outline

1. Gain access to a WordPress account with Author-level privileges or higher (typically required to access the Elementor editor). 2. Extract a valid 'rtmkit_nonce' from the page source of the Elementor editor. 3. Send an authenticated POST request to /wp-admin/admin-ajax.php with the 'action' parameter set to 'get_content'. 4. Include the 'nonce' parameter with the extracted value. 5. Set the 'path' parameter to a directory traversal string targeting a PHP file (e.g., '../../../../wp-config'). The plugin automatically appends a '.php' extension to the provided path. 6. The server will include the target file via require_once, executing any PHP code within and returning the output inside a JSON response.

Check if your site is affected.

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