Site Overlay

Attacco SQL Injection

SQL Injection Attack arif akyuz
politiche di cybersecurity per le aziende

SQL Injection è una tecnica di attacco utilizzata per attaccare le applicazioni basate su database; in cui l'utente malintenzionato utilizza le funzionalità del linguaggio SQL per aggiungere nuove istruzioni SQL al campo appropriato nella schermata dell'applicazione standard. Ad esempio, un utente malintenzionato potrebbe trasferire il contenuto del database a se stesso.SQL Injection sfrutta una vulnerabilità all'interno dei software delle applicazioni, ad esempio, le istruzioni SQL sono incorporate nella parte in cui l'applicazione prevede informazioni di input dell'utente, se il contenuto dei dati in ingresso non viene filtrato all'interno dell'applicazione o viene filtrato in modo errato, l'applicazione sembrerà essere eseguita senza errori con il codice incorporato in essa. Sebbene SQL Injection sia noto come un tipo di attacco utilizzato principalmente per i siti Web, può essere eseguito in tutte le applicazioni basate su database SQL.

Gli attacchi SQL injection consentono agli aggressori di accedere con le informazioni di uno degli utenti del sistema, interferire con i dati esistenti, annullare o modificare alcune operazioni, divulgare tutti i dati nel database, distruggere tutti i dati nel database, diventare un amministratore di sistema sul server di database.

Uno studio del 2012 ha rilevato che un'applicazione web riceve in media 4 attacchi al mese, con i rivenditori che ricevono il doppio degli attacchi rispetto ad altri settori.

Filtro errato dei caratteri di escape

Questo tipo di SQL si verifica quando i dati dell'utente non vengono filtrati dalle richieste di escape dell'utente, aggiungendo nuove istruzioni SQL all'applicazione. Le istruzioni SQL inserite fanno sì che l'utente finale modifichi il database come desiderato.

Gestione errata del tipo

Questo tipo di SQLI si verifica quando il controllo del tipo del campo immesso dall'utente non viene eseguito correttamente. Quando in un'istruzione SQL viene utilizzato un valore numerico, anche l'input dell'utente deve essere un valore numerico. Quando questo controllo non viene eseguito, si verifica una vulnerabilità della sicurezza.

Iniezione SQL cieca

L'iniezione SQL cieca viene utilizzata quando un'applicazione Web viene esposta a un SQLI, ma i risultati non sono visibili all'utente malintenzionato. La pagina vulnerabile non può divulgare dati, ma può visualizzare dati modificati a causa dell'espressione logica incorporata nell'istruzione SQL.

Risposte condizionali

Forza il database a valutare un'espressione logica in un'applicazione ordinaria.

Iniezione SQL di secondo ordine

L'iniezione SQL secondaria si verifica quando i valori contenenti codice dannoso non vengono eseguiti non appena vengono inviati, ma vengono conservati per un periodo di tempo. L'applicazione può codificare correttamente l'istruzione SQL e archiviarla come istruzione SQL corrente. Quindi, in un'altra parte dell'applicazione, che non è selezionata rispetto a SQL injection, viene eseguita l'istruzione SQL archiviata. Per eseguire questo attacco, l'utente malintenzionato deve disporre di ulteriori informazioni su come vengono utilizzati i valori inviati. Gli scanner automatici di sicurezza delle applicazioni Web non sono in grado di rilevare facilmente questo tipo di SQL injection. Pertanto, dovrebbe essere controllato manualmente che il software dannoso sia nella parte utile del codice.

Precauzioni contro gli attacchi

SQL injection è un attacco ben noto e può essere facilmente prevenuto con semplici misure. All'indomani di un apparente attacco SQL injection a Talktalk nel 2015, la BBC ha dichiarato che la scoperta di vulnerabilità SQL injection da parte di un'azienda così grande ha sorpreso gli esperti di sicurezza.

Espressioni con parametri

La maggior parte delle piattaforme di sviluppo delle applicazioni utilizza espressioni parametriche come parametri anziché dati dell'utente. (Chiamato anche segnaposto o variabile di associazione.) Un segnaposto memorizza solo il tipo di dati specificato. Quindi SQL injection viene trattato solo come un valore di parametro interessante (e possibilmente non valido).

Nella maggior parte dei casi, l'istruzione SQL è specifica e ogni parametro viene archiviato come scalare, non come tabella. I dati dell'utente vengono assegnati a questo parametro.

Applicazione a livello di codifica

L'utilizzo di librerie di mapping relazionali a oggetti elimina la necessità di scrivere codice SQL. La libreria ORM attiva genera istruzioni SQL parametriche da codice orientato agli oggetti.

Sfuggente

In SQL, è necessario evitare caratteri che hanno significati speciali. SQL DBMS spiega quali caratteri hanno un significato speciale e fornisce una lista nera completa. Ad esempio, le virgolette singole(') all'interno di ciascun parametro vengono sostituite con due virgolette singole per creare un valore letterale di stringa SQL valido. (''mysqli_real_escape_string(); È un metodo comune per evitare i parametri che utilizzano la funzione.

$mysqli = new mysqli('hostname', 'db_username', 'db_password', 'db_name'); $query = sprintf("SELECT * FROM 'Users' WHERE UserName='%s' AND Password='%s'"", $mysqli->real_escape_string($username), $mysqli->real_escape_string($password)); $mysqli->query($query);

Questa funzione precede i seguenti caratteri con barra rovesciata (). x00, n, r, , ', "x1a.   Viene utilizzato per garantire la sicurezza dei dati prima di inviare una query a MySQL.

PHP ha molte funzioni per molti tipi di database, ad esempio la funzione pg_escape_string() per PostgreSQL. La funzione addslashes (stringa $str) utilizzata per inserire la barra viene utilizzata per l'escape dei caratteri. Restituisce una stringa con barra rovesciata () preceduta dai caratteri da interrogare nel database. Questi caratteri sono virgolette singole ('), virgolette doppie ("), barra rovesciata () e NUL (byte NULL).

La creazione di uno strato trasparente per garantire la sicurezza dell'input può ridurre la tendenza all'errore, ma non eliminarlo completamente.

Controllo del pattern

I parametri Integer, float, boolean, string possono essere controllati se i loro valori sono validi per il tipo specificato. Potrebbe anche essere necessario controllare le stringhe rispetto ad altri modelli. (data, UUID, solo alfanumerico, ecc.)

Autorizzazioni per il database

La limitazione delle autorizzazioni di accesso concesse dalle applicazioni Web al database può contribuire a ridurre l'efficacia degli attacchi SQL injection che sfruttano le vulnerabilità nelle applicazioni Web.

Ad esempio, in Microsoft SQL Server, un account di accesso al database può limitare l'accesso ad alcune tabelle di sistema, limitando il software dannoso che tenta di inserire JavaScript in tutte le colonne di testo del database.

nega la selezione su sys.sysobjects a webdatabaselogon; negare la selezione su sys.objects a webdatabaselogon; negare la selezione su sys.tables a webdatabaselogon; negare la selezione su sys.views a webdatabaselogon; negare la selezione su sys.packages a webdatabaselogon;

Bibliografia

[K1], [K2]