For the complete documentation index, see llms.txt. This page is also available as Markdown.

WordPress

Discovery

# Version in meta tag
curl -s http://TARGET | grep 'content="WordPress'

# Version in readme
curl -s http://TARGET/readme.html

# Login page
/wp-login.php
/wp-admin/

If the web root only exposes a default server dashboard but another service reveals WordPress credentials, test the host name or SMB share name as a web subdirectory:

http://TARGET/SHARE-NAME/
http://TARGET/SHARE-NAME/wp-login.php

This can uncover a WordPress installation that ordinary root-level content discovery missed. Use the recovered credentials at the discovered login page.

WordPress may also be buried beneath an unusual path that initially looks like static content. Recursive content discovery can expose WordPress markers such as wp-admin, wp-content, wp-includes, wp-login.php, and readme.html below that path:

http://TARGET/assets/fonts/blog/wp-admin/
http://TARGET/assets/fonts/blog/wp-content/
http://TARGET/assets/fonts/blog/wp-includes/
http://TARGET/assets/fonts/blog/wp-login.php

Follow redirects from those endpoints. A redirect may disclose the hostname WordPress expects:

Add the disclosed hostname to /etc/hosts, then use the complete nested WordPress root for subsequent enumeration:


WPScan Enumeration

If you have a plugin wordlist, brute force the plugin directory directly:

Useful hits:

WordPress REST API can also expose users:


Brute Force (WPScan)


Theme Editor RCE (Authenticated)

  1. Login as admin

  2. Appearance → Theme Editor

  3. Select inactive theme (e.g., Twenty Nineteen)

  4. Edit 404.php

  5. Add web shell:

  1. Access: http://TARGET/wp-content/themes/twentynineteen/404.php?0=id


Database Admin Password Reset to Plugin Upload

If you have a shell and recover database credentials from wp-config.php, use MySQL to reset an existing admin password, then log in and upload a malicious plugin.

The observed hash set the admin password to admin. After logging in, upload a plugin webshell and trigger it:

Successful shell context may be the web server user, such as alice.


Metasploit RCE


Exposed Installer Takeover

If WordPress is left at /wp-admin/setup-config.php, you can sometimes complete the install yourself by making the target connect to a database you control.

Start a throwaway MySQL instance on the attacker box:

Fill the setup form with:

If the page says the database server was reached but the database could not be selected, create the database name it expects and retry. Once setup succeeds, create the WordPress admin user, log in at /wp-login.php, and use theme editor or plugin upload for code execution.


Malicious plugin upload (wordpwn)

When the Theme Editor is disabled or PHP changes are reverted (“upload by some other means, such as SFTP”), use a malicious plugin instead. You need admin access (e.g. default or brute-forced creds).

Tool: wetw0rk/malicious-wordpress-plugin — generates a plugin zip containing a Meterpreter or webshell payload.

Upload: As admin, go to Plugins → Add New → Upload Plugin and upload the generated malicious.zip. URL: http://TARGET/wp-admin/plugin-install.php?tab=upload

Activate the plugin, then trigger the shell:

Trigger URL

http://TARGET/wp-content/plugins/malicious/wetw0rk_maybe.php

http://TARGET/wp-content/plugins/malicious/QwertyRocks.php

http://TARGET/wp-content/plugins/malicious/SWebTheme.php?cmd=COMMAND

Use the first or second for Meterpreter; the third runs a single command via ?cmd=. Shell runs as the web server user (e.g. www-data).


Vulnerable Plugins

AdRotate Banner Manager authenticated upload RCE

AdRotate Banner Manager versions up to and including 5.13.2 can allow authenticated administrators to upload arbitrary files because adrotate_insert_media() does not properly sanitize extensions. On configurations that execute the first extension in a double extension, this can become RCE.

WPScan may identify the plugin and version:

If the login redirects to a virtual host, add the host before authenticating:

With administrator access, go to the AdRotate media manager:

A zipped PHP shell was accepted and extracted to an executable PHP file:

Upload shell.zip through the AdRotate media manager, then trigger:

Successful shell context:

After getting code execution, read wp-config.php for database credentials:

Observed values:

References:

  • https://github.com/advisories/GHSA-77x6-hmg8-vxg7

  • https://wpscan.com/vulnerability/a670dc87-ed79-493a-888d-afd7cb99269e/

Simple File List 4.2.2 pre-auth RCE

WordPress Simple File List versions around 4.2.2 can be abused for unauthenticated file upload / RCE. This is useful when WPScan finds the plugin under /wp-content/plugins/simple-file-list/ and the WordPress site has public uploads enabled.

Look for:

Uploads commonly land under:

Public reference:

  • CVE-2025-34085 PoC

Expected output includes the uploaded PHP path:

Use the webshell directly and read WordPress config for credential reuse:

High-value values:

If the DB username also exists as a system user, try SSH with the database password:

Tutor LMS authenticated issues

Tutor LMS old versions, such as 1.5.3, may have authenticated attack paths. Check registration first; if registration is disabled, you need existing credentials before using authenticated PoCs.

Useful references:

  • CVE-2024-10400: https://github.com/k0ns0l/CVE-2024-10400

  • CVE-2024-3553: https://github.com/RandomRobbieBF/CVE-2024-3553

mail-masta LFI (unauthenticated)

Full exploitation walkthrough:

  1. Confirm LFI by reading /etc/passwd:

  1. Read Apache config to find the document root:

  1. Read files from the discovered webroot:

There is also a Python exploit script on Exploit-DB (mail-masta.py) that automates fuzzing for files via this LFI. The original script has bugs — the fixed version uses a try/except fallback to manually read /etc/passwd if the wordlist is missing:

Site Editor 1.1.1 LFI (CVE-2018-7422)

WordPress Plugin Site Editor 1.1.1 exposes an unauthenticated LFI through ajax_shortcode_pattern.php.

Confirm by reading /etc/passwd:

Useful follow-on files:

/etc/redis/redis.conf can expose requirepass, which can lead to authenticated Redis RCE.

wpDiscuz RCE (CVE-2020-24186)

For WordPress installed below a nested path, ensure the exploit submits its upload request to that installation's wp-admin/admin-ajax.php, not the web-server root:

Trigger the uploaded shell beneath the same WordPress root:


Important Paths

Path
Description

/wp-config.php

DB credentials

/wp-content/uploads/

Uploaded files

/wp-content/plugins/

Plugins

/wp-content/themes/

Themes

/xmlrpc.php

XML-RPC API


Config File Locations

Last updated