MySQL利用日志提权

前言:近期在学习Mysql提权的时候,很多文章都说到了通过文件导入导出来进行写入webshell,但是自己复现时出现了问题,一直失败。然后有了这篇文章!

 

0x00 MySQL通过文件导出提权的过程

  1. 首先找一张有插入权限的表,插入一句话密码。

MySQL利用日志提权

可以看到这张表是五条数据(root用户具有所有权限)

  1. 接下来找一个字段插入一句话木马:

MySQL利用日志提权

  1. 然后通过文件导出函数outfile,出现问题:

MySQL利用日志提权

0x01 secure_file_priv参数对文件操作的影响:

  1. secure_file_priv是Mysql的新特性,对文件导入导出产生了一些限制。先看官方文档的介绍。

MySQL利用日志提权

Secure_file_priv可以设置三个参数:空,NULL,filepath

  1. 参数说明:
    1. 空值:设置为空时,没有进行安全配置,那么这模式下应该就可以导出webshell
    2. NULL:设置本参数值时,数据库不能进行导入导出
    3. Filepath:filepath是导入导出的文件路径,设置这个值,那么只能导出文件到filepath的路径。
  2. 现在查看此时的设置:

MySQL利用日志提权

可以看到此时的值是NULL,我们现在把他设置为空,然后进行导出文件实验。

MySQL利用日志提权

  1. 这个配置应该默认为NULL,我们手动添加配置:

MySQL利用日志提权

重启数据库服务。

MySQL利用日志提权

  1. 再次尝试导出webshell:

MySQL利用日志提权

导出成功。

  1. 成功连接shell。

MySQL利用日志提权

  1. 现在修改导出到固定路径:

MySQL利用日志提权

  1. MySQL利用日志提权
  2. MySQL利用日志提权
  3. 可以看到导出到子文件夹成功,但是导出到上一层目录失败了。
  4. 从上述实验发现,再进行导入导出提权已经变得复杂,接下来说一个替代方案。

 

 

0x02 利用log日志文件插入一句话

  1. General_log 指的是日志保存状态,一共有两个值(ON/OFF)ON代表开启 OFF代表关闭。
  2. General_log_file 指的是日志的保存路径。
  3. 关于开启general_log参数的作用:
    1. 开启它可以记录用户输入的每条命令,会把其保存再general_log_file指定的目录下,就是日志文件。这个参数是可以直接通过mysqld进行设置。
    2. 我们的利用的思路是开启general_log之后把general_log_file的值修改为我们网站默认路径下一个自定义的php文件中,然后我们通过log日志进行写入一句话后门到上面去,然后再进一步利用。
  4. 先检测MySQL全局变量(general_log、general_log file)的值。

MySQL利用日志提权

可以看到,参数是关闭的

  1. 修改参数:

        set global general_log="ON"; //设置打开

        //设置新的存储文件

       set global general_log_file="D:\\phpstudy2018\\PHPTutorial\\www\\general_log_shell.php";

MySQL利用日志提权

       然后任意执行带恶意代码的sql语句。

MySQL利用日志提权

MySQL利用日志提权

可以看到我们定义的日志文件记录了我们执行的sql语句,写入了一句话木马。接下来再次连接成功。

MySQL利用日志提权