MySQL利用日志提权
前言:近期在学习Mysql提权的时候,很多文章都说到了通过文件导入导出来进行写入webshell,但是自己复现时出现了问题,一直失败。然后有了这篇文章!
0x00 MySQL通过文件导出提权的过程
- 首先找一张有插入权限的表,插入一句话密码。
可以看到这张表是五条数据(root用户具有所有权限)
- 接下来找一个字段插入一句话木马:
- 然后通过文件导出函数outfile,出现问题:
0x01 secure_file_priv参数对文件操作的影响:
- secure_file_priv是Mysql的新特性,对文件导入导出产生了一些限制。先看官方文档的介绍。
Secure_file_priv可以设置三个参数:空,NULL,filepath
- 参数说明:
- 空值:设置为空时,没有进行安全配置,那么这模式下应该就可以导出webshell
- NULL:设置本参数值时,数据库不能进行导入导出
- Filepath:filepath是导入导出的文件路径,设置这个值,那么只能导出文件到filepath的路径。
- 现在查看此时的设置:
可以看到此时的值是NULL,我们现在把他设置为空,然后进行导出文件实验。
- 这个配置应该默认为NULL,我们手动添加配置:
重启数据库服务。
- 再次尝试导出webshell:
导出成功。
- 成功连接shell。
- 现在修改导出到固定路径:
- 可以看到导出到子文件夹成功,但是导出到上一层目录失败了。
- 从上述实验发现,再进行导入导出提权已经变得复杂,接下来说一个替代方案。
0x02 利用log日志文件插入一句话
- General_log 指的是日志保存状态,一共有两个值(ON/OFF)ON代表开启 OFF代表关闭。
- General_log_file 指的是日志的保存路径。
- 关于开启general_log参数的作用:
- 开启它可以记录用户输入的每条命令,会把其保存再general_log_file指定的目录下,就是日志文件。这个参数是可以直接通过mysqld进行设置。
- 我们的利用的思路是开启general_log之后把general_log_file的值修改为我们网站默认路径下一个自定义的php文件中,然后我们通过log日志进行写入一句话后门到上面去,然后再进一步利用。
- 先检测MySQL全局变量(general_log、general_log file)的值。
可以看到,参数是关闭的
- 修改参数:
set global general_log="ON"; //设置打开
//设置新的存储文件
set global general_log_file="D:\\phpstudy2018\\PHPTutorial\\www\\general_log_shell.php";
然后任意执行带恶意代码的sql语句。
可以看到我们定义的日志文件记录了我们执行的sql语句,写入了一句话木马。接下来再次连接成功。