Un espacio para los entusiastas del web

Wordpress 2.8.4, actualización de seguridad

Publicado el 12 de Agosto, 2009

Wordpress LogoHace 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 ;)

¿Te gustó?

¡Sí, me gusta! Le ha gustado a 10 personas
Loading ... Loading ...

Javier ArocheJavier Aroche para Maestros del Web.
Agrega tu comentario | Enlace permanente al artículo

Síguenos en: @maestros | Fan page

Comentarios

  1. enterado, gracias por la informacion

    Responder
  2. 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

    Responder
  3. 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.

    Responder
  4. 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.

    Responder
  5. Leo Mtz.

    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.

    Responder
  6. Gracias AlbertoPGT :)

    @David Tavarez, técnicamente el problema no es con empty() sino la forma en que PHP define $key como un array

    Responder
  7. 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.

    Responder

Deja tu Comentario

Maestros del Web se reserva el derecho de moderación de los comentarios. Evita utilizar palabras soeces, ataques directos, descalificativos, insultos, de lo contrario tu comentario será eliminado.



Acerca de

Maestros del Web nace cuando intentamos traducir Webmaster al Español. Nacimos orientados al diseño y desarrollo web. Hoy somos un espacio de apoyo para los entusiastas que participan en proyectos en la red.
Leer más de Maestros del Web

Últimos comentarios