解析SQL Server數(shù)據(jù)庫觸發(fā)器安全隱患_Mssql數(shù)據(jù)庫教程
推薦:關(guān)于升級SQL Server 2008數(shù)據(jù)庫引擎您可以將 SQL Server 數(shù)據(jù)庫引擎升級到 SQL Server 2008。 SQL Server 安裝程序只需最少的用戶干預(yù)就可升級 SQL Server 的早期版本。不過,正確的準(zhǔn)備工作和熟悉升級過程可以更容易防止或解決出現(xiàn)的任何問題。 本主題提供了為升級過程進(jìn)行準(zhǔn)備和了解升級過程
觸發(fā)器權(quán)限和所有權(quán)
CREATE TRIGGER 權(quán)限默認(rèn)授予定義觸發(fā)器的表所有者、sysadmin 固定服務(wù)器角色成員以及 db_owner 和 db_ddladmin 固定數(shù)據(jù)庫角色成員,并且不可轉(zhuǎn)讓。
需要的環(huán)境
本文需要的環(huán)境是已經(jīng)獲取了sql服務(wù)器的以上其中一個(gè)權(quán)限,目的是為了留下隱蔽的后門,不被管理員發(fā)現(xiàn)。即使發(fā)現(xiàn)了也是加密的(可以破解,不過有些管理員不懂,也不會注意,相關(guān)信息google下)。
觸發(fā)器是在對表進(jìn)行插入(insert)、更新(update)或刪除(delete)操作時(shí),自動(dòng)執(zhí)行的存儲過程。最常見用于執(zhí)行敏感數(shù)據(jù)操作時(shí)做歷史記錄。
本文以動(dòng)網(wǎng)論壇dvbbs為例,我們已經(jīng)拿到了db_owner權(quán)限(注意:并不是說dvbbs本身有漏洞)。因?yàn)橹皇莇b_owner權(quán)限,所以讀者想去執(zhí)行“xp_cmdshell”,就不再本文范圍了,相信讀過本文后,只要有系統(tǒng)權(quán)限,做個(gè)系統(tǒng)的后門也是簡單的。先回想一下通常我們使用數(shù)據(jù)庫時(shí)要做什么和關(guān)心什么。
為什么要使用觸發(fā)器作后門
管理員首先會把sql文件執(zhí)行下,然后導(dǎo)入mdb的內(nèi)容,平時(shí)使用頂多備份下,還原下。通常不會有人去看觸發(fā)器的內(nèi)容,查看觸發(fā)器可以使用命令“exec sp_helptrigger 'dv_admin'”,或者在企業(yè)管理器中選擇“管理觸發(fā)器”。因?yàn)閯?dòng)網(wǎng)根本沒有用到觸發(fā)器,也沒有提到觸發(fā)器,所以動(dòng)網(wǎng)的管理員不會去看的。于是我們在里面寫的內(nèi)容就相對安全了。
思路
觸發(fā)器主要是用來做歷史記錄的,當(dāng)然可以把管理員更改密碼和添加用戶的歷史記錄下。放進(jìn)一個(gè)管理員通常不會注意的、普通用戶又可以看到的地方。
動(dòng)網(wǎng)的密碼有md5加過密的,加密的操作是asp程序在服務(wù)器上來完成的,等數(shù)據(jù)庫拿到數(shù)據(jù)的時(shí)候已經(jīng)是加過密的了。但是動(dòng)網(wǎng)同時(shí)把密碼以明文方式放入dv_log表中,就給了我們方便。只要拿到dv_log表中l(wèi)_content字段的內(nèi)容,然后判斷是否管理員在執(zhí)行敏感操作,后門思路就形成了。
使用過程――代碼解析
代碼片斷:創(chuàng)建觸發(fā)器。
create trigger dv_admin_history
on Dv_log
with encryption
for insertas
as
觸發(fā)器需要建立在Dv_log表上,這里放入的是明文密碼。我們并不知道管理員密碼設(shè)置有多長,只能是把里面的有密碼的字段內(nèi)容全部取出。觸發(fā)器最好是加密的,加密后,管理員即使看到了,也不知道這里是什么東西。在insert(加入)數(shù)據(jù)時(shí)執(zhí)行觸發(fā)器。
取出來的值應(yīng)該放入一個(gè)普通用戶能看到的地方,這樣只要有了普通用戶的權(quán)限就可以看到密碼。動(dòng)網(wǎng)數(shù)據(jù)庫中,最大并且可以存放數(shù)據(jù)的字段管理員通常都會看到。所以必須找出來一個(gè)管理員不會看,而其他用戶也不會注意的地方。
我選擇放在一個(gè)新建用戶的用戶信息里(以下通稱這個(gè)用戶為“汪財(cái)”,親切點(diǎn)),這樣我們登陸時(shí)就可以看到了(注意:登陸時(shí)有日志的,記錄最后登陸ip,大家自己解決)。
有以下幾個(gè)字段適于存放:
1、Userphoto,字段類型:varchar(255)。記錄了汪財(cái)?shù)恼掌刂�。可以存放小�?55的數(shù)據(jù)。
2、Usersign,字段類型:varchar(255)。汪財(cái)?shù)暮灻绻胚@里,汪財(cái)就不能發(fā)貼了,否則后果自負(fù)(發(fā)貼會顯示簽名,地球人都能看到)。
3、Useremail,字段類型:nvarchar(255)。汪財(cái)?shù)膃mail,使用時(shí)需要轉(zhuǎn)換類型。
4、Userinfo,字段類型:text。汪財(cái)?shù)挠脩糍Y料。該字段很特殊,有很多“”,每一對“”之間都有著不同的含義。動(dòng)網(wǎng)很懶的,為了避免字段太多,就把一堆信息全都放入一個(gè)字段里,用“”分開,當(dāng)查詢某一項(xiàng)信息時(shí),取出來全部,然后分割下,就是需要的數(shù)據(jù)了。
解決的問題:
1、如果都放滿了。
理論上,如果我們看到了第一個(gè)字段有了東西,就應(yīng)該拿筆記下來,然后刪除掉。觸發(fā)器會自動(dòng)檢查大小后繼續(xù)使用。再次強(qiáng)調(diào)下,本文例子針對動(dòng)網(wǎng),大家應(yīng)該具體問題具體分析。
2、管理員的日志中,有很多日志,怎么判斷它就是在記錄更改密碼。
在管理員操作用戶時(shí),當(dāng)然會在“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時(shí),說明管理員在操作(查看,更新,刪除)用戶或者管理員。在l_type = 1時(shí),說明執(zhí)行了更新操作,l_content字段里面有密碼(如果管理員更新了密碼,或者新建了帳戶)。因此,查詢inserted表中的l_content,賦值給@passinfo代碼片斷:更新汪財(cái)?shù)膗sersign字段。
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
首次更新時(shí),usersign字段里沒有內(nèi)容,而SQL Server里null加任何數(shù)都是null,所以需要判斷is null之后,給null賦值為一個(gè)空格。其他幾個(gè)字段的方法和這里大同小異,只是一個(gè)轉(zhuǎn)換nvarchar和“”的組合時(shí)多了點(diǎn)。最后判斷如果字段內(nèi)容太多就不再寫了,為了提高性能,也可以把最后的判斷寫在前面,一旦數(shù)據(jù)過多,就不需要再繼續(xù)執(zhí)行了。
首次更新時(shí),汪財(cái)?shù)膗sersign字段里沒有內(nèi)容,而SQL Server里null加任何數(shù)都是null,所以需要判斷is null之后,給null賦值為一個(gè)空格。其他幾個(gè)字段的方法和這里大同小異,只是一個(gè)轉(zhuǎn)換nvarchar和“”的組合時(shí)多了點(diǎn)。最后判斷如果字段內(nèi)容太多就不再寫了,為了提高性能,也可以把最后的判斷寫在前面,一旦數(shù)據(jù)過多,就不需要再繼續(xù)執(zhí)行了。
分享:怎樣巧妙規(guī)劃使用Oracle數(shù)據(jù)空間Oracle提供了不少方法用于數(shù)據(jù)空間的使用、監(jiān)控和維護(hù),同時(shí)也在各版本中陸續(xù)對這方面的功能進(jìn)行了增強(qiáng),目的在于簡化這方面工作的復(fù)雜度,提高應(yīng)用的運(yùn)行效率。 一、相關(guān)概念 數(shù)據(jù)庫的空間在邏輯上分為多個(gè)表空間,每個(gè)表空間則由系統(tǒng)中的一個(gè)或多個(gè)物理數(shù)
- sql 語句練習(xí)與答案
- 深入C++ string.find()函數(shù)的用法總結(jié)
- SQL Server中刪除重復(fù)數(shù)據(jù)的幾個(gè)方法
- sql刪除重復(fù)數(shù)據(jù)的詳細(xì)方法
- SQL SERVER 2000安裝教程圖文詳解
- 使用sql server management studio 2008 無法查看數(shù)據(jù)庫,提示 無法為該請求檢索數(shù)據(jù) 錯(cuò)誤916解決方法
- SQLServer日志清空語句(sql2000,sql2005,sql2008)
- Sql Server 2008完全卸載方法(其他版本類似)
- sql server 2008 不允許保存更改,您所做的更改要求刪除并重新創(chuàng)建以下表
- SQL Server 2008 清空刪除日志文件(瞬間日志變幾M)
- Win7系統(tǒng)安裝MySQL5.5.21圖解教程
- 將DataTable作為存儲過程參數(shù)的用法實(shí)例詳解
Mssql數(shù)據(jù)庫教程Rss訂閱編程教程搜索
Mssql數(shù)據(jù)庫教程推薦
- 解析在IIS中為SQL Server 2008配置報(bào)表服務(wù)
- 解讀編寫和優(yōu)化SQL Server的存儲過程
- 小型商業(yè)應(yīng)用選SQL Server還是Access
- SQL Server 2012 安裝圖解教程(附sql2012下載地址)
- 透視MySQL數(shù)據(jù)庫之更新語句
- 深入淺出SQL教程之嵌套SELECT語句
- 如何使用 SQL Server 數(shù)據(jù)庫嵌套子查詢
- 如何使用SQL Server嵌套子查詢
- Sql學(xué)習(xí)第三天——SQL 關(guān)于CTE(公用表達(dá)式)的遞歸查詢使用
- sql2005 附加數(shù)據(jù)庫出錯(cuò)(錯(cuò)誤號:5123)解決方法
- 相關(guān)鏈接:
- 教程說明:
Mssql數(shù)據(jù)庫教程-解析SQL Server數(shù)據(jù)庫觸發(fā)器安全隱患
。