Home » Sicurezza Wordpress » Difetti logici

Difetti logici

WordPress offre una moltitudine di funzioni di sicurezza per aiutare gli sviluppatori a proteggere il loro codice da vulnerabilità note delle applicazioni web.

Tuttavia, indipendentemente dal numero di funzioni di sicurezza utilizzate, alcune vulnerabilità non possono essere risolte con la convalida, la sanificazione o l’escape.

A volte gli sviluppatori introducono errori nella logica del loro codice, ovvero difetti logici.

Questi difetti si verificano quando uno sviluppatore scrive codice che consente involontariamente azioni non autorizzate, anche se sono presenti le funzioni di sicurezza di WordPress.

Considera il seguente esempio. Riesci a individuare il difetto?

function arm_check_user_cap( $arm_capabilities = '', $is_ajax_call = '', $nonce_required = 0 ) {
    global $arm_global_settings;
 
    $errors  = array();
    $message = '';
    if ( $is_ajax_call == true || $is_ajax_call == '1' || $is_ajax_call == 1 ) {
        if ( ! current_user_can( $arm_capabilities ) ) {
            $errors[]               = esc_html__( 'Sorry, You do not have permission to perform this action.', 'armember-membership' );
            $return_array           = $arm_global_settings->handle_return_messages( @$errors, @$message );
            $return_array['message'] = $return_array['msg'];
 
            echo json_encode( $return_array );
            exit;
        }
    }
 
    $wpnonce            = isset( $_REQUEST['_wpnonce'] ) ? sanitize_text_field($_REQUEST['_wpnonce']) : '';
    $arm_verify_nonce_flag = wp_verify_nonce( $wpnonce, 'arm_wp_nonce' );
    if ( ! $arm_verify_nonce_flag && ( !empty( $wpnonce ) || !empty($nonce_required) ) ) {
        $errors[]               = esc_html__( 'Sorry, Your request can not process due to security reason.', 'armember-membership' );
        $return_array           = $arm_global_settings->handle_return_messages( @$errors, @$message );
        $return_array['message'] = $return_array['msg'];
        echo json_encode( $return_array );
        exit;
    }
}

Questa funzione è responsabile della verifica della capacità di un utente di eseguire un’azione e della verifica di un nonce. Notate però come sono definiti questi controlli:

  • L’autorizzazione ( current_user_can()) avviene solo se $is_ajax_call è vera.
  • Il controllo del nonce avviene solo se $nonce_required è impostato (o se è presente un nonce).

Ciò crea una situazione in cui:

  • Se $is_ajax_callè falso, il controllo della capacità viene completamente saltato.
  • Se $nonce_required è falso (o non impostato), anche il controllo del nonce può essere ignorato.

Di conseguenza, se uno sviluppatore o un aggressore può richiamare questa funzione con $is_ajax_call = false$nonce_required = 0, né il controllo della capacità né il controllo del nonce verranno eseguiti, il che significa che la funzione non fornisce alcuna protezione significativa in tale scenario.


Traduzione in italiano della WordPress Security Research di Wordfence

WordPress Security Architecture

Lascia un commento