tags: colonne sql_injection sql_commands


Prima di provare i tipici payload è buona pratica verificare se il server è probabilmente vulnerabile o meno e lo possiamo fare con una sql injection booleana facile facile.

Mettiamo che il nostro URL sia: sqlmap.test/search.php?search=notexists

Noi andremo ad inserire alla fine dell’URL:

 
' or 1=1; -- -
 

E:

' or 1=2; -- -

Che diventano quindi:

sqlmap.test/search.php?search=notexists' OR 1=1;--
 
sqlmap.test/search.php?search=notexists' OR 1=2;--

Se il primo payload ci restituisce più risultati o il comportamento cambia, potrebbe esserci una vulnerabilità.

Se il secondo payload non restituisce nulla o meno risultati, allora hai un’indicazione chiara della vulnerabilità.

Errori

Quando un sito ci risponde con un “Errore del server” o un qualcosa di simile possiamo provare ad effettuare una SQL injection.

  1. “Devo trovare tutti i cassetti” → information_schema.tables

  2. “Devo vedere cosa c’è nel cassetto users” → information_schema.columns

  3. “Devo leggere i fogli nel cassetto” → SELECT da tabella

Ognuno di queste tre key word cambia a seconda del database in uso per sapere la differenza guada questo Cheet Sheet.

Un payload utile per scoprire quante colonne possiede un determinato database è il seguente:

' order by 2-- -

Tramite questo comando possiamo scoprire il numero di colonne semplicemente provando a sostituire il numero ( in questo caso il 2) con diversi numeri fino a quando non si azzecca il numero di colonne, non appena indoviniamo il numero il server non ci restituirà più l’errore il che vorrà dire che sarà il numero corretto.

La stessa cosa la si può fare tramite la segunte sintassi finchè non ci da errore:

' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--

Una volta capito quante colonne ha una determinata tabella possiamo utilizzare questa informazione per farci dire dal database delle cose interessanti attraverso l’utilizzo di due parametri, UNION e SELECT. Questi due parametri ci permettono di inserire funzioni SQL in quantità uguale o inferiore al numero di colonne. Quindi se per esempio la tavola avesse tre colonne potremmo inserire il seguente payload:

' union select version(),user(),NULL-- -

Questo payload richiede al database la versione del database e l’utente che lo gestisce e siccome nel nostro esempio il database ha 3 colonne nella terza colonna dobbiamo aggiungere NULL se non vogliamo richiedere altro, altrimenti SQL ci da un errore e non ci restituisce i dati.

Enumerare il database

Il seguente payload serve ad enumerare il numero di database presenti nel database facendo attenzione a sostituire i campi vuoti delle colonne con NULL, in questo esempio il database che ci permette di effettuare una SQL injection ha 2 colonne, ma se ne avesse avute 3,4, 10 si sarebbe dovuto aggiungere i restanti NULL.

' union select schema_name, NULL from information_schema.schemata-- -

nota

# Prima di lanciare questo payload è bene verificare quale colonna accetta il payload lanciado un payload tipo "' union select test, null-- -" e se ci ritorna la stringa test significa che la prima colonna è iniettabile e quindi il payload sopra sarebbe corretto, ma potrebbe anche essere la seconda,terza o qualsiasi altra quella iniettabile e nel caso succedesse sarà nella colonna iniettabile che dovremo mettere 'schema_name' e mettere le altre NULL.

Ora la stessa identica cosa la si può replicare per le tavole ad ottenere tutte le tavole presenti nel database (qua per database si intende il database che contiene tutti i database, quindi ci tirerà fuori tutte le tavole di tutti i database presenti nel database) con il seguente payload:

' union select table_name, null from information_schema.tables-- -

Ora che abbiamo tutte le tavole possiamo enumerare le singole colonne in questo modo:

 
-- Sotituisci il valore della table_name con quello della tavola che vuoi dumpare
 
 ' UNION SELECT column_name, NULL FROM information_schema.columns WHERE table_name='users_llwbkx'--

Ora che abbiamo il contenuto della colonna users_llwbkx possiamo vedere il contenuto delle singole righe in questo modo:

' UNION SELECT username_abcdef, password_abcdef FROM users_llwbkx--

Per trovare il numero di colonne presenti in una determinata tavola di un determinato database trovato con le stringhe precedenti per esempio un database di nome ‘Publlic’ e una tavola di nome ‘users’ possiamo utilizzare il seguente payload:

' union select column, NULL from information_schema.column where table_schema='public' and table_name='user'-- -

Questo payload ci restituirà i nomi delle colonne presenti nella tavola ‘users’ il che ci permette di ottenere i dati presenti in quella tavola perchè sappiamo il nome delle colonne, quindi se per esempio il nome delle colonne è ‘username’ e ‘password’ il payload che dovremo utilizzare per ottenere i dati sarà il seguente:

'union select username, password from users-- -

In questo esempio abbiamo potuto mettere due campi da richiedere perchè nel nostro esempio facciamo finta che il database abbia 2 colonne, ma in caso ne avesse di più si dovrà metter il solito NULL per tutte le colonne non richieste.

nota

Infatti per far si che funzioni è necessario passare a UNION lo stesso numero di campi indicati nella query (per esempio username e password). Per questo motivo non potrai selezionare più (e meno) di due valori.

Payload in caso l’apice ’ fosse sanitizzato

Questi payload si possono utilizzare quando è impossibile inserire l’apice, inoltre dato che non dobbiamo inserire l’apice possiamo anche evitare di mettere l’# o il — -.

1 or 1=1 union select username, password from users

Per altri payloads visitare le seguenti pagine pagina1, pagina2