WordPress es el sistema de gestión de contenidos o CMS más popular, usado para múltiples sitios webs, principalmente blogs. Cubre un 58.6 % de los sitios webs cuyo CMS es conocido, y un 27.4 % de todas las webs, según W3Techs. Recientemente en su actualización a 4.7.2 cubrió tres vulnerabilidades conocidas CVE-2017-5610, CVE-2017-5611 y CVE-2017-5612. Silenciosamente, también parcheó una vulnerabilidad descubierta por Sucuri en la API REST introducida en WordPress 4.7.0 que permitía a cualquier usuario inyectar contenido en cualquier post o página de WordPress. Esta vulnerabilidad presenta un nivel 9 de DREAD por la escalada de privilegios remota.
CVE-2017-5610
En wp-admin/includes/class-wp-press-this.php no existe restricción de visibilidad de la interfaz del usuario para la asignación de taxonomías y terms a los posts de WordPress. Por lo tanto, un usuario sin permisos para ello puede editar o añadir nuevos atributos a los posts. En la versión 4.7.1, al pulsar el botón Press it se ejecuta el código del PHP antes citado sin realizar comprobación alguna de los permisos del usuario actualmente conectado.
En la actualización 4.7.2 se añaden múltiples comprobaciones de estos permisos para gestión de taxonomías en las declaraciones de los botones encargados de asignar las mismas a cada post.
Principalmente, se trata de la siguiente línea:
En la versión anterior, tan solo aparece un if al inicio de las declaraciones de los botones.
CVE-2017-5611
Se trata de una vulnerabilidad de tipo inyección SQL, que afecta a todas las versiones anteriores a WordPress 4.7.2. Esta vulnerabilidad es crítica según ha calificado el Common Vulnerability Scoring System v3 con una puntuación de 9.8 sobre 10.
Se aprovecha de un tratamiento incorrecto de los datos de entrada manejados en el fichero /wp-includes/class-wp-query.php para realizar la inyección SQL y permitir la ejecución de código arbitrario de manera remota. El núcleo de la plataforma no está directamente afectado, pero si ciertos módulos, mediante los que se puede ejecutar la inyección. WordPress ha corregido dicha vulnerabilidad controlando la entrada de datos de la siguiente forma:
CVE-2017-5612
Otro de los problemas que se encuentran en la versión 4.7.1 es un XSS (Cross-site Scripting), que permite a los atacantes inyectar HTML o scripts arbitrarios.
La vulnerabilidad reside en class-wp-posts-list-table.php, siendo las líneas afectadas las siguientes:.
La llamada a the_excerpt() realiza una llamada a get_the_excerpt(), la cual realiza una petición POST modificable por el atacante. Mediante un excerpt elaborado para ello, podría redireccionar a otra página, o cargar HTML o scripts arbitrarios.
La modificación realizada para parchearlo consiste en modificar esta llamadaa a the_excerpt() por una que sanea el código HTML que esté presente en el mismo mediante la función esc_html(), quedando así:
Inyección de contenido por API REST
WordPress, en su versión 4.7.0 incluyó un API REST para acceder y modificar el contenido del sitio mediante otras aplicaciones o scripts, permitiendo su automatización de una forma más intuitiva que la previa interfaz de PHP, y más oficial que el plug-in de REST de las versiones previas.
Esta interfaz de REST presentaba una vulnerabilidad en el endpoint wp-json/wp/v2/posts/<id>.
El controlador de este endpoint solo acepta como ID a dígitos, pero da más prioridad a parámetros enviados como valores en una petición de POST o GET.
En una llamada como la expuesta arriba, dará más prioridad a ?id=1234a, de forma que asignará a id el valor inválido de 1234a, algo que no debería de causar ningún mayor problema más que levantar un error.
El problema está en cómo valida y sanea la ID presentada, y en cómo valida la existencia de permisos para la acción pedida. En particular, vemos que en el caso de update_item, se usa update_item_permissions_check para ello. Por ejemplo, la siguiente llamada usaría update_item.
Este método usa una forma un tanto peculiar de comprobar si la petición es valida: usa get_post() para comprobar que el post existe, y en caso positivo, si el usuario actual tiene permisos para actualizarlo. En el caso de que la ID suministrada sea inválida, como en el caso de la ID suministrada como parámetro de POST, devuelve true siempre.
Lo cual tampoco debería de causar problema si no fuera por el funcionamiento del método update_item. Su primera línea es $id = (int)$request(‘id’);, castear el valor de ID de la request a un entero, antes de pasarselo a get_post() para trabajar con el mismo.
Este casteo en un principio no debería de ser peligroso, si no fuese debido a la posibilidad de introducir IDs inválidas en el sistema mediante parámetros de POST, como la anterior 1234a. Esa ID, en update_item_permissions_check devolvería true, pero en el casteo, devolvería 1234. La llamada previa permitiría editar el post 1234 sin permisos para ello.
Esto se debe a una función de PHP llamada type-juggling. Esto permite al programador usar valores de un tipo en funciones que requieren de otro en casos donde otro tipo tendría más sentido. Por ejemplo, permite castear ‘123 Manzanas’ al entero ‘123’, lo cual podría ser útil en casos en los que se trabaje con strings por alguna razón, pero permite fallos como el anterior.
Esta vulnerabilidad permite a cualquier persona con acceso al API a editar cualquier post o página, aunque no disponga de los permisos para ello. Dada la naturaleza de los posts y páginas de WordPress, podría tratarse desde un leve caso de spam de SEO negativo, a rogue adveristing, o hasta ejecución de código arbitrario en las máquinas que lean esa página, o escalar a otros exploits presentes en algunos plug-ins.
Investigando en relación con esta vulnerabilidad se han descubierto dos scripts para la explotación de vulnerabilidades relacionadas con el REST API de Word Press 4,7,1:
REST API Privilege Escalation Exploit:
https://es.0day.today/exploit/26876
REST API Post privilege escalation / defacement exploit:
https://es.0day.today/exploit/26884
Pueden ampliar esta información en los siguientes enlaces:
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5610
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5611
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5612
- https://codex.wordpress.org/Taxonomies
- https://blog.sucuri.net/2017/02/content-injection-vulnerability-wordpress-rest-api.html
- http://php.net/manual/en/language.types.type-juggling.php
Venimos siguiendo de cerca estas vulnerabilidades de WordPress en conjunto con Daniel Maldonado, el autor del libro “Máxima Seguridad en WordPress” de la editorial 0xWord (http://0xword.com/es/libros/84-maxima-seguridad-en-wordpress.html)
Y teniendo en cuenta las recientes vulnerabilidades hemos lanzado a través del campus virtual de Aula 25 una charla gratuita y un curso sobre el el tema:
Charla grabada: https://www.youtube.com/watch?v=eSA6GNEKCpQ&feature=youtu.be
Curso (requiere preinscripción): http://seu.sanfrancisco.utn.edu.ar/evento/curso-online-seguridad-en-wordpress-129