Updated Jul 15, 2026

Scanners

Enumerate WordPress plugins across a URL list

WPScan across a file of WordPress URLs.

Agent

overview

What wpscan-loop does

Hand wpscan-loop a file of WordPress URLs. It fingerprints each site, runs --enumerate for plugins, themes, and users, and matches known issues when --api-token is set.

One policy covers the whole list: --enumerate, --detection-mode (passive, mixed, aggressive), --format, --stealthy, and --throttle. Unlike single-target wpscan, the mandatory input is a urls file, not one URL per run.

Feed the urls file from a discovery or fingerprint stage; the node writes a FOLDER of results for triage across the fleet.

source github.com/wpscanteam/wpscan

use cases

Where wpscan-loop fits

Sweep a fleet of WordPress sites

Scan every WordPress URL in one file so a whole estate of blogs gets the same plugin, theme, and vulnerability coverage in a single run.

Scan WordPress hosts a recon stage found

Take the URLs a fingerprinting or discovery node flagged as WordPress and push the entire list through the scanner without scanning them one at a time.

Standardize enumeration across sites

Apply one --enumerate and detection-mode policy to every site in the list so results are directly comparable across the fleet.

Throttle a bulk scan to stay safe

Use stealthy mode and a throttle so iterating many sites does not overwhelm any single target or trip rate limits.

reference

wpscan-loop inputs and flags

69 inputs
NameTypeFlagDescription
urlsFILE·The URLs of the blogs to scan. Allowed Protocols: http, https. Default Protocol if none provided: http. This option is mandatory.
enumerateSTRING--enumerateEnumeration Process. Available Choices: vp, ap, p, vt, at, t, tt, cb, dbe, u, m.
formatSTRING--formatOutput results in the format supplied. Available choices: cli, json, cli-no-colour, cli-no-color
api-tokenSTRING--api-tokenThe WPScan API Token to display vulnerability data, available at https://wpscan.com/profile
detection-modeSTRING--detection-modeDefault: mixed. Available choices: mixed, passive, aggressive
stealthyBOOLEAN--stealthyAlias for --random-user-agent --detection-mode passive --plugins-version-detection passive
throttleSTRING--throttleMilliseconds to wait before doing another web request. If used, the max threads will be set to 1.
forceBOOLEAN--forceDo not check if the target is running WordPress or returns a 403

Showing key inputs. wpscan-loop exposes 69 inputs in total.

Full flag reference (69 inputs)
NameTypeFlagDescription
urlsFILE·The URLs of the blogs to scan. Allowed Protocols: http, https. Default Protocol if none provided: http. This option is mandatory.
forceBOOLEAN--forceDo not check if the target is running WordPress or returns a 403
proxySTRING--proxyFormat: protocol://IP:port
scopeSTRING--scope'Comma separated (sub-)domains to consider in scope. Wildcard(s) allowed in the trd of valid domains, e.g: *.target.tld. Separator to use between the values: ','
vhostSTRING--vhostThe virtual host (Host header) to use in requests
formatSTRING--formatOutput results in the format supplied. Available choices: cli, json, cli-no-colour, cli-no-color
serverSTRING--serverForce the supplied server module to be loaded. Available choices: apache, iis, nginx
headersSTRING--headersAdditional headers to append in requests
verboseBOOLEAN--verboseVerbose mode
stealthyBOOLEAN--stealthyAlias for --random-user-agent --detection-mode passive --plugins-version-detection passive
throttleSTRING--throttleMilliseconds to wait before doing another web request. If used, the max threads will be set to 1.
api-tokenSTRING--api-tokenThe WPScan API Token to display vulnerability data, available at https://wpscan.com/profile
cache-dirSTRING--cache-dirDefault: /tmp/wpscan/cache
enumerateSTRING--enumerateEnumeration Process. Available Choices: vp (Vulnerable plugins), ap (All plugins), p (Popular plugins), vt (Vulnerable themes), at (All themes), t (Popular themes), tt (Timthumbs), cb (Config backups), dbe (Db exports), u (User IDs range. e.g: u1-5. Range separator to use: '-'. Value if no argument supplied: 1-10), m (Media IDs range. e.g m1-15. Note: Permalink setting must be set to 'Plain' for those to be detected. Range separator to use: '-'. Value if no argument supplied: 1-100). Separator to use between the values: ','. Default: All Plugins, Config Backups. Value if no argument supplied: vp,vt,tt,cb,dbe,u,m.
http-authSTRING--http-authFormat: login:password
login-uriSTRING--login-uriThe URI of the login page if different from /wp-login.php
no-bannerBOOLEAN--no-bannerDon't display the banner
no-updateBOOLEAN--no-updateDo not update the Database.
passwordsFILE--passwordsList of passwords to use during the password attack. If no --username/s option supplied, user enumeration will be run.
proxy-authSTRING--proxy-authFormat: login:password
user-agentSTRING--user-agentUser agent
clear-cacheBOOLEAN--clear-cacheClear the cache before the scan
header-fileFILE--header-fileAdditional headers to append in requests (one per line)
max-threadsSTRING--max-threadsThe max threads to use. Default: 5
cookie-stringSTRING--cookie-stringCookie string to use in requests, format: cookie1=value1[; cookie2=value2
detection-modeSTRING--detection-modeDefault: mixed. Available choices: mixed, passive, aggressive
timthumbs-listFILE--timthumbs-listList of timthumbs' location to use
usernames-fileFILE--usernamesList of usernames to use during the password attack.
wp-content-dirSTRING--wp-content-dirThe wp-content directory if custom or not detected, such as "wp-content"
wp-plugins-dirSTRING--wp-plugins-dirThe plugins directory if custom or not detected, such as "wp-content/plugins"
wp-version-allBOOLEAN--wp-version-allCheck all the version locations
db-exports-listFILE--db-exports-listList of DB exports' paths to use
password-attackSTRING--password-attackForce the supplied attack to be used rather than automatically determining one. Multicall will only work against WP < 4.4. Available choices: wp-login, xmlrpc, xmlrpc-multicall
request-timeoutSTRING--request-timeoutThe request timeout in seconds. Default: 60
users-detectionSTRING--users-detectionUse the supplied mode to enumerate Users, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
users-list-fileFILE--users-listList of users to check during the users enumeration from the Login Error Messages
medias-detectionSTRING--medias-detectionUse the supplied mode to enumerate Medias, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
themes-detectionSTRING--themes-detectionUse the supplied mode to enumerate Themes, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
themes-list-fileFILE--themes-listList of themes to enumerate.
themes-thresholdSTRING--themes-thresholdRaise an error when the number of detected themes via known locations reaches the threshold. Set to 0 to ignore the threshold. Default: 20
user-agents-listFILE--user-agents-listList of agents to use with --random-user-agent
usernames-stringSTRING--usernamesList of usernames to use during the password attack. Examples: 'a1', 'a1,a2,a3'
exclude-usernamesSTRING--exclude-usernamesExclude usernames matching the Regexp/string (case insensitive). Regexp delimiters are not required.
max-scan-durationSTRING--max-scan-durationAbort the scan if it exceeds the time provided in seconds
plugins-detectionSTRING--plugins-detectionUse the supplied mode to enumerate Plugins. Default: passive. Available choices: mixed, passive, aggressive
plugins-list-fileFILE--plugins-listList of plugins to enumerate.
plugins-thresholdSTRING--plugins-thresholdRaise an error when the number of detected plugins via known locations reaches the threshold. Set to 0 to ignore the threshold. Default: 100
random-user-agentBOOLEAN--random-user-agentAdditional headers to append in requests. Separator to use between the headers: '; '. Examples: 'X-Forwarded-For: 127.0.0.1', 'X-Forwarded-For: 127.0.0.1; Another: aaa'
users-list-stringSTRING--users-listList of users to check during the users enumeration from the Login Error Messages. Examples: 'a1', 'a1,a2,a3'
cache-time-to-liveSTRING--cache-ttlThe cache time to live in seconds. Default: 600
connection-timeoutSTRING--connect-timeoutThe connection timeout in seconds. Default: 30
disable-tls-checskBOOLEAN--disable-tls-checksDisables SSL/TLS certificate verification, and downgrade to TLS1.0+ (requires cURL 7.66 for the latter)
themes-list-stringSTRING--themes-listList of themes to enumerate. Examples: 'a1', 'a1,a2,a3'
themes-version-allBOOLEAN--themes-version-allCheck all the themes version locations according to the choosen mode (--detection-mode, --themes-detection and --themes-version-detection)
config-backups-listFILE--config-backups-listList of config backups' filenames to use'
plugins-list-stringSTRING--plugins-listList of plugins to enumerate. Examples: 'a1', 'a1,a2,a3'
plugins-version-allSTRING--plugins-version-allCheck all the plugins version locations according to the choosen mode (--detection-mode, --plugins-detection and --plugins-version-detection)
timthumbs-detectionSTRING--timthumbs-detectionUse the supplied mode to enumerate Timthumbs, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
db-exports-detectionSTRING--db-exports-detectionUse the supplied mode to enumerate DB Exports, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
ignore-main-redirectBOOLEAN--ignore-main-redirectIgnore the main redirect (if any) and scan the target url
main-theme-detectionSTRING--main-theme-detectionUse the supplied mode for the Main theme detection, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
wp-version-detectionSTRING--wp-version-detectionUse the supplied mode for the WordPress version detection, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
exclude-content-basedSTRING--exclude-content-basedExclude all responses matching the Regexp (case insensitive) during parts of the enumeration. Both the headers and body are checked. Regexp delimiters are not required.
multicall-max-passwordsSTRING--multicall-max-passwordsMaximum number of passwords to send by request with XMLRPC multicall. Default: 500
config-backups-detectionSTRING--config-backups-detectionUse the supplied mode to enumerate Config Backups, instead of the global (--detection-mode) mode. Available choices: mixed, passive, aggressive
themes-version-detectionSTRING--themes-version-detectionUse the supplied mode to check themes versions instead of the --detection-mode or --themes-detection modes. Available choices: mixed, passive, aggressive
file-to-read-write-cokiesFILE--cookie-jarFile to read and write cookies
plugins-version-detectionSTRING--plugins-version-detectionUse the supplied mode to check plugins versions. Default: mixed. Available choices: mixed, passive, aggressive
interesting-findings-detectionSTRING--interesting-findings-detectionUse the supplied mode for the interesting findings detection. Available choices: mixed, passive, aggressive

example

Run wpscan-loop

wpscan-loop · command
# wpscan-loop: enumerate vulnerable plugins/themes as JSON across a URL list# urls.txt contains https://blog.example.com and https://www.example.orgwpscan-loop --enumerate vp,vt,u --format json --detection-mode passive --stealthy
sample output
blog.example.comwww.example.comshop.example.comnews.example.orgwp.example.netstaging.example.comdev.example.comcdn.example.com

guidance

Choosing wpscan-loop

Use wpscan-loop when many WordPress URLs need one scan policy. For a single site, use wpscan. For non-WordPress hosts, use nuclei.

wpscan

Same scanner for one --url. Use it for a single site; wpscan-loop iterates a file of URLs.

nuclei

Template scanner across any stack. Run it alongside for non-WordPress checks on the same hosts.

faq

wpscan-loop questions

It takes a urls file and scans each entry in turn, producing a combined result set across the list.

Run wpscan-loop yourself

A file of WordPress URLs feeds wpscan-loop, which scans each site for plugins, themes, and known vulnerabilities and writes the combined findings as an output.

Facts on this page come from the live Trickest tool library.