The WordPress XML-RPC API has been under attack for many years now. Back in August 2014, WordPress released version 3.9.2, fixing a possible denial of service issue in PHP’s XML processing. There are brute-force amplification attacks, reported by Sucuri, and so on. So, how do you protect WordPress from xmlrpc.php attacks, but still being able to use (some of) its functionality like Jetpack? This post gives you some insight.
The problem: during a brute-force attack, HTTP requests keep coming in, knocking down web servers due to the sheer number of HTTP requests for /xmlrpc.php, and the increasing number of running PHP processes. This often consumes all available CPU and memory: a typical xmlrpc.php attack characteristic.
You want to protect your website and somehow block requests to xmlrpc.php. But you also want to use (some of) its functionality, like WordPress Jetpack. How?
One option is to Whitelist WordPress.com IP addresses for
xmlrpc.php access through
web.config in Windows Server IIS.
If your hosting provider doesn’t want to allow all connections to Jetpack, you can use these IPs:
All of the IPs listed at http://whois.arin.net/rest/org/AUTOM-93/nets
So you need to whitelist these IP addresses. One big advantage of using a whitelist, is that you automatically block all other IP’s.
Add your own IP to the list if you need access too.
You can use the following
web.config snippet to whitelist IP addresses and ranges (netblocks) for access to the xmlrpc.php file. The
location tag means the rules only apply to the path mentioned. In this case the file
<location path="xmlrpc.php"> <system.webServer> <security> <ipSecurity allowUnlisted="false"> <add ipAddress="126.96.36.199" subnetMask="255.255.255.0" allowed="true" /> <add ipAddress="188.8.131.52" subnetMask="255.255.192.0" allowed="true" /> <add ipAddress="184.108.40.206" subnetMask="255.255.252.0" allowed="true" /> <add ipAddress="220.127.116.11" subnetMask="255.255.255.128" allowed="true" /> <add ipAddress="18.104.22.168" subnetMask="255.255.255.128" allowed="true" /> <add ipAddress="22.214.171.124" subnetMask="255.255.252.0" allowed="true" /> <add ipAddress="2a04:fa80::" subnetMask="ffff:fff8::" allowed="true" /> <add ipAddress="2620:115:C000::" subnetMask="ffff:ffff:ff00::" allowed="true" /> </ipSecurity> </security> </system.webServer> </location>
Another solution is to block access to xmlrpc.php completely in IIS. In your web.config file add in the appropriate place:
<security> <requestFiltering> <denyUrlSequences> <add sequence="xmlrpc.php" /> </denyUrlSequences> </requestFiltering> </security>
This blocks requests to /xmlrpc.php URL’s completely, meaning you cannot use a plugin like Jetpack, or other functionality that relies on XML-RPC.
For a full list of the WordPress API functions available to developers via XML-RPC, take a look at this page on the WordPress codex.
To use on a Linux web server with Apache 2.2. A mod_authz_host .htaccess equivalent for the above web.config, for you to use, is as follows:
# Block access to xmlrpc.php for everyone # except WordPress.com and Jetpack IP addresses. # # Whitelist IP ranges in Apache 2.2 .htaccess using mod_authz_host: # https://httpd.apache.org/docs/2.2/mod/mod_authz_host.html <Files xmlrpc.php> order deny,allow allow from 126.96.36.199/22 allow from 188.8.131.52/24 allow from 184.108.40.206/18 allow from 220.127.116.11/22 allow from 18.104.22.168/25 allow from 22.214.171.124/25 allow from 2620:115:C000::/40 allow from 2a04:fa80::/29 deny from all </Files>
When using Apache 2.4, you need to use a slightly different syntaxis for the Apache module mod_authz_host:
<Files xmlrpc.php> # Help: https://httpd.apache.org/docs/2.4/mod/mod_authz_host.html Require ip 126.96.36.199/22 Require ip 188.8.131.52/24 Require ip 184.108.40.206/18 Require ip 220.127.116.11/22 Require ip 18.104.22.168/25 Require ip 22.214.171.124/25 Require ip 2620:115:C000::/40 Require ip 2a04:fa80::/29 </Files>
You can find out why this difference in .htaccess files is important in my WordPress .htaccess best security practices post. Go on, I won’t stop you and this post can wait 🙂
Unfortunately you need to regularly check http://whois.arin.net/rest/org/AUTOM-93/nets to see if IP blocks have changed.
Other options do exist. I hope this’ll help you in keeping your site safe!
My name is Jan. I am not a hacker, coder, developer, programmer or guru. I am merely a system administrator, doing my daily thing at Vevida in the Netherlands. With over 15 years of experience, my specialties include Windows Server, IIS, Linux (CentOS, Debian), security, PHP, WordPress, websites & optimization. Want to support me and donate? Use this link: https://paypal.me/jreilink.
Automatically flush Redis cache after publishing a WordPress post
WordPress .htaccess security best practices in Apache 2.4.6+
Set WP_MEMORY_LIMIT value correctly in wp-config.php
Remove Jetpack email sharing service
How to make Twenty Seventeen theme full width in WordPress
Check WordPress Core files integrity
Clear PHP opcode caches before WordPress Updates: ease the updating process
The WinCache effect: Save with object caching