動網(wǎng)dvbbs7.1論壇權(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))
……后面代碼省略
兩處檢驗的方式一模一樣,所以我們可以利用這兩個中的任意一個來達(dá)到我們的目的??此膕ql語句部分:
Sql="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,
UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclas
s,UserGroupID,UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLa
stIP,UserDel,UserIsBest,UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTit
le,TruePassWord,UserToday"
Sql=Sql+" From [Dv_User] Where UserID = " & UserID
javascript:window.open(this.src); src="/article/UploadPic/2006/8/27/200682723275512.GIF" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" align=baseline border=0>
存在注入漏洞,但利用的前提是擁有超級斑竹或前臺管理員權(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))
……后面代碼省略
兩處檢驗的方式一模一樣,所以我們可以利用這兩個中的任意一個來達(dá)到我們的目的??此膕ql語句部分:
Sql="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,
UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclas
s,UserGroupID,UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLa
stIP,UserDel,UserIsBest,UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTit
le,TruePassWord,UserToday"
Sql=Sql+" From [Dv_User] Where UserID = " & UserID
javascript:window.open(this.src); src="/article/UploadPic/2006/8/27/200682723275512.GIF" onload="javascript:if(this.width>screen.width-500)this.style.width=screen.width-500;" align=baseline border=0>
相關(guān)文章
針對藍(lán)牙PIN碼的最新攻擊技術(shù)細(xì)節(jié)分析
針對藍(lán)牙PIN碼的最新攻擊技術(shù)細(xì)節(jié)分析...2007-01-01河南移動網(wǎng)絡(luò)客服系統(tǒng)驗證碼的缺陷分析和利用!
河南移動網(wǎng)絡(luò)客服系統(tǒng)驗證碼的缺陷分析和利用!...2007-01-01