Patching Bug: Reset Admin Password pada Wordpress <= 2.8.3

PERINGATAN!

Artikel ini hanya untuk pengetahuan semata-mata, segala tindakan yang diakibatkan oleh artikel ini bukan merupakan tanggung jawab penulis. Terima kasih.

WP LogoBagi 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.

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();
 
break;
...[snip ]...

» Patching the 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.

Bagi yang memiliki akses shell ke server anda dapat melakukan patch dengan menggunakan perintah berikut(asumsi file wp-login.php.patch satu direktori).

$ patch wp-login.php -i wp-login.php.patch

Download wp-login.php.patch

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

Posted by rio
  1. 2 Responses to “Patching Bug: Reset Admin Password pada Wordpress <= 2.8.3”

  2. yyiihaaa..pertamax!
    nice inpoh gan..!

    By w0ng phei hung on Feb 3, 2010

  3. mantap gan!!!!

    inpoh aye terime……

    By bejo on Feb 3, 2010

Post a Comment