資源描述:
《講解sql server數(shù)據(jù)庫(kù)的觸發(fā)器安全隱患--》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫(kù)。
1、講解SQLServer數(shù)據(jù)庫(kù)的觸發(fā)器安全隱患>> 觸發(fā)器權(quán)限和所有權(quán) CREATETRIGGER權(quán)限默認(rèn)授予定義觸發(fā)器的表所有者、sysadmin固定服務(wù)器角色成員以及db_oin固定數(shù)據(jù)庫(kù)角色成員,并且不可轉(zhuǎn)讓?! ⌒枰沫h(huán)境 本文需要的環(huán)境是已經(jīng)獲取了sql服務(wù)器的以上其中一個(gè)權(quán)限,目的是為了留下隱蔽的后門,不被管理員發(fā)現(xiàn)。即使發(fā)現(xiàn)了也是加密的(可以破解,不過(guò)有些管理員不懂,也不會(huì)注意,相關(guān)信息google下)。 觸發(fā)器是在對(duì)表進(jìn)行插入(insert)、更新(update)或刪除(delete)操作時(shí),自動(dòng)執(zhí)行的存儲(chǔ)過(guò)程。最常見用于執(zhí)行敏感數(shù)據(jù)操作時(shí)做歷史記錄?! ”疚囊詣?dòng)
2、網(wǎng)論壇dvbbs為例,我們已經(jīng)拿到了db_odshell,就不再本文范圍了,相信讀過(guò)本文后,只要有系統(tǒng)權(quán)限,作個(gè)系統(tǒng)的后門也是簡(jiǎn)單的。先回想一下通常我們使用數(shù)據(jù)庫(kù)時(shí)要做什么和關(guān)心什么。 為什么要使用觸發(fā)器作后門 管理員首先會(huì)把sql文件執(zhí)行下,然后導(dǎo)入mdb的內(nèi)容,平時(shí)使用頂多備份下,還原下。通常不會(huì)有人去看觸發(fā)器的內(nèi)容,查看觸發(fā)器可以使用命令execsp_helptrigger'dv_admin',或者在企業(yè)管理器中選擇管理觸發(fā)器。因?yàn)閯?dòng)網(wǎng)根本沒(méi)有用到觸發(fā)器,也沒(méi)有提到觸發(fā)器,所以動(dòng)網(wǎng)的管理員不會(huì)去看的。于是我們?cè)诶锩鎸懙膬?nèi)容就相對(duì)安全了?! ∷悸贰 ∮|發(fā)器主要是
3、用來(lái)做歷史記錄的,當(dāng)然可以把管理員更改密碼和添加用戶的歷史記錄下。放進(jìn)一個(gè)管理員通常不會(huì)注意的、普通用戶又可以看到的地方?! ?dòng)網(wǎng)的密碼有md5加過(guò)密的,加密的操作是asp程序在服務(wù)器上來(lái)完成的,等數(shù)據(jù)庫(kù)拿到數(shù)據(jù)的時(shí)候已經(jīng)是加過(guò)密的了。但是動(dòng)網(wǎng)同時(shí)把密碼以明文方式放入dv_log表中,就給了我們方便。只要拿到dv_log表中l(wèi)_content字段的內(nèi)容,然后判斷是否管理員在執(zhí)行敏感操作,后門思路就形成了?! ∈褂眠^(guò)程――代碼解析 代碼片斷:創(chuàng)建觸發(fā)器。createtriggerdv_admin_historyonDv_logail,字段類型:nvarchar(255)。汪財(cái)?shù)膃mai
4、l,使用時(shí)需要轉(zhuǎn)換類型。 4、Userinfo,字段類型:text。汪財(cái)?shù)挠脩糍Y料。該字段很特殊,有很多,每一對(duì)之間都有著不同的含義。動(dòng)網(wǎng)很懶的,為了避免字段太多,就把一堆信息全都放入一個(gè)字段里,用分開,當(dāng)查詢某一項(xiàng)信息時(shí),取出來(lái)全部,然后分割下,就是需要的數(shù)據(jù)了?! 〗鉀Q的問(wèn)題: 1、如果都放滿了。 理論上,如果我們看到了第一個(gè)字段有了東西,就應(yīng)該拿筆記下來(lái),然后刪除掉。觸發(fā)器會(huì)自動(dòng)檢查大小后繼續(xù)使用。再次強(qiáng)調(diào)下,本文例子針對(duì)動(dòng)網(wǎng),大家應(yīng)該具體問(wèn)題具體分析。 2、管理員的日志中,有很多日志,怎么判斷它就是在記錄更改密碼?! ≡诠芾韱T操作用戶時(shí),當(dāng)然會(huì)在user.asp或者ad
5、min.asp中操作,所以我們判斷條件需要: selectpassinfo=l_contentfrominsertedin.asp') 在l_touser為user.asp或者admin.asp時(shí),說(shuō)明管理員在操作(查看,更新,刪除)用戶或者管理員。在l_type=1時(shí),說(shuō)明執(zhí)行了更新操作,l_content字段里面有密碼(如果管理員更新了密碼,或者新建了帳戶)。因此,查詢inserted表中的l_content,賦值給passinfo代碼片斷:更新汪財(cái)?shù)膗sersign字段。if(len(usersign)<150orusersignisnull)beginif(u
6、sersignisnull)setusersign=''setpassinfo=usersign+passinfoupdateDv_Usersetusersign=passinfoe=usernamemittranreturnendend 首次更新時(shí),usersign字段里沒(méi)有內(nèi)容,而SQLServer里null加任何數(shù)都是null,所以需要判斷isnull之后,給null賦值為一個(gè)空格。其他幾個(gè)字段的方法和這里大同小異,只是一個(gè)轉(zhuǎn)換nvarchar和的組合時(shí)多了點(diǎn)。最后判斷如果字段內(nèi)容太多就不再寫了,為了提高性能,也可以把最后的判斷寫在前12下一頁(yè)>>>>這篇文章來(lái)
7、自..,。面,一旦數(shù)據(jù)過(guò)多,就不需要再繼續(xù)執(zhí)行了?! ∈状胃聲r(shí),汪財(cái)?shù)膗sersign字段里沒(méi)有內(nèi)容,而SQLServer里null加任何數(shù)都是null,所以需要判斷isnull之后,給null賦值為一個(gè)空格。其他幾個(gè)字段的方法和這里大同小異,只是一個(gè)轉(zhuǎn)換nvarchar和的組合時(shí)多了點(diǎn)。最后判斷如果字段內(nèi)容太多就不再寫了,為了提高性能,也可以把最后的判斷寫在前面,一旦數(shù)據(jù)過(guò)多,就不需要再繼續(xù)執(zhí)行了。上一頁(yè)12>>>>這篇文章來(lái)自..,。