Content Injection Vulnerability en Wordpress

Esta vulnerabilidad presenta un riesgo de seguridad grave y tiene una puntuación en la escala DREAD (Daño potencial, Reproducibilidad/Reliability, Explotabilidad, Affected users (usuarios afectados) y Descubribilidad) de 9/10. Se puede ejecutar en remoto y es de fácil ejecución a través de un script en Python o Ruby, lo que lo convierte un exploit ideal para los conocidos como script kiddies. Lo que el atacante consigue con esta vulnerabilidad es una inyección de contenido y afecta a las versiones de Wordpress 4.7.0 y 4.7.1.

¿Estás en riesgo?

La vulnerabilidad permite que cualquier usuario que la explote pueda editar cualquier publicación del sitio web.

Esto ocurre porque Wordpress en la versión 4.7.0 agregó una API Rest para ver, crear, eliminar y modificar publicaciones y la habilitó de manera predeterminada tanto en la versión 4.7.0 como en la 4.7.1.

Detalles técnicos

Con la llamada a la API “/wp-json/wp/v2/posts/1234” estaríamos indicando que queremos actuar sobre el post con ID 1234. El código de Wordpress (en PHP) comprueba que el parámetro esté compuesto sólo por dígitos para evitar que los atacantes creen valores de ID maliciosos.

Uno de los primeros errores en el código de la API es que se prioriza, antes que este valor, los valores recibidos por GET y POST. Es decir, que si realizamos la siguiente llamada “/wp-json/wp/v2/posts/1234?id=1234helloworld” se saltaría la comprobación de dígitos y obtendremos el parámetro ID con el valor 1234helloworld.

Si continuamos con el funcionamiento de la API nos encontramos con las funciones ‘update_item’ y ‘update_item_permissions_check’. La función ‘update_item_permissions_check’ llama a su vez a la función ‘get_post’ pasándole el ‘id’ del post que se quiere modificar. Esta función comprobará si la publicación existe y si el usuario tiene permiso para editarla. Curiosamente si enviamos una ID que no coincide con ningún post podemos pasar la verificación de permisos y seguir ejecutando el código de la función ‘update_item’. Además, el método ‘get_post’ utiliza el método ‘get_instance’ para obtener las publicaciones y este utiliza la siguiente comprobación:

CIW 01

Por lo que fallaría con cualquier entrada que no tenga valores numéricos, es decir, consiguiendo que el ID fuese 1234helloworld este método fallaría y, por lo dicho anteriormente, se seguiría ejecutando el código de ‘update_item’ pasando la verificación de permisos.

Esta es la función ‘update_item’ que se ejecuta:

CIW 02

En este código vemos que el ID que recibe lo convierte a un entero antes de pasarlo a ‘get_post’. Por la forma en la que realiza las conversiones PHP, si le pasas el ID ‘1234helloworld’ al conversor (int) este devolverá el entero ‘1234’.

Por todo este lío de tipos un atacante podría modificar el contenido de cualquier post o página. Por ejemplo, realizando la siguiente llamada ‘/wp-json/wp/v2/posts/123?id=456ABC’ modificaremos el post con el ID 456. A partir de ahí ya se podría realizar otro tipo de vulnerabilidades, infectar la web con una campaña de spam, inyectar anuncios, ejecutar código PHP…

Solución

Mantener el software actualizado, este error fue corregido a partir de la versión 4.7.2 de Wordpress, o deshabilitar la API Rest de Wordpress.

Explotación

Aquí vamos a mostrar el proceso de explotación de esta vulnerabilidad.

Conocer la versión del WordPress.

Para conocer si la web objetivo utilizar una versión de WordPress afectada por esta vulnerabilidad podemos llevar a cabo alguno de los siguientes métodos:

Hay muchas formas de conocer las versión de Wordpress que está ejecutando una página, algunas de ellas son: Ver el código fuente de la página inicial de Wordpress:

CIW 03

Entrar en el archivo readme.html situado en la raíz del sitio web:

CIW 04

Ver el código fuente en el wp-login:

CIW 05

Buscar webs con versión concreta

Otra forma es buscar webs que cuenten con la versión indicada. Existen diferentes métodos para ello, como por ejemplo:

Google Dorks: Las Google Dorks se llama a la obtención de información valiosa a través del navegador de Google utilizando combinaciones de operadores especiales de Google. En nuestro caso, podríamos, por ejemplo, usar inurl:”wordpress readme.html” para encontrar la versión de Wordpress de las webs que tienen indexado el fichero readme.html. Esto se puede solucionar a través del archivo robots.txt e indicando en ese archivo lo que Google debe y no debe indexar. Co este método obtenemos, por ejemplo, esta web vulnerable:

CIW 06

Búsqueda en códigos fuentes: A través de webs como https://publicwww.com/ podemos realizar búsquedas directamente en el código fuente de las webs. De este modo poniendo en el navegador content=”WordPress 4.7.1” podemos obtener diferentes webs con la versión 4.7.1 instalada. Con este método obtenemos, por ejemplo, las siguientes webs vulnerables:

CIW 07

Explotación

Una vez que se tenga una web objetivo se puede utilizar un exploit escrito en Python para atacar la vulnerabilidad. Funciona con Python 2.7 y los módulos necesarios instalados. El funcionamiento del exploit es el siguiente:

  1. Ejecutamos:

    python2.7 inject.py http://www.web_vulnerable.es.

  2. El exploit nos devolverá si la web puede ser atacada y los ID, títulos y enlaces de las entradas que pueden modificarse.
  3. Decidimos sobre que ID vamos a atacar y creamos un fichero con el contenido que queramos insertar en esa entrada.
  4. Si la ID a la que atacamos es la 1234 y el fichero a insertar se llama ‘contenido’ ejecutaremos el siguiente comando:

    python2.7 inject.py http://www.web_vulnerable.es 1234 contenido

  5. Si todo ha funcionado correctamente nos debe indicar “Update complete!”.

Pruebas

Hemos creado una web con Wordpress 4.7.1 recién instalado, sin realizar ninguna modificación en la configuración del Wordpress. Simplemente hemos agregado una nueva entrada llamada ‘Entrada de prueba’:

CIW 08

A continuación hemos ejecutado el exploit. Primero vemos que la web es vulnerable y las entradas que tiene. Luego, elegimos la entrada recién creada cuya ID es 4 y le insertamos un fichero con un contenido simple:

CIW 09

Al terminar su ejecución la web de la imagen anterior quedaría así:

CIW 10

Bibliografía:

https://www.exploit-db.com/exploits/41223

https://blog.sucuri.net/2017/02/content-injection-vulnerability-wordpress-rest-api.html

https://www.conectronica.com/tecnologia/seguridad/implantacion-de-ciberseguridad-en-el-entorno-de-los-negocios-electronicos

https://www.wpbeginner.com/beginners-guide/how-to-easily-check-which-wordpress-version-you-are-using/

https://hackingvision.com/2017/07/21/google-dorks-find-vulnerable-wordpress-sites/

https://superadmin.es/blog/wordpress/seguridad-wordpress-recomendaciones/

https://publicwww.com/

Written on January 16, 2021
Vulnerabilidad