¿Los archivos de WordPress protegerán contra el inicio de sesión CSRF?

2

¿Se puede utilizar Wordpress Nonces para protegerse contra el inicio de sesión CSRF? enlace

Revisé el código de la función y parece que solo se está utilizando la ID de usuario para la verificación. Eso significa que el atacante y la víctima tendrán la misma identidad. ¿Es esto realmente correcto?

    
pregunta user82444 08.08.2015 - 18:06
fuente

2 respuestas

2

Sí, las fuentes de WordPress pueden proteger contra el inicio de sesión CSRF.

Los archivos de WordPress se pueden aplicar a URL y también a formularios, como el formulario de inicio de sesión:

  

Para agregar un nonce a un formulario, llame a wp_nonce_field () especificando una cadena   representando la acción. Por defecto wp_nonce_field () genera dos   campos ocultos, uno cuyo valor es el nonce y otro cuyo valor es el   URL actual (el referente), y se hace eco del resultado. Por ejemplo,   esta llamada:

wp_nonce_field( 'delete-comment_'.$comment_id );
     

podría hacer eco de algo como:

<input type="hidden" id="_wpnonce" name="_wpnonce" value="796c7766b1" />
<input type="hidden" name="_wp_http_referer" value="/wp-admin/edit-comments.php" />

Por lo general, los nonces se crean adjuntos a un usuario que ha iniciado sesión porque tiene sentido proteger a los usuarios que han iniciado sesión. Pero el inicio de sesión de CSRF es especial porque se puede usar para apuntar al usuario que ha finalizado la sesión.

Mirando a través del código wp_create_nonce puedo ver que los nonces también se crean para usuarios que han cerrado la sesión:

function wp_create_nonce($action = -1) {
    $user = wp_get_current_user();
    $uid = (int) $user->ID;

    if ( ! $uid ) {
        $uid = apply_filters( 'nonce_user_logged_out', $uid, $action );

    }

    $token = wp_get_session_token();
    $i = wp_nonce_tick();

    return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );
}

Luego use wp_verify_nonce para verificar el nonce. Devuelve falso si el nonce no es válido. De lo contrario, devuelve un entero con el valor de:

  • 1 : si el nonce se ha generado en las últimas 12 horas o menos.
  • 2 : si el nonce se generó entre 12 y 24 horas.
respondido por el Cristian Dobre 08.08.2015 - 22:08
fuente
0
  

Eché un vistazo al código de la función y parece que solo está   el uso del ID de usuario para la verificación, lo que significa que el atacante y   ¿La víctima tendrá el mismo nonce? ¿Es esto realmente correcto?

Mirando el código se puede observar que el identificador de sesión se usa como parte de la generación de nonce :

    $token = wp_get_session_token();
    $i = wp_nonce_tick();

    return substr( wp_hash( $i . '|' . $action . '|' . $uid . '|' . $token, 'nonce' ), -12, 10 );

Esto vincula el token de la sesión con el nonce, por lo que si el formulario se envió con los nonces de otra sesión (por ejemplo, el nonce del atacante), wp_verify_nonce no coincidirá, protegiendo contra el inicio de sesión CSRF.

Consulte esta respuesta para obtener más información sobre esta técnica (con la sección de cookies anónimas).

    
respondido por el SilverlightFox 25.01.2016 - 12:42
fuente

Lea otras preguntas en las etiquetas