Vulnerabilidad XML-RCP en WordPress

Esta semana uno de los clientes de mi empresa que está aplicando una revisión exhaustiva de todos los sistemas informáticos de la compañía, nos indica sobre una vulnerabilidad XML-RPC en una de sus páginas web. El api XML-RPC de WordPress ofrece la posibilidad de ejecutar ordenes de manera remota sin estar en el escritorio, ya sea desde una consola o un dispositivo móvil, enviando peticiones HTTP a xmlrpc.php.

Las posibilidades de esta funcionalidad es muy amplia, pues los comandos disponibles son muchos:

Posts
wp.getPost
wp.getPosts
wp.newPost
wp.editPost
wp.deletePost
wp.getPostType
wp.getPostTypes
wp.getPostFormats
wp.getPostStatusList

Taxonomies
wp.getTaxonomy
wp.getTaxonomies
wp.getTerm
wp.getTerms
wp.newTerm
wp.editTerm
wp.deleteTerm

Media
wp.getMediaItem
wp.getMediaLibrary
wp.uploadFile

Comments
wp.getCommentCount
wp.getComment
wp.getComments
wp.newComment
wp.editComment
wp.deleteComment
wp.getCommentStatusList

Options
wp.getOptions
wp.setOptions

Users
wp.getUsersBlogs
wp.getUser
wp.getUsers
wp.getProfile
wp.editProfile
wp.getAuthors

Este api viene activo por defecto desde la versión 3.5 de WordPress y se utiliza por plugins como Jetpack para controlar WordPress de forma remota.

Solución al problema

Ya que este api se encuentra activado por defecto, la mejor forma de solucionar la vulnerabilidad es bloquear el acceso a la misma, con lo que no sólo protegeremos nuestro CMS sino que reduciremos el consumo de CPU, eliminaremos la opción de ataques por fuerza bruta y pingback y reduciremos el efecto de posibles ataques de denegación de servicio, DDoS.

Realizaremos los siguientes pasos sólo si no utilizamos la opción de gestión remota de nuestro CMS, y en ese caso, mi recomendación es que utilicéis nombres de usuario y contraseñas seguras de muy alta complejidad, ya que la explotación de este tipo de vulnerabilidad, requiere el acceso con usuario y contraseña.

Prohibir las peticiones HTTP a xmlrpc.php

Esta es la primera acción, que devolverá un mensaje 403 de acceso denegado cuando se realice alguna petición a xmlrpc.php. Para ello debemos editar el archivo .htaccess desde nuestro FTP añadiendo estas líneas:

# bloquear xmlrpc.php
<IfModule mod_alias.c>
	RedirectMatch 403 (?i)/xmlrpc.php
</IfModule>

Bloquear el fichero xmlrpc.php

Reforzaremos aún más la seguridad bloqueando la lectura de xmlrpc.php añadiendo también en el archivo .htaccess estas líneas:

# bloquear xmlrpc.php
<Files xmlrpc.php>
	Order Deny,Allow
	Deny from all
</Files>

Comprobar que el bloqueo es correcto

Sólo nos queda comprobar que el bloqueo está funcionando. Para ello podremos ejecutar desde nuestra consola de windows el siguiente comando, sustituyendo los corchetes, [] por el nombre de vuestra página web:

curl -0 https://[página web]/xmlrpc.php

Este comando es válido también para páginas http, cambiando el texto únicamente.

Nos aparecerá algo parecido a esto:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /xmlrpc.php
on this server.</p>
</body></html>

Espero que este tip te sirva para proteger mejor tu página web o la de tus clientes.

Saludos!