Home » Sicurezza Wordpress » Principali funzioni per la sicurezza di WordPress

Principali funzioni per la sicurezza di WordPress

WordPress fornisce agli sviluppatori l’ API di sicurezza , che include la suite di funzioni che il core di WordPress utilizza per proteggere il proprio codice.

Queste funzioni includono la sanificazione dei dati, la convalida, l’escape, le funzioni di interazione sicura con il database, i nonce e i controlli dei ruoli e delle capacità degli utenti.

Come ricercatori di vulnerabilità, è importante capire cosa sono queste funzioni, i loro scopi specifici e come ci si aspetta che gli sviluppatori le utilizzino.

Acquisendo una conoscenza approfondita di queste funzioni, possiamo identificarne l’utilizzo durante l’analisi statica.

Questo ci permette di determinare se gli sviluppatori le stanno utilizzando correttamente o se ci sono casi in cui queste funzioni avrebbero dovuto essere utilizzate ma sono state trascurate.

Questa comprensione è fondamentale per scoprire potenziali vulnerabilità, sapere quando passare all’analisi di un’altra porzione di codice o risolvere problemi di sicurezza nelle applicazioni WordPress.

Fondamenti di analisi statica

Prima di addentrarci nei dettagli della Security API , rivedremo i fondamenti dell’analisi statica del codice: si tratta dell’attività di ricerca di vulnerabilità nel codice sorgente di un’applicazione senza eseguirla.

In altre parole, si acquisisce una comprensione della logica del codice leggendolo e analizzando le finalità di ogni file, classe e funzione.

A volte, durante l’analisi statica, si può ottenere solo una comprensione “approssimativa” del codice e potrebbe essere necessario eseguire un’analisi dinamica, che prevede l’esecuzione del codice caricando pagine, premendo pulsanti, inviando input di test e impostando punti di interruzione con un debugger e analizzando passo dopo passo le funzionalità del codice per ottenere un quadro completo.

Fonti, sink e flusso di dati

Quando si esegue un’analisi statica, ci sono tre principali concetti standard del settore che è possibile utilizzare durante la ricerca sulle vulnerabilità.

  • Fonti: le fonti sono essenzialmente da dove provengono gli input controllabili dall’utente.
    Sono i punti di ingresso nell’applicazione.
    Le fonti possono essere parametri di metodi HTTP, cookie, intestazioni HTTP, input di database e integrazioni di terze parti come contenuti incorporati o feed RSS.
  • Sink: i sink sono funzioni “pericolose”, ovvero funzioni che non dovrebbero essere eseguite utilizzando input controllabili dall’utente senza autorizzazione, convalida o sanificazione.
    Ad esempio, in WordPress, funzioni come add_user_meta(),  add_option()move_uploaded_file()file_put_contents()unlink(), e wp_set_auth_cookie() sono considerate sink. Anche le funzioni PHP generali come eval() sarebbero considerate sink.
    Consultare l’ Appendice per un elenco dei sink.
  • Flusso di dati: il flusso di dati è il percorso che i dati forniti dall’utente seguono da una sorgente a un sink.
    È importante mappare questo flusso di dati per identificare potenziali vulnerabilità.
    Approfondiremo questo argomento più avanti in questo articolo.

💡 Date un’occhiata a questo riferimento interattivo creato da uno dei principali ricercatori di vulnerabilità di WordPress, Stealthcopter, per sorgenti, sanitizer e sink PHP e WordPress.

Comprensione della gestione degli input e del flusso dei dati

La corretta gestione degli input è fondamentale per garantire la sicurezza delle applicazioni WordPress.

Pensatela in questo modo: le funzioni di un plugin o di un tema sono in un sistema chiuso finché non vengono implementati i meccanismi che interagiscono con il “mondo esterno”.

Se, ad esempio, uno sviluppatore di plugin creasse un plugin che aggiungesse semplicemente un banner statico a ogni post di WordPress e non facesse altro, sarebbe al sicuro da influenze esterne.

Pertanto, per comprendere dove risiedono le vulnerabilità, dobbiamo identificare qualsiasi punto di influenza esterna, ovvero ogni singolo modo in cui WordPress consuma input.

Gli input possono essere classificati in quattro tipologie principali: Superglobals , Input di database , Integrazioni di terze parti e Flussi di input alternativi.

Superglobals

Queste sono le principali fonti di input degli utenti nelle applicazioni web PHP, incluso WordPress. Coprono vari tipi di dati, tra cui invii di moduli, cookie, intestazioni HTTP e fonti di dati di terze parti. È possibile cercarli utilizzando l’IDE (Integrated Development Environment) o uno strumento come grep per identificare in quale punto del codice viene utilizzato l’input degli utenti.

  • $_POST
    • Invio di moduli: in genere da moduli HTML inviati tramite HTTP POST.
    • Richieste AJAX: dati inviati tramite AJAX admin-ajax.php tramite HTTP POST.
    • Payload JSON: dati JSON inviati nel corpo delle richieste POST.
    • Multipart Form Data: caricamento di file e altri dati dai forms.
    • Input di amministrazione WP: dati inviati tramite moduli di amministrazione, pagine di impostazioni e caricatore multimediale.
  • $_GET
    • Parametri URL: dati aggiunti agli URL nelle stringhe di query.
    • Richieste AJAX: dati inviati tramite AJAX tramite admin-ajax.php usando GET.
    • Endpoint personalizzati: parametri passati agli endpoint REST API personalizzati.
  • $_REQUEST
    • Dati GET e POST combinati e COOKIE: tutti i dati inviati tramite GET o POST o memorizzati nei cookie. 
      NOTA: alcuni host web rimuovono $_COOKIE da $_REQUEST.
  • $_COOKIE
    • Cookie: dati memorizzati nei cookie, spesso utilizzati per la gestione delle sessioni e delle preferenze.
  • $_FILES
    • Caricamenti di file: dati provenienti da file inseriti nei moduli, accessibili tramite l’array $_FILES.
  • $_SERVER
    • Dati del server e variabili ambiente: informazioni sul server e variabili d’ambiente relative alla richiesta, comprese le intestazioni HTTP e i percorsi degli script.
    • Intestazioni HTTP: User-Agent, Referer, X-Forwarded-For, Authorization, Intestazioni personalizzate.
  • $_SESSION
    • Dati di sessione: dati memorizzati nelle sessioni, se le sessioni vengono utilizzate dall’applicazione.

Input del database

Dati memorizzati e recuperati dal database di WordPress.

  • Tabella Options (dati memorizzati nella tabella wp_options).
  • Tabella User Meta (dati memorizzati nella tabella wp_usermeta).
  • Tabella Post Meta (dati memorizzati nella tabella wp_postmeta).
  • Tabelle personalizzate (dati memorizzati in tabelle di database personalizzate).

Integrazioni di terze parti, feed RSS e contenuti incorporati

Dati provenienti da fonti esterne integrati in WordPress.

  • API esterne
    • Risposte API: dati ricevuti da API esterne.
  • Webhook
    • Webhook in arrivo: dati ricevuti dalle chiamate webhook.
  • Contenuto incorporato
    • Incorporamenti oEmbed: contenuti incorporati da fonti di terze parti.
    • Incorporamenti esterni: contenuti incorporati da fonti esterne.
  • Feed RSS
    • Contenuto del feed: dati importati dai feed RSS.

Flussi di input alternativi

Alcuni sviluppatori di applicazioni WordPress potrebbero preferire utilizzare flussi di input alternativi per vari motivi (ad esempio, per accedere a dati di input grezzi) per utilizzare l’input fornito dall’utente.

  • php://
    PHP offre la possibilità di accedere a una varietà di flussi di input/output grezzi tramite php://.
    In genere, vedremo gli sviluppatori WordPress utilizzare i flussi di php://input in sola lettura consentendo l’accesso ai dati POST grezzi.
    È particolarmente utile per leggere JSON, XML o altri payload in cui è necessario l’accesso ai dati di input grezzi.
  • filter_input()
    Una funzione PHP che recupera una variabile esterna specifica (come un parametro GET) in base al nome e, facoltativamente, la filtra (ad esempio, assicurandosi che il valore del parametro GET sia una stringa).

Traduzione in italiano della WordPress Security Research di Wordfence

WordPress Security Architecture

Lascia un commento