Bug: Reset Admin Password pada WordPress 2.8.3


Bagi anda yang menggunakan wordpress sebagai engine blog, info berikut ini mungkin sangat berguna untuk anda. WordPress sebelum versi 2.8.4 memiliki bug Reset Admin Password. Pada versi-versi tersebut seserang tanpa akses privilege apapun dapat dengan mudah mereset password account anda anda hanya dengan mensupply sebuah array pada parameterkey yang ada di query string URL.

Contoh normal link:

http://www.example.com/wp-login.php?action=rp&key=o7naCKN3OoeU2KJMMsag

Link untuk reset:

http://www.example.com/wp-login.php?action=rp&key[]=

Berikut ini adalah potongan code yang menyebabkan bug tersebut.

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();
 
break;


» Patch Bug

Untuk memperbaiki bug tersebut ada dua cara yaitu:

  • Upgrade ke WordPress 2.8.4, atau
  • Melakukan patch manual

Nah bagi yang malas upgrade wordpress sebaiknya segera melakukan patch secara manual. Berikut ini adalah perubahan pada file wp-login.php sebelum dan sesudah dipatch.

Sebelum patch (cari pada baris sekitar 350-an):

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();
 
break;


Sesudah dipatch:

case 'resetpass' :
case 'rp' :
	if (is_array($_GET['key'])) {
		die("<strong>Hacking detected.</strong>");
		exit();
	}
	$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();
 
break;

Setelah itu re-upload file wp-login.php ke server anda kembali.

Referensi:
http://milw0rm.com/exploits/9410

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: