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.
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.
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
http://lug.stikom.edu/2010/02/patching-bug-reset-admin-password-pada-wordpress/







Pernahkah ada keinginan dari anda untuk mengganti hostname dari sistem anda. Biasanya ketika kita menginstall misal distro ubuntu hostname kita akan menjadi username-laptop dsb. Nah bagaimana kita mengubahnya? Caranya sebenarnya cukup simple. Buka terminal anda klik Application » Accessories » Terminal
Wah… udah lama g ngepost nih, saatnya meramaikan kembali blantikan situs lug.stikom.edu :D. OK, langsung saja. Mencari nama file adalah hal yang biasa dan sudah sering dilakukan bahkan end-userpun sering melakukannya. Tetapi, bagi sebagian dari kita terutama application developer yang kegemarannya ngoprek source code. Bayangkan situasi seperti ini:









