Come sanificare i parametri URL con get_query_var() in WordPress

26 ott 2019, 11:45:10
Visualizzazioni: 13.9K
Voti: 5

Sto attualmente lavorando su un sito e testando la sua sicurezza. Una delle pagine ha una funzionalità di ordinamento dove passo un parametro URL per specificare come vorrei che il contenuto fosse ordinato.

Per esempio:

www.example.com/page/?sort=alpha

Questo funziona bene, ma ho provato a inviare anche codice malevolo:

www.example.com/page/?sort=alpha%3Cimg+src=xyz+onerror=alert(99)%3E%3Cxss/%3E

In Internet Explorer quando inserisco questo URL la mia pagina viene visualizzata e appare un alert JavaScript, quindi sono riuscito a eseguire del codice sulla pagina. In Chrome invece ricevo il messaggio che l'XSS auditor ha bloccato questa esecuzione, ma preferirei che non venisse nemmeno tentata l'esecuzione. Da quello che posso vedere, questo parametro viene accettato nel mio file header.php sotto Sort : <?= get_query_var('sort') ?>.

Voglio sanificare questo input in modo che non possa mai eseguire uno script di questo tipo, come posso farlo?

1
Commenti

L'ordinamento sembra essere un plugin che stai utilizzando? Se è così, il modo migliore per gestirlo è informare lo sviluppatore che hai trovato una vulnerabilità e che deve essere mitigata.

butlerblog butlerblog
27 ott 2019 01:59:40
Tutte le risposte alla domanda 1
2

C'è una leggera discrepanza tra il titolo della tua domanda e la domanda effettiva.

Sembra che tu stia usando un plugin (o sviluppando un plugin?) che permette un ordinamento front-end. Se si tratta di un plugin che stai utilizzando e il parametro della query string non è sanificato, devi avvisare lo sviluppatore del plugin, perché si tratta di un problema di sicurezza.

Risolvere il problema da solo potrebbe funzionare - temporaneamente, ma non dovresti modificare direttamente i plugin (anche quelli scritti male) perché ti metterebbe nella spiacevole situazione di dover riapplicare le modifiche ogni volta che il plugin viene aggiornato.

Il nome della funzione get_query_var() può essere fuorviante. Molti la vedono come un comodo sostituto di WordPress per $_GET[], ma non è quello che fa. get_query_var() funziona SOLO per le variabili impostate come parte della query globale di WordPress. Questo include diverse impostazioni predefinite di WP, oltre a eventuali variabili personalizzate (aggiunte con set_query_var()).

Un plugin che applica un rewrite personalizzato degli URL per i suoi endpoint potrebbe essere un esempio di questo utilizzo. Ma se pensi di poterla usare per recuperare qualsiasi variabile dalla query dell'URL, non funzionerà, perché get_query_var() non ha questo scopo.

Devi semplicemente individuare dove viene raccolto questo argomento della query. Molto probabilmente viene fatto usando $_GET['sort'].

Qualunque sia il metodo utilizzato, dovrebbe essere:

$some_var = sanitize_text_field( $_GET['sort'] );

O ancora meglio:

$some_var = ( isset( $_GET['sort'] ) ) ? sanitize_text_field( $_GET['sort'] ) : 'valore predefinito';

Ovviamente, la mia risposta si basa su alcune supposizioni, visto che i dettagli non erano inclusi nella tua domanda. Se ho frainteso, aggiorna la domanda con maggiori informazioni e modificherò di conseguenza.

27 ott 2019 20:41:58
Commenti

Grazie mille, funziona!

user2924127 user2924127
28 ott 2019 00:12:40

Sono contento che abbia funzionato per te. Per sottolineare, se questo è in un plugin che stai usando, informa lo sviluppatore in modo che possa correggere la vulnerabilità.

butlerblog butlerblog
28 ott 2019 23:46:46