Security Auditor: checks whether the site’s XML-RPC endpoint answers anyone, and whether it offers
system.multicall (password guessing in bulk) or pingback.ping (the site fetches any URL a stranger gives it).Protection
Finds the old remote API that bots hammer for admin passwords and abuse to attack other sites.
Read-only
Lists methods or sends a call the platform rejects before running it. It never logs in and never sends a pingback.
xmlrpc.php and turns it on by default. Liferay serves it at /xmlrpc/*, where Blogs registers pingbacks. Few sites use it today: the WordPress block editor, the REST API and the mobile apps use /wp-json. Attackers still use it every day:
system.multicallbundles many calls into one request. A bot can try hundreds of passwords per HTTP request and get past login rate limits that count requests.pingback.pingmakes the site fetch a URL the caller chooses. Attackers send it to thousands of sites at once to flood a victim (DDoS reflection), or point it at internal addresses (SSRF).
How it works
- Fetch: requests the audited URL with
GETas 37AuditsBot. A blocked request ends the audit with590. Any other failure (timeout, DNS, TLS, non-2xx answer) ends it with500. - Platform: picks the first platform named in the project’s software stack. Otherwise it picks the first one the page reveals:
- WordPress: the
generatormeta tag, the REST APILink: <…>; rel="https://api.w.org/"header, anX-Pingbackheader, or/wp-content///wp-includes/assets. - Liferay: the
Liferay-Portalheader, or theLiferay.ThemeDisplay/Liferay.authTokenglobals. - Neither: it still probes WordPress’s
xmlrpc.php, so a WordPress site that hides its generator is caught. If that endpoint does not answer XML-RPC, the result isINFORMATION(100) and the run is not charged.
- WordPress: the
- Probe: sends one
POST(content-type: text/xml):- WordPress:
system.listMethodsto theX-PingbackURL when the page advertises one, otherwise toxmlrpc.phpnext to the REST API root. WordPress answers with every method it offers. - Liferay:
pingback.pingwithout parameters to/xmlrpc/pingback. Liferay’sXmlRpcServletlooks the method up before checking the arguments. A registered method answers fault-32602(“Method arguments are invalid”) and an unknown one-32601(“Requested method not found”). The method never runs. - Any HTTP answer (403, 404, 500…) counts as XML-RPC being off.
- Second round: if the endpoint of a recognised platform cannot be reached at all (connection reset, refused, timeout), the auditor fetches the site root. When the root answers
2xx, it sends the probe once more. A second failure means a firewall drops XML-RPC on purpose:SUCCESS(201). An answer on the second try is evaluated as usual. If the root fails too, the site itself is down and the result isERROR(501).
- WordPress:
- Jetpack: when a WordPress endpoint answers, the auditor looks for Jetpack, which needs XML-RPC to talk to WordPress.com. Jetpack adds nothing to the method list a stranger sees, so the signals are its assets (
/wp-content/plugins/jetpack/) on the page or itsjetpack/v4namespace in the REST API index (oneGET). With Jetpack, the recommendations say to allowxmlrpc.phponly from Jetpack’s IP ranges instead of disabling it. The verdicts do not change: the auditor is not a Jetpack server, so an answer means the endpoint is open to everyone. - Rules:
system.multicalllisted (400) andpingback.pinglisted (401) fail. A WordPress endpoint that answers XML-RPC at all warns (300). A Liferay endpoint withpingback.pingregistered warns (301). - Aggregate: FAIL wins over WARNING. When every rule passes, the audit is
SUCCESS(200).
What it audits
Every row maps to onecheckRule* method and one CheckCode, in the order the auditor runs them. CheckCode suffixes use status ranges: 100 information, 200 success, 300–399 warning, 400–499 fail, 500–599 error.
Output documentation
Risks and considerations
Who still needs XML-RPC
- Jetpack and some older remote publishing apps still use XML-RPC on WordPress. If you depend on them, keep the endpoint but allow it only from Jetpack’s IP ranges (or the app’s addresses), and remove
pingback.pingwith thexmlrpc_methodsfilter. That filter cannot removesystem.multicall: WordPress adds thesystem.*methods after it runs. - The WordPress block editor, the REST API and the current mobile apps do not need it.
How to turn it off
- Web server: deny
xmlrpc.php(Apache<Files xmlrpc.php> Require all denied </Files>, nginxlocation = /xmlrpc.php { deny all; }). This is the most complete fix. - Plugin: most security plugins (Wordfence, Solid Security, “Disable XML-RPC”) can block it.
- Liferay: set
blogs.pingback.enabled=falseandmessage.boards.pingback.enabled=false, or block/xmlrpc/*at the proxy or web server in front of the portal.
Limits of this check
- A WordPress plugin can block XML-RPC logins while
system.listMethodsstill lists every method. The auditor reports what is listed. It does not try a login to find out. - On Liferay, the auditor sees that
pingback.pingis registered, but it cannot readblogs.pingback.enabledwithout running the method. That is why the finding stays aWARNINGeven after pingbacks were turned off in the configuration. Blocking/xmlrpc/*clears it. - Some firewalls (fail2ban, WAF rules) ban the caller’s IP for a while after an XML-RPC request. During that ban, other audits of the same host can fail to fetch the page.
- Only the endpoint of the audited site is probed. Other WordPress installations on the same host (in another subdirectory) need their own monitored URL.