La vulnerabilità del troncamento SQL di solito esiste nei database MySQL. Questa vulnerabilità è stata descritta per la prima volta nel CVE-2008-4106, che era correlato al CMS WordPress.
Come funzionano gli attacchi di troncamento SQL
Questo attacco funziona a causa del troncamento dell'input dell'utente nei database utilizzando le funzioni "Selezione" e "Insertion".
Supponiamo che uno sviluppatore crei la tabella "utenti" tramite la seguente query:
Crea utenti di tabelle (Utilizzando questo schema, se lo sviluppatore crea un account amministratore con quanto segue:
user_name = 'admin'Ovviamente, queste credenziali non sono pubbliche. C'è solo un account amministratore nel database e se un utente malintenzionato cerca di registrare un altro account con il nome utente "amministratore", l'attaccante fallirà a causa dei controlli di ridondanza del database. L'attaccante può ancora bypassare quel controllo di ridondanza per aggiungere un altro account amministratore sfruttando la vulnerabilità del troncamento SQL. Supponiamo che l'attaccante registri un altro account con il seguente input:
User_name = 'AdminxxxxxxxxxxxxxRandom'Il database prenderà il 'user_name' (26 caratteri) e verificherà se questo esiste già. Quindi, l'input User_Name verrà troncato e 'Admin' ('Admin' con spazio) verrà inserito nel database, risultando in due utenti di amministrazione duplicati.
L'attaccante è quindi in grado di creare un utente "amministratore" con la propria password. Ora, il database ha due voci di amministrazione 'user_name', ma con password diverse. L'attaccante può accedere con le credenziali appena create per ottenere un pannello di amministrazione perché sia User_Names "Admin" che "Admin" sono uguali per il livello del database. Ora guarderemo un campione di attacco pratico.
Attacco campione
In questo esempio, prenderemo uno scenario dal sito Web overthewire.org. La comunità di Overthewire fornisce CTF Wargame su cui possiamo praticare i nostri concetti di sicurezza. Lo scenario della troncamento SQL si verifica nel livello di gioco di Natas 26-> 27. Possiamo accedere al livello utilizzando quanto segue:
URL: http: // natas27.natas.Labs.Overhewire.orgQuesto livello è disponibile su: https: // overthewire.org/wargames/natas/natas27.html. Ti verrà mostrata una pagina di accesso che è vulnerabile a un attacco di troncamento SQL.
Dopo aver ispezionato il codice sorgente, vedrai che la lunghezza del nome utente è 64, come mostrato di seguito.
Un utente di nome 'Natas28' esiste già. Il nostro obiettivo è quello di creare un altro utente chiamato "Natas28" usando l'attacco SQL_Truncation. Quindi, inseriremo Natas28, seguito da 57 spazi e un alfabeto casuale (nel nostro caso, a), nome utente e qualsiasi password. La lettera "A" non è visibile nello screenshot a causa del nome utente di lunghezza di 65 caratteri. Dopo la creazione dell'account utente, sarai in grado di vedere il 'UN.'
Se il database contiene la vulnerabilità SQL_Truncation, il database dovrebbe ora avere nomi utente "Natas28". Un nome utente conterrà la nostra password. Proviamo a inserire le credenziali nella pagina di accesso.
Ora abbiamo effettuato l'accesso come utente "Natas28".
Mitigazione
Per mitigare questo attacco, dovremo considerare più fattori.
Ad esempio, verifichiamo la modalità rigorosa utilizzando la seguente query:
mysql> Seleziona @@ sql_modeCreeremo un database e gli utenti della tabella.'
mysql> crea test del databaseSuccessivamente, creeremo un utente di amministrazione con credenziali utilizzando la query sugli insert.
mysql> inserisci nei valori degli utenti ('admin', 'password1');Possiamo vedere le informazioni sulla tabella "utenti" utilizzando l'opzione "Seleziona * dagli utenti".
La lunghezza del nome utente è di 10 caratteri. Ora proveremo l'attacco di troncamento SQL.
Quando proviamo a inserire quanto segue:
Nome utente = 'adminxxxxxa'Riceveremo un errore, il che significa che la modalità rigorosa è totalmente efficace.
mysql> inserisci nei valori degli utenti ('admin a', 'pass2')Senza una modalità rigorosa abilitata, il database emetterà avvertimenti, ma inserirà comunque i dati nella tabella.
Conclusione
Gli aggressori possono ottenere l'accesso a account ad alto privilegio se esiste la vulnerabilità SQL_Trunction nell'applicazione. L'attaccante può facilmente ottenere informazioni su un nome utente e la sua lunghezza del database utilizzando i campi critici, quindi creare lo stesso nome utente, seguito da spazi e alfabeto casuale dopo la lunghezza minima, con conseguente creazione di più account ad alto privilegio. Questa vulnerabilità è fondamentale, ma può essere evitata se si prendono alcune precauzioni di sicurezza, come l'attivazione di una modalità rigorosa per gli input dell'utente e rendere il campo sensibile la chiave primaria nel database.