Strobesstrobes
Platform
Solutions
Resources
Customers
Company
Pricing
Book a Demo
Strobesstrobes

Strobes connects every exposure signal to autonomous action, so security teams fix what matters, prove what works, and stop chasing noise.

Book a DemoTalk to an expert
ISO 27001SOC 2CREST
  • Platform
  • Platform Overview
  • Agentic Exposure Management
  • AI Agents
  • Integrations
  • API & Developers
  • Workflows & Automation
  • Analytics & Reporting
  • Solutions
  • Exposure Assessment (EAP)
  • Attack Surface Management
  • Application Security Posture
  • Risk-Based Vulnerability Management
  • Adversarial Exposure Validation (AEV)
  • AI Pentesting
  • Pentesting as a Service
  • CTEM Framework
  • By Industry
  • Financial Institutions
  • Technology
  • Retail
  • Healthcare
  • Manufacturing
  • By Roles
  • CISOs
  • Security Directors
  • Cloud Security Leaders
  • App Sec Leaders
  • Resources
  • Quick Agentic Pentest
  • Blog
  • Customer Stories
  • eBooks
  • Datasheets
  • Videos & Demos
  • Exposure Management Academy
  • CTEM Maturity Assessment
  • Pentest Health Check
  • Security Tool ROI Calculator
  • Company
  • About Strobes
  • Meet the Team
  • Trust & Security
  • Contact Us
  • Careers
  • Become a Partner
  • Technology Partner
  • Partner Deal Registration
  • Press Release

Weekly insight for security leaders

CTEM research, agentic AI trends, and what's actually moving the needle.

© 2026 Strobes Security Inc. All rights reserved.

Privacy PolicyTerms of ServiceCookie PolicyAccessibilitySitemap
Back to Blog
WordPress Security and Penetration Testing Guide
Application SecurityPenetration Testing

WordPress Security and Penetration Testing Guide

Akhil ReniApril 10, 20257 min read

Table of Contents

  • Plugins, not the core, are the WordPress attack surface.
  • How do you enumerate a WordPress site?
  • What are the most common WordPress vulnerabilities?
  • xmlrpc.php is the brute-force amplifier most sites leave on.
  • What does a confirmed plugin exploit look like?
  • What do scanners get wrong about WordPress?
  • How do you harden a WordPress site?
  • Frequently asked questions
  • Sources and references

Authors

A
Akhil Reni

Share

Table of Contents

  • Plugins, not the core, are the WordPress attack surface.
  • How do you enumerate a WordPress site?
  • What are the most common WordPress vulnerabilities?
  • xmlrpc.php is the brute-force amplifier most sites leave on.
  • What does a confirmed plugin exploit look like?
  • What do scanners get wrong about WordPress?
  • How do you harden a WordPress site?
  • Frequently asked questions
  • Sources and references

Authors

A
Akhil Reni

Share

TL;DR
  • ✓WordPress runs over 40% of all websites, so it is a massive attack surface, and the hardened core is rarely the weak point; third-party plugins and themes are.
  • ✓Most WordPress compromises trace to a known-vulnerable plugin or theme, weak admin credentials, or exposed endpoints like xmlrpc.php and the REST users API.
  • ✓wpscan is the primary tool: it enumerates version, plugins, themes, and users, and checks them against the WPScan vulnerability database for matching CVEs.
  • ✓Key tests: user enumeration via the REST API and author archives, xmlrpc.php multicall brute force and pingback SSRF, and plugin CVE confirmation by actually triggering the bug.
  • ✓Hardening priority: patch aggressively, enforce 2FA and login rate limiting, disable xmlrpc and dashboard file editing, lock down files, and front it with a managed WAF.

Over 40% of the entire web runs on WordPress, and that single fact shapes how it gets attacked. Nobody picks your site and then hunts for a bug. Attackers scan the whole internet for one specific vulnerable plugin version and exploit every match in an afternoon, which is why a fresh plugin advisory turns into mass exploitation within hours of disclosure. The hardened WordPress core, maintained by a serious security team, is almost never the way in. The tens of thousands of third-party plugins around it are.

This guide covers how to pentest a WordPress site the way an attacker does, with wpscan as the workhorse, the specific endpoints worth probing (xmlrpc.php, the REST users API, author archives), what a confirmed credential and a confirmed plugin exploit look like, and the hardening that closes them in priority order. It slots into the broader web application pentesting checklist as a CMS-specific module.

Table of contents
  1. Plugins, not the core, are the WordPress attack surface.
  2. How do you enumerate a WordPress site?
  3. What are the most common WordPress vulnerabilities?
  4. xmlrpc.php is the brute-force amplifier most sites leave on.
  5. What does a confirmed plugin exploit look like?
  6. What do scanners get wrong about WordPress?
  7. How do you harden a WordPress site?

Plugins, not the core, are the WordPress attack surface.

WordPress is targeted constantly because its huge install base means a single plugin vulnerability can expose hundreds of thousands of sites at once, making automated mass exploitation extremely profitable. Attackers do not pick a site and then look for a bug; they scan the internet for a specific vulnerable plugin version and exploit every match.

The structural reasons are simple: tens of thousands of third-party plugins and themes of wildly varying code quality, site owners who delay updates, and default installs that expose endpoints useful for enumeration and brute force. Add weak or reused admin passwords and you have the recipe behind most WordPress incidents. This makes WordPress a recurring item in any web app testing engagement that includes a CMS.

WordPress by the Numbers
43%
of all websites run on WordPress
~60K
plugins in the official directory, varying code quality
hours
from plugin advisory to mass exploitation
1 req
xmlrpc multicall carries hundreds of login guesses

How do you enumerate a WordPress site?

Enumeration means fingerprinting the version, installed plugins and themes, and valid usernames before you attack anything, and wpscan automates almost all of it. Start passive, then add aggressive plugin detection if the engagement allows. The output below is the part you act on, the version-to-CVE match and the leaked usernames:

$ wpscan --url https://target.com --enumerate vp,u --api-token <TOKEN>
[+] WordPress version 5.8.1 identified (Insecure, released 2021-09-08)
[+] WPScan found 17 vulnerabilities affecting this version
[+] Plugin: file-manager 6.0
 |  [!] Title: Unauthenticated Arbitrary File Upload (CVE-2020-XXXXX)   <-- the one that matters
 |  [!] Fixed in: 6.9
[+] Enumerating Users (via REST API + author archives)
 |  [+] admin
 |  [+] editor_jane                                                    <-- targets for a spray

# Manual cross-checks:
curl https://target.com/wp-json/wp/v2/users      # REST API leaks login names
curl -I "https://target.com/?author=1"           # author archive 301s to /author/<username>/

The REST users endpoint and author archives both leak valid login names, which turns a password spray into a targeted attack. The flagged file-manager CVE is the lead worth confirming, not trusting on the banner alone.

What are the most common WordPress vulnerabilities?

The bulk of WordPress findings cluster into a few categories, and plugins dominate every count. Knowing the categories tells you where to spend testing time.

  • Vulnerable plugins and themes: by far the most common, from SQL injection and stored XSS to unauthenticated arbitrary file upload and full RCE. Match versions to CVEs with wpscan, then confirm.
  • Weak credentials and brute force: both /wp-login.php and xmlrpc.php accept logins; xmlrpc supports multicall, letting an attacker test hundreds of passwords in one request.
  • User enumeration: the REST API and author archives disclose usernames.
  • xmlrpc.php abuse: pingback functionality enables SSRF and DDoS amplification on top of credential attacks.
  • Misconfiguration: exposed wp-config.php backups, directory listing, debug logs, and readable /wp-content/uploads.
WordPress Pentest Checklist
Recon
  • ✓Fingerprint core version
  • ✓Enumerate plugins/themes (wpscan vp,vt)
  • ✓Enumerate users (REST API, author archives)
  • ✓Match versions to WPScan CVE DB
Attack
  • ✓Brute force wp-login.php
  • ✓xmlrpc multicall amplification
  • ✓pingback SSRF test
  • ✓Confirm vulnerable plugin exploit
Config
  • ✓Exposed wp-config backups
  • ✓Directory listing / debug.log
  • ✓Readable uploads dir
  • ✓Missing security headers

xmlrpc.php is the brute-force amplifier most sites leave on.

xmlrpc.php deserves dedicated testing because system.multicall lets you ride hundreds of login guesses on a single HTTP request, so a rate limit that counts requests never trips. It is enabled by default on many installs. A wrong guess returns a fault; a correct one returns the user's blog list, which is the proof of a valid credential:

POST /xmlrpc.php
<methodCall><methodName>system.multicall</methodName><params><param><value><array><data>
  <value><struct><member><name>methodName</name><value>wp.getUsersBlogs</value></member>
  <member><name>params</name><value><array><data><value><array><data>
    <value>admin</value><value>Password123</value>
  </data></array></value></data></array></value></member></struct></value>
  <!-- repeat the struct for hundreds of guesses in ONE request -->
</data></array></value></param></params></methodCall>

HTTP/1.1 200 OK
<!-- wrong guess --> <fault><value>...403 Incorrect username or password</value></fault>
<!-- correct guess --> <array><data><value><struct><member><name>blogName</name>...   <-- valid creds

The blog-list struct in place of a fault is the confirmation. Test the standard login for a missing lockout (WSTG-ATHN-03) by spraying enumerated users with wpscan's --passwords mode, and test pingback.ping for blind SSRF against internal hosts the same way you would any SSRF sink.

What does a confirmed plugin exploit look like?

A confirmed WordPress finding pairs the enumerated version with a working proof, not a version-to-CVE guess. The higher-severity path is almost always a plugin. On a recent assessment of a membership site, wpscan flagged the outdated file-manager plugin from the scan above; confirming the unauthenticated upload CVE meant writing a harmless marker file and reading it back:

# Exploit the unauthenticated upload, write a benign proof file
POST /wp-content/plugins/wp-file-manager/lib/php/connector.minimal.php
  cmd=upload&target=<hash>&... (multipart: proof.txt = "strobes-poc")

# Confirm it landed and is web-reachable:
$ curl https://target.com/wp-content/uploads/proof.txt
strobes-poc          <-- arbitrary file write confirmed; a .php here = RCE

Reading back strobes-poc from the uploads directory is the proof of arbitrary file write, which chains to remote code execution by writing a PHP shell instead of a text file (kept out of scope on a live target unless explicitly authorized). Always confirm the exploit on the actual target rather than asserting a CVE from a banner, because many sites backport patches.

Sample WordPress Findings Excerpt
FindingSeverity (CVSS)EvidenceRemediation
Unauth file upload in file-manager plugin9.8 CriticalWrote/read proof.txt in /uploads; chains to RCE via PHP shellUpdate plugin to fixed version; remove if unused
xmlrpc multicall brute force (WSTG-ATHN-03)7.5 Highwp.getUsersBlogs returned blog list for admin:Password123Disable xmlrpc.php; enforce 2FA + rate limiting
User enumeration via REST API5.3 Medium/wp-json/wp/v2/users listed admin, editor_janeRestrict REST users endpoint; block author scans
pingback.ping blind SSRF6.5 MediumCollaborator hit confirmed server-side fetch to internal hostDisable pingback; egress-filter the WordPress host

What do scanners get wrong about WordPress?

WordPress scanners are noisy with version-based false positives and quiet on findings that need a second request. wpscan and Nuclei match a disclosed plugin version to a CVE and report it, but many sites backport patches or hide the version, so a flagged "vulnerable" plugin is frequently already fixed. Confirm by triggering the bug, not by trusting the banner, and treat a hidden version as a reason to test manually rather than a clean result.

On the false-negative side, scanners miss logic and access-control issues in plugins entirely: an IDOR in a membership plugin's AJAX action, a broken nonce check on a privileged admin-ajax.php handler, or a settings page reachable by a subscriber. None of those carry a public signature. Blind xmlrpc pingback.ping SSRF also needs out-of-band confirmation a scanner rarely sets up. Because plugin churn is constant, a point-in-time scan goes stale within weeks, which is why pairing periodic manual web application testing with continuous, AI-driven coverage keeps pace, the idea behind agentic pentesting.

How do you harden a WordPress site?

Harden WordPress by shrinking the attack surface and removing default footholds, in roughly this priority order. Updates come first because vulnerable plugins are the number one cause of compromise; obscurity tricks like hiding the version come last because an attacker fingerprints it from CSS or readme files anyway.

  • Patch aggressively: enable auto-updates for core, plugins, and themes; remove anything unused. An unused plugin is still exploitable.
  • Strong auth: unique admin passwords, two-factor authentication, and a login rate-limiter or lockout plugin.
  • Disable risky endpoints: turn off xmlrpc.php if unused, restrict the REST users endpoint, and disable in-dashboard file editing with define('DISALLOW_FILE_EDIT', true); in wp-config.php.
  • Lock down files: correct permissions on wp-config.php, no directory listing, no exposed backups or debug logs.
  • Add a managed WAF: it blocks mass-exploitation of newly disclosed plugin CVEs while you patch, which matters because attackers weaponize a fresh advisory within hours.
  • Database and salts: rotate the authentication keys and salts in wp-config.php, and give the database user only the privileges WordPress needs.

Frequently asked questions

What is wpscan and how is it used?
wpscan is the standard WordPress security scanner. It fingerprints the core version, enumerates installed plugins, themes, and users, and checks them against the WPScan vulnerability database for known CVEs. With an API token it returns detailed vulnerability data, making it the first tool to run in any WordPress pentest.
Is xmlrpc.php a security risk?
It can be. xmlrpc.php enables remote publishing but also supports system.multicall, which lets attackers test hundreds of passwords in a single request for efficient brute force, and pingback.ping, which can be abused for SSRF and DDoS amplification. If your site does not need it, disabling xmlrpc.php removes that risk.
How do attackers enumerate WordPress users?
The two easiest methods are the REST API endpoint /wp-json/wp/v2/users, which can list account login names, and author archive URLs like /?author=1, which redirect to a URL containing the username. Both turn an anonymous password spray into a targeted credential attack, so they should be restricted.
Why are WordPress plugins the biggest risk?
There are tens of thousands of third-party plugins of varying code quality, and many sites delay updates. A single vulnerable plugin version can expose hundreds of thousands of sites at once, which is why attackers mass-scan for specific versions rather than targeting individual sites. Unused plugins are still exploitable.
How do you harden a WordPress site?
Keep core, plugins, and themes auto-updated and remove unused ones; enforce strong unique admin passwords with two-factor authentication and login rate limiting; disable xmlrpc.php and in-dashboard file editing; lock down file permissions; and put a managed WAF in front to block mass exploitation of new plugin CVEs while you patch.
Can WordPress be penetration tested safely on a live site?
Yes, with care. Enumeration and version-to-CVE matching are low-risk, but brute force and active exploitation can lock out accounts or affect availability, so agree on scope and timing first. Many testers mirror the site to a staging environment for the aggressive exploitation phase to avoid impacting production.

Sources and references

  • WPScan Vulnerability Database
  • WordPress Hardening Guide
  • OWASP WSTG: Testing for Weak Lockout Mechanism (WSTG-ATHN-03)
A
Akhil Reni
Co-founder and CTO, Strobes
Akhil Reni is co-founder and CTO of Strobes, building AI-driven penetration testing and exposure management for security teams.
Tags
WordPressWeb SecurityPenetration Testing

Stop chasing vulnerabilities Start reducing exposure

See how Strobes AI agents validate and fix your most critical exposures automatically.

Book a Demo
Continue Reading

Related Posts

Vulnerability validation: why most of your scanner backlog is noise - Strobes
Exposure ValidationApplication Security

Vulnerability Validation: Why Most of Your Scanner Backlog Is Noise

Vulnerability validation proves which scanner findings are real, reachable, and exploitable. Why manual triage fails and how agentic validation scales.

Jun 9, 202619 min
How to pentest single-page applications - React, Angular and Vue SPA security testing guide
Penetration TestingApplication Security

How to Pentest Single-Page Applications (React, Angular, Vue)

Learn how to pentest React, Angular, and Vue SPAs. Covers DOM XSS, client-side routing bypass, JS bundle secrets, and why traditional DAST scanners fail.

Jun 4, 202623 min
Bug bounty vs pentesting vs AI pentesting comparison featured image
Penetration TestingApplication Security

Bug Bounty vs. Pentesting vs. AI Pentesting: Which Model Fits Your AppSec Program?

Bug bounty vs pentesting vs AI pentesting: compare costs, coverage, compliance, and when to use each model. Build a layered AppSec testing strategy.

Jun 4, 202621 min