Wordpress güvenlik açığını Anlamak

2 Cevap php

Bir güvenlik açığı son zamanlarda WordPress 2.8.3 etkiler ve yönetici kullanıcı şifresini değiştirerek kendi hesabının kilitlenmesine izin verdiği açıklanmıştır.

This post Tam Açıklanmasına İlişkin kusur ayrıntıları ve ilgili kod parçacıkları içerir. Mesajı bahseder 'You can abuse the password reset function, and bypass the first step and then reset the admin password by submiting an array to the $key variable.'

PHP daha ayrıntılı hata açıklayan aşina birisi ilgi duyarım.

Etkilenenlerin gerekir update görünüşe göre kusur giderir yeni 2.8.4 sürümü için.

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

2 Cevap

Yani $ anahtar tek bir boş dize ile sorgu dizesi bir dizidir ['']

http://DOMAIN_NAME.TLD/wp-login.php?action=rp&key[]=

reset_password bir dizi ile çağrılır, ve sonra preg_replace çağrılır:

 //$key = ['']
 $key = preg_replace('/[^a-z0-9]/i', '', $key);
 //$key = [''] still

preg_replace bir dize veya dizeleri bir dizi ya kabul eder çünkü. Bu regex hiçbir şey değiştirir ve aynı dizi döndürür. $ Anahtar boş değil (boş bir dize bir dizi s) yani bu olur:

 $user = $wpdb->get_row($wpdb->prepare("SELECT * FROM $wpdb->users 
      WHERE user_activation_key = %s", $key));

Şimdi burada, ben davranır hazırlamak nasıl wordpress kaynağını okumak gitmek gerekir ...

More:

Yani boş bir dize üretir vsprintf aramaları hazırlamak

$a = array('');
$b = array($a);
vsprintf("%s", $b);
//Does not produce anything

Yani SQL olduğunu:

SEÇİN * $ DAN wpdb-> kullanıcılar WHERE user_activation_key =''

apparently (herhalde activation_keys olmadan ve tüm kullanıcıları) admin kullanıcı maç hangi.

Ve bu nasıl.

I how to patch this vulnerability üzerine bir ilgili soru var - wp-login.php on satır 190 şimdi bu gibi görünmelidir;

if ( empty( $key ) || is_array( $key ) )