it-swarm.com.de

Das Feld für das Benutzerkennwort ist leer

Hinweis: Die beschriebene Situation befindet sich in einer lokalen Umgebung. Ich würde gerne wissen, was passiert, wenn es mit dieser Einstellung live geht.

Ich habe ein Plugin installiert und es hat das gesamte Kennwort in der Datenbank WP zurückgesetzt, sodass jetzt alle Kennwörter für vorhandene Benutzer leer sind. Ich habe ein neues Passwort für meinen persönlichen Benutzer generiert. Kann ich bei anderen Benutzern das Kennwort in der Datenbank leer lassen oder ist es gefährlich? Ich habe festgestellt, dass die Anmeldung in WordPress nicht möglich ist, wenn ich versuche, mich mit einem leeren Passwort anzumelden.

3
testermaster

Ich würde das immer noch nicht empfehlen, weil es wahrscheinlich irgendwie ausnutzbar ist ...

Unter der technischen Voraussetzung, dass alle richtigen Hooks und Funktionen aufgerufen werden, sollte ein Benutzer nicht in der Lage sein, sich anzumelden, wenn er ein leeres Kennwort eingibt, selbst wenn das Feld user_pass in der Datenbank leer ist.

Warum...?

Wenn Sie versuchen, sich mit dem Formular anzumelden, wie es auf /wp-login./php zu sehen ist, ruft WordPress wp_authenticate_username_password() auf, das mit der Aktion authenticate verknüpft ist.

wp_authenticate_username_password() prüft, ob der übermittelte $password nicht leer ist. Wenn es leer ist, wird eine Instanz von WP_Error ausgelöst und die Anmeldeanforderung wird abgelehnt.

Das Gleiche gilt überall, wo Sie versuchen, sich anzumelden, sei es in einem benutzerdefinierten Anmeldeformular oder nicht, vorausgesetzt, die richtigen Hooks oder Funktionen werden aufgerufen, z. authenticate oder wp_authenticate_username_password().

Selbst wenn Sie den Punkt wp_check_password() von wp_authenticate_username_password() erreichen, generiert ein leeres Kennwort dennoch einen Hashwert, wenn es durch md5() ausgeführt wird, z. md5('') //d41d8cd98f00b204e9800998ecf8427e.

Wenn wir also die Funktion wp_check_password() aufrufen, wird die folgende Logik ausgeführt ...

Quelle: wp-includes/pluggable.php

function wp_check_password($password, $hash, $user_id = '') {
    global $wp_hasher;

//note that...
//$password  = '' and $hash (from db) = ''

// If the hash is still md5...
if ( strlen($hash) <= 32 ) {
    $check = hash_equals( $hash, md5( $password ) ); // <- $check will return false, because the $hash is empty and does not match the hash of md5($password)

    if ( $check && $user_id ) {
        // Rehash using new hash.
        wp_set_password($password, $user_id);
        $hash = wp_hash_password($password);
    }

    /**
     * Filter whether the plaintext password matches the encrypted password.
     *
     * @since 2.5.0
     *
     * @param bool   $check    Whether the passwords match.
     * @param string $password The plaintext password.
     * @param string $hash     The hashed password.
     * @param int    $user_id  User ID.
     */
    return apply_filters( 'check_password', $check, $password, $hash, $user_id );
}


// If the stored hash is longer than an MD5, presume the
// new style phpass portable hash.
if ( empty($wp_hasher) ) {
    require_once( ABSPATH . WPINC . '/class-phpass.php');
    // By default, use the portable hash from phpass
    $wp_hasher = new PasswordHash(8, true);
}

$check = $wp_hasher->CheckPassword($password, $hash);

/** This filter is documented in wp-includes/pluggable.php */
return apply_filters( 'check_password', $check, $password, $hash, $user_id );

}

Ok, sobald wir getroffen haben:

if ( strlen($hash) <= 32 ) {
    $check = hash_equals( $hash, md5( $password ) );

$check gibt false zurück, da der Wert von $hash eine leere Zeichenfolge ist und der Wert von md5($password), der im Wesentlichen md5('') ist, wie oben erwähnt, d41d8cd98f00b204e9800998ecf8427e.

Daher wird der Anmeldeversuch abgelehnt.

Theoretisch sind Sie also sicher, es sei denn, ein böswilliger Code greift in Folgendes ein:

return apply_filters( 'check_password', $check, $password, $hash, $user_id );

... und gibt true zurück. Aber jeder kann das unter normalen Umständen tun, wenn in der Datenbank korrekte Kennwort-Hashes vorhanden sind.

Empfehlung:

Das user_pass-Feld in der Datenbank leer und ohne Hashes zu lassen, ist eine schlampige und schlechte Praxis.

Angenommen, jemand wüsste, dass alle Passwörter in der Datenbank leer waren und Sie verarschen wollten, dann wären sie auf halbem Weg. Sie müssen lediglich einen Weg finden, das System auszunutzen.

Da es unwahrscheinlich ist, dass Sie jeden Teil des internen Kerncodes sowie den Code von Plug-ins und wahrscheinlich Ihr Thema überprüft haben, wissen Sie nicht, wann oder ob leere Passwörter aufgrund einiger Fehler wieder in den Arsch beißen. Fall Zero-Day-Exploit, der eingeführt wird.

Stattdessen...

//you can use get_users() if you prefer instead of $wpdb directly...
//this is just a one time operation.. don't forget to exclude those
//users whom you do not wish to reset a password for, e.g. yourself

global $wpdb;

$users = $wpdb->get_col("SELECT ID FROM {$wpdb->prefix}users WHERE 1 = 1");

foreach ($users as $user_id) {
    wp_set_password(wp_generate_password(), $user_id);
}

... tun Sie sich selbst einen Gefallen und setzen Sie Passwörter für alle Benutzer und lassen Sie den Benutzer das Passwort zurücksetzen oder generieren Sie eine E-Mail mit einem Link zum Zurücksetzen des Passworts.

1
userabuser