Todos aquellos que utilizen un blog en su propio hosting, deberían revisar si su blog es vulnerable al siguiente bug donde cualquier persona mediante una sencilla inyección de codigo puede resetear el password de administrador de cualquier blog de wordpress versión 2.8.3.
La inyección se puede realizar mediante los siguientes dos enlaces, donde se consigue llegar a la página donde se indíca el email para enviar la nueva contraseña. Por suerte solo será válido el email registrado por el administrador, ya que pudiendo validar cualquier email muchos administradores perderían facilmente su blog. Por otra parte, el email del administrador generalmente no cuesta demasiado conseguirlo ya que en algún lugar del blog lo más probable es que salga publicado.
La inyección se puede realizar mediante los siguientes dos enlaces, donde se consigue llegar a la página donde se indíca el email para enviar la nueva contraseña. Por suerte solo será válido el email registrado por el administrador, ya que pudiendo validar cualquier email muchos administradores perderían facilmente su blog. Por otra parte, el email del administrador generalmente no cuesta demasiado conseguirlo ya que en algún lugar del blog lo más probable es que salga publicado.
http://DOMAIN_NAME.TLD/wp-login.php?action=rp&key[]=
http://DOMAIN_NAME.TLD/wordpress/wp-login.php?action=rp&key=o7naCKN3OoeU2KJMMsag
El Bug se encuentra en el archivo wp-login.php y fué descubierto el pasado mes de agosto.
wp-login.php:
...[snip]....
line 186:
function reset_password($key) {
global $wpdb;
$key = preg_replace('/[^a-z0-9]/i', '', $key);
if ( empty( $key ) )
return new WP_Error('invalid_key', __('Invalid key'));
$user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_activation_key = %s", $key));
if ( empty( $user ) )
return new WP_Error('invalid_key', __('Invalid key'));
...[snip]....
line 276:
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'login';
$errors = new WP_Error();
if ( isset($_GET['key']) )
$action = 'resetpass';
// validate action so as to default to the login screen
if ( !in_array($action, array('logout', 'lostpassword', 'retrievepassword', 'resetpass', 'rp', 'register', 'login')) && false === has_filter('login_form_' . $action) )
$action = 'login';
...[snip]....
line 370:
break;
case 'resetpass' :
case 'rp' :
$errors = reset_password($_GET['key']);
if ( ! is_wp_error($errors) ) {
wp_redirect('wp-login.php?checkemail=newpass');
exit();
}
wp_redirect('wp-login.php?action=lostpassword&error=invalidkey');
exit();
La solución temporal para esté bug consiste en hacer la siguiente substitución de línea en este archivo con algún editor web o el blog de notas.
Cambiar esta linea ====> if ( empty( $key ) )
Por esta otra linea ====> if ( empty( $key ) || is_array( $key ) )




viernes, septiembre 11, 2009
Albert López
Posted in: 

0 comentarios:
Publicar un comentario