當(dāng)前位置 主頁(yè) > 技術(shù)大全 >
在Linux系統(tǒng)環(huán)境中,MySQL數(shù)據(jù)庫(kù)的UDF(User Defined Function,用戶(hù)自定義函數(shù))提權(quán)是一種經(jīng)典且高效的攻擊手段
本文將深入探討MySQL Linux UDF提權(quán)的原理、條件、步驟及防范措施,旨在提高讀者的安全意識(shí)與防護(hù)能力
一、UDF提權(quán)原理 UDF,即用戶(hù)自定義函數(shù),是MySQL數(shù)據(jù)庫(kù)的一個(gè)拓展接口,允許用戶(hù)創(chuàng)建自定義函數(shù),以便在SQL查詢(xún)語(yǔ)句中使用
這些函數(shù)可以執(zhí)行復(fù)雜的計(jì)算或數(shù)據(jù)處理任務(wù),極大地增強(qiáng)了MySQL的靈活性和功能性
然而,這一特性也可能被攻擊者利用,通過(guò)編寫(xiě)調(diào)用cmd或shell的共享庫(kù)文件(在Windows中為.dll文件,在Linux中為.so文件),并將其導(dǎo)入到指定的文件夾目錄下,創(chuàng)建一個(gè)指向該共享庫(kù)文件的自定義函數(shù)
這樣,在數(shù)據(jù)庫(kù)中的查詢(xún)就等價(jià)于在cmd或shell中執(zhí)行命令,從而實(shí)現(xiàn)提權(quán)
二、提權(quán)條件 要實(shí)現(xiàn)MySQL Linux UDF提權(quán),必須滿(mǎn)足以下條件: 1.高權(quán)限MySQL賬號(hào):攻擊者需要擁有一個(gè)具有增刪改查權(quán)限的MySQL賬號(hào),最好是root賬號(hào)
這個(gè)賬號(hào)應(yīng)能對(duì)MySQL數(shù)據(jù)庫(kù)執(zhí)行create、insert、delete等操作
2.secure_file_priv參數(shù)為空:MySQL的secure_file_priv參數(shù)用于限制load data、select - into outfile、load_file()等函數(shù)只能在特定目錄進(jìn)行
當(dāng)secure_file_priv為空時(shí),表示不對(duì)MySQL的導(dǎo)入/導(dǎo)出做限制,此時(shí)可進(jìn)行UDF提權(quán)
若secure_file_priv為null,則限制MySQL不允許導(dǎo)入/導(dǎo)出;若secure_file_priv為特定目錄(如/tmp/),則限制MySQL的導(dǎo)入/導(dǎo)出只能發(fā)生在該目錄下,此時(shí)無(wú)法進(jìn)行UDF提權(quán)
3.創(chuàng)建函數(shù)的目錄存在:對(duì)于MySQL版本大于等于5.1的系統(tǒng),創(chuàng)建函數(shù)的目錄是plugin
若該目錄不存在,則無(wú)法進(jìn)行UDF提權(quán)
因此,攻擊者需確保MySQL安裝目錄下的lib/plugin文件夾存在(該文件夾默認(rèn)不存在,需自行創(chuàng)建)
三、提權(quán)步驟 MySQL Linux UDF提權(quán)的步驟大致如下: 1.查詢(xún)MySQL版本與系統(tǒng)信息: -使用`select version();`查詢(xún)MySQL版本
-使用`show VARIABLES LIKE %compile%;`查詢(xún)系統(tǒng)位數(shù)
-使用`show VARIABLES LIKE %secure%;`查詢(xún)secure_file_priv參數(shù)的值
-使用`show VARIABLES LIKE %plugin%;`查詢(xún)plugin目錄的位置
2.準(zhǔn)備共享庫(kù)文件: - 攻擊者需編寫(xiě)一個(gè)可以調(diào)用cmd或shell的共享庫(kù)文件(.so文件),并將其上傳到目標(biāo)系統(tǒng)
這通常通過(guò)漏洞利用、webshell或其他遠(yuǎn)程連接手段實(shí)現(xiàn)
3.創(chuàng)建臨時(shí)表并導(dǎo)入共享庫(kù)文件: - 在MySQL數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)臨時(shí)表,用于存儲(chǔ)共享庫(kù)文件的二進(jìn)制內(nèi)容
例如,使用`CREATE TABLEtemp_udf(udf LONGBLOB);`創(chuàng)建一個(gè)名為temp_udf的表,其中包含一個(gè)類(lèi)型為L(zhǎng)ONGBLOB的列udf
- 將共享庫(kù)文件寫(xiě)入到該表中
例如,使用`INSERT INTOtemp_udf (udf)VALUES (CONVERT(十六進(jìn)制編碼的共享庫(kù)文件內(nèi)容));`將共享庫(kù)文件的內(nèi)容插入到表中
注意,這里需要將共享庫(kù)文件的二進(jìn)制內(nèi)容轉(zhuǎn)換為十六進(jìn)制編碼
4.導(dǎo)出共享庫(kù)文件到指定目錄: -使用`SELECT unhex(udf) FROM temp_udf INTO DUMPFILE /usr/lib/mysql/plugin/raptor_udf2.so;`將共享庫(kù)文件導(dǎo)出到MySQL的plugin目錄下
注意,這里需要將`/usr/lib/mysql/plugin/`替換為實(shí)際的plugin目錄路徑,并將`raptor_udf2.so`替換為實(shí)際的共享庫(kù)文件名
5.創(chuàng)建自定義函數(shù)并執(zhí)行系統(tǒng)命令: -使用`CREATE FUNCTIONdo_system RETURNS INTEGER SONAME raptor_udf2.so;`創(chuàng)建一個(gè)指向共享庫(kù)文件的自定義