动网dvbbs7.1论坛权限提升漏洞及防范(图)

 更新时间:2007年01月16日 00:00:00   作者:  
在6月份的黑防上看到《动网7.1漏洞惊现江湖》一文,说是admin_postings.asp文件

存在注入漏洞,但利用的前提是拥有超级斑竹或前台管理员权限。我想起以前发现的动网7.x版本存在一个前台权限提升漏洞, 正好可以结合起来利用。这个前台权限提升漏洞对7.x的Access和 Sql版都有效。下面我们就以7.0 sp2 sql版,讲解这个漏洞的利用。

漏洞分析
我们知道动网是通过GroupID来判断当前用户所在的组的,然后再通过组的信息判断用户的权限。它是如何取得这个GroupID的呢?让我们看看登录验证的那一段:

login.asp的525行左右

Rem ==========论坛登录函数=========

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

…………后面的代码省略

可以看到,动网将用户的信息先用”|||”三个竖线连起来,做为一个字符串传给iMyUserInfo,然后iMyUserInfo由”|||”分隔成一个字符串数组。用户密码验证正确后就把数组的第20个元素的值:iMyUserInfo(19) 赋给GroupID。看到没,GroupID只是数组对应的第20个元素的值,如果iMyUserInfo(19)的值为1的话,动网就以为现在登录的用户是前台管理员了。

在inc目录下的Dv_ClsMain.asp文件中也有这么验证用户身份的一段代码,用来在用户更新信息后检测用户的权限。

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

’用户登录成功后,采用本函数读取用户数组并判断一些常用信息

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))

    ……后面代码省略


 两处检验的方式一模一样,所以我们可以利用这两个中的任意一个来达到我们的目的。看它的sql语句部分:

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>

相关文章

最新评论