XSS en algunos temas de WordPress

Hace un par de días un compañero de trabajo me avisaba de que la web de Mosaic, en la que hago «más o menos» de responsable técnico tenía un problema de XSS (inyección de código) en el formulario de búsqueda.

Alarmado, rápidamente actualicé la versión de WordPress a la 2.9.1, pero no conseguí solucionar el problema. La prueba era fácil, poniendo este sencillo script en el formulario de búsqueda

<script>alert("hola");</script>

Se abría un cuadro de diálogo de alerta.

Hoy, con tranquilidad, me he dedicado a investigar. El error se produce sólo en algunos blogs de WordPress, no en todos. Por tanto no es un problema del gestor de contenidos.

Después de algunas pruebas y algunos cambios, el error ha aparecido. Es un problema de algunos temas de WordPress y es muy fácil de arreglar. En el formulario de búsqueda de los temas que tienen la vulnerabilidad podemos ver algo parecido a esto:

<label for="s"><input type="text" name="s" id="s" size="50" maxlength="200" value="<?php echo get_search_query(); ?>" /></label>

El problema es el echo del código php. Eliminándolo se elimina el problema. Fácil :)

Actualización: Tal como apuntan Javier y Oscar en los comentarios, el problema no es tanto del echo (que permite mostrar la cadena buscada) como el hecho que no se filtre adecuadamente get_search_query().

Por tanto, tal y como propone Javier, en vez de eliminar el echo la solución más elegante es <?php echo htmlentities(get_search_query()); ?>

6 opiniones en “XSS en algunos temas de WordPress”

  1. Hola el error no es que aparezca el término de la búsqueda, que puede resultar interesante volver a ver la cadena buscada.

    El problema es que no se filtren los resultados que se insertan…..

    Con PHP en lugar de eliminar el echo, creo que resulta mucho más práctico y fino filtrar el resultado de get_search_query() con la función htmlentities() que nos codificará los caracteres especiales del html ( , & )… a < > & …. . Es conveniente utilizar esta función con la opción ENT_QUOTES para que nos codifique también las comillas.

    En algunos casos también puede ser útil el uso de la función strip_tags para eliminar tags html de una cadena determinada.

    Saludos.

  2. Me lo apunto!

    Hasta en mi propio blog he caído :( y el caso es que siempre he tenido presente los problemas de inyección de código cuando desarrollo mis propios proyectos. Al tratarse de WP me confié y zaca, mal creí que la cadena devuelta estaría escapada.

    Si se quiere mostrar la cadena de búsqueda que devuelve WP de formas segura podemos usar strip_tags o htmlentities.

    Ejemplo:

    El problema no es tanto del comando echo sino del valor de get_search_query()

    Un saludo.

  3. Javiaurea creo que es mejor:

    para codificar también las comillas. Es importante codificar las comillas porque imaginemos que ponemos la consulta xxxxx en un campo input:

    si no codificamos las comillas, la consulta «xxxxxx nos cierra las comillas del value:

    dejando todavía vulnerable el codigo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *