WordPress 2.8.4, actualización de seguridad
Hace unos días fue descubierta una «falla de seguridad» en Wordpress, que permitiría a cualquiera reiniciar la contraseña del administrador del blog (concretamente la primera cuenta del blog, que casi siempre es el usuario admin). No significa que van a obtener acceso al blog, pero con lo fácil que es realizar el «ataque» puede llegar a ser molesto si no se repara.
El equipo de WordPress no se ha demorado y liberaron la versión 2.8.4 corriguiendo este problema que afecta al a rama 2.8.x, y posiblemente a las anteriores también.
El Ataque
Usualmente el proceso de reiniciar la contraseña requiere que se haga una confirmación al visitar una URL especial, que solo llegará a la cuenta de coreo del usuario en cuestión. Pero esta restricción se puede obviar al visitar una URL como:
http://misuperblog.com/wp-login.php?action=rp&key[]=
Lo que parece ser una petición inocente, tiene el detalle que la variable key está definida como un array (key[]=
). El código de WordPress válida que dicha variable no esté vacía:
if ( empty( $key ) )
Uno pensaría que esta comprobación debería ser suficiente, ¿no?
Aprendiendo un poco del ataque
Sabemos que la comprobación de WordPress fallaba y según el parche oficial, decidieron agregar otra comprobación al if en cuestión:
if ( empty( $key ) || is_array( $key ) )
Entonces, ¿Cuál es el problema de usar solo empty( $key )
? Resulta que en este caso $key no es un array vacío, sino que si contiene un elemento:
// si ejecutamos: var_dump($_GET['key']); // obtendríamos: array ( 0 => '', )
Lo cual viene a ser una particularidad inesperada de PHP, una que el equipo de WordPress no tuvo en cuenta, y que a cualquiera de nosotros también podría pasar por la misma situación. Nos queda de lección que hay que limitar lo más posible el rango de valores posibles en las variables que estamos recibiendo del usuario, por ejemplo a mí se me ocurren estas otras dos opciones para limitar $key
:
- Haciendo un CAST del valor:
$key = (string) $_GET['key']; var_dump($key); // Obtenemos: 'Array'
- Usando preg_match():
$r = preg_match('/[a-z0-9]*/i', $_GET['key'], $matches);
Al pasar un array en preg_match, obtenemos: Warning: preg_match() expects parameter 2 to be string, array given in blablabla.php on line XX
. Pero de todos modos $r es false y $matches NULL
¿Alguna otra forma que se les ocurra a ustedes?
Moralejas: Actualicen WordPress o apliquen el parche, y si son programadores revisen los valores que pueden tomar sus variables de decisión 😉
[…] ha descubierto una nueva vulnerabilidad en WordPress por la que te resetean tu clave de administrador, no te la roban, pero si te la resetean, de hecho, […]
enterado, gracias por la informacion
Luego del ataque a Hipertextual de ayer es bueno revisar todos los niveles de seguridad que pueda ofrecer WP para protegernos y de paso ayudar a enviar colaboraciones al equipo de WordPress para versiones cada vez más seguras
Los posts técnicos de Javier Aroche siempre me han gustado porque explican con detalle aspectos de programación en términos sencillos, yo estudié algunos lenguajes en la década de los 90, y aún tengo aquella curiosidad por leer letra por letra del código.
Esta interesante… realmente es un comportamiento inesperado de la funcion empty()… pero es una gran falla que el equipo de wordpress no lo haya tomado en cuenta.
[…] Maestros del Web he encontrado la explicación del problema y la solución […]
[…] FUENTE […]
Me parece muy importante este post. mucho de mis amigos tiene su blog bajo esta plataforma y algunos vienen quejandose de algunas inrregularidades en los ultimos dias.
Gracias, Javier creo que deberias de ampliar la cobertura de informacion hacia otros blogs para que nuestros amigos sigan tus consejos,que a comentario de muchos son muy practicos y corrigen el problema.
Salud.
[…] Más Información del Ataque por Maestros del Web Comparte esto en: […]
[…] no iban a poder terne acceso al blog pero se podría convertir en una molestia, la web Maestros del Web ha hecho un análisis intenso a este error mostrando una posible solución que pueden […]
[…] actualizaciones de WordPress, todas criticas a nivel de seguridad. La última es la 2.8.4, por un ataque descubierto al reset de password de los […]
Gracias AlbertoPGT
@David Tavarez, técnicamente el problema no es con empty() sino la forma en que PHP define $key como un array
[…] Maestros del Web […]
Desde hace 10 días tengo problemas en mi pagina, se duplican algunas entradas y me borra una parte de las tablas de paginas. Administro mi sitio y la versión que tengo es 2.6.1 debo actualizar o debo hacer algun parche de seguridad.