root@thehacksparrow:~/writeups$ SYSTEM ONLINE
root@sparrow:~/writeups$ cat wpscan.md
// web

WPScan

21 Jul 2026 · 6 min read
WPScan is a WordPress-focused security scanner written in Ruby. It enumerates the core version, the installed plugins and themes, the registered users, and cross-checks everything against a database of known vulnerabilities. It is the go-to tool for auditing any site built on WordPress, which powers a huge slice of the web.

The key nuance is that WPScan only correlates its findings with real CVEs if you supply an --api-token: without one it detects versions but won't tell you what is vulnerable. On top of that, plugin detection defaults to passive (it only sees what is linked in the HTML); to uncover hidden plugins you must switch to aggressive mode, at the cost of far more noise.

1. Beginner level — enumeration and login

WPSCAN cheat sheet — Beginner
CommandWhat it does
wpscan --url https://<t>Basic WordPress scan
wpscan --url https://<t> -e vpEnumerate vulnerable plugins
wpscan --url https://<t> -e uEnumerate users
wpscan --url https://<t> -e apEnumerate all plugins
wpscan --url https://<t> -e atEnumerate all themes
wpscan --url https://<t> -e vtEnumerate vulnerable themes
wpscan --url https://<t> --passwords <wl> --usernames adminLogin brute force
wpscan --url https://<t> -o out.txtSave the output
wpscan --url https://<t> --format json -o out.jsonJSON output
wpscan --url https://<t> --random-user-agentRandom User-Agent
wpscan --updateUpdate the database
wpscan --url https://<t> --api-token <token>Uses the WPScan API (CVE data)
wpscan --versionShow the version
wpscan --url https://<t> -e u1-50Enumerate user IDs by range

2. Advanced level — stealth and efficient brute force

WPSCAN cheat sheet — Advanced
CommandWhat it does
wpscan --url https://<t> -e vp,vt,u --api-token <t>Full enumeration with CVE data
wpscan --url https://<t> --passwords rockyou.txt -U users.txt -t 50Multi-user brute force
wpscan --url https://<t> --proxy http://127.0.0.1:8080Route through Burp
wpscan --url https://<t> --headers 'X-Forwarded-For: 127.0.0.1'Custom headers
wpscan --url https://<t> --wp-content-dir wp-contentSet the wp-content directory
wpscan --url https://<t> --plugins-detection aggressiveAggressive plugin detection
wpscan --url https://<t> --cookie-string 'k=v'Use session cookies
wpscan --url https://<t> --throttle 500Delay between requests (ms)
wpscan --url https://<t> --disable-tls-checksIgnore certificate errors
wpscan --url https://<t> --stealthyStealthy profile (random UA + passive)
wpscan --url https://<t> -e cb,dbeEnumerate config backups and db exports
wpscan --url https://<t> --forceIgnore the 'not WordPress' detection
wpscan --url https://<t> --http-auth user:passHTTP basic authentication
wpscan --url https://<t> --passwords <wl> --multicall-max-passwords 500XML-RPC multicall (fast)

3. Details people miss

  • Without --api-token WPScan detects versions but won't show the associated CVEs; sign up at wpscan.com for the free token (capped at 25 requests per day on the free plan).
  • Default plugin detection is passive and misses almost everything not linked in the HTML; use --plugins-detection aggressive to force path discovery, but be ready for hundreds of requests and possible WAF blocks.
  • Brute force uses xmlrpc.php by default because its multicall is far faster; if XML-RPC is disabled it falls back to wp-login.php, which is slower and more likely to trip lockout plugins on failed attempts.
  • User enumeration (-e u) relies on author archives and the REST API; many sites lock these down, so an empty result does not mean there are no users.
  • If the target blocks or filters your requests, combine --random-user-agent or --stealthy with --throttle to lower your footprint before giving up.

Responsible use

These commands are for systems you own or have explicit written authorisation to test (labs, CTFs, contracted engagements). Using them against third-party infrastructure without permission is illegal in most countries.