Aspectos de seguridad en WordPress (1/4)

Como sabemos WordPress es un conocido sistema para la getion de contenidos (CMS) que fue creado por Matt Mullenweg. Este sistema se enfoca principalmente en la creación de blogs y cuenta con más de 200 millones de usuarios en todo el mundo.

WordPress está basado en PHP y MySQL y posee una licencia GPL. La popularidad de este sistema lo ha puesto en la mira de las críticas sobre todo en los aspectos  de  seguridad.  Aun hoy en dia en su última versión (3.3) hay problemas que no han sido resueltos. Podemos observar un ejemplo de esto en los graficos generados por la empresa Secunia, para las versiones 2.X y 3.X.

Actualmente un 14% de las vulnerabilidades encontradas sin corregir en sus versiones 3.X y un 21% en las versiones 2.X.

Algunas de estas vulnerabilidades que se pueden mencionar son a la posibilidad de enumerar los usuarios existentes, obtener fácilmente la versión de WordPress que se está utilizando en la página web, errores de Cross Site Scripting (XSS) o problemas relacionados con Denegación de Servicio (DoS).

Enumerar los usuarios existentes

Se han obtenido multitud de sitios donde probar nombres de usuario y comprobar que se obtiene un mensaje de error diferente en función de si el usuario existe o no o si la contraseña introducida no es correcta, tal y como se muestra en las siguientes capturas de pantalla que realize en mi blog antes de corregir este problema. Para este ejemplo use un user “gandhi” para que se puedan observas los diferentes mensajes (Aún no solucionado en la versión 3.3).

Como se observa en la figura anterior el mensaje (Remarcado) devuelto indica que el usuario “gandhi” existe en el sistema.

En esta figura pueden observar como cambia el mensaje cuando el usuario ingresado, “gandhe” not existe en el sistema.

Usando esta simple vulneravilidad se puede generar una lista de los usuarios en el sistema, aun mas si se intuye nomenclatura para la creación de los nombres de los users.

Para solucionar este aspecto en nuestro WordPress debemos hacer un par de ediciones en los archivos del theme (/wp_content/themes/nombre_theme) que se este usando actualmente.

Primero editando el script “functions.php” del “theme” y añadiendo la siguiente línea se consigue que WordPress no proporcione ningún mensaje de error en el momento del inicio de sesión (login):

add_filter('login_errors',create_function('$a', "return null;"));

En la siguiente imagen podemos observar que el recuadro rojo que muestra los mensajes de error ahora aparecera vació.

Igualmente es posible detectar si el usuario existe porque a pesar de no obtener ningún mensaje de error diferente si el usuario existe o no, al introducir un nombre de usuario inexistente, la caja de login de WordPress muestra una vibración que permite conocer que el usuario no es válido.

Como habrán observado en las imágenes anteriores uso un pluguin para colocar un captcha code y evitar que nos usen un bot para logueos forzados. Esto lo pueden colocar usando un pluguin que se llama “SI CAPTCHA Anti-Spam“. Ahí tienen el link de la pagina para la descarga. Ademas también lo pueden usar para el sector de comentarios cuando los usuarios desean añadir uno y de esa manera evitar los comentarios spam.

También es necesario restringir el acceso al script “wp-login.php” y al directorio “/wp_admin” mediante, por ejemplo, .htaccess. Este aspecto y los mencionados anteriormente los tratare posts siguientes.