<%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文件的内容。所以程序员在作上传检测的时候,应该设定什么样子的文件允许上传而并非什么样的文件不能上传。
再说关于上传程序的漏洞。
前一阵子出现的动网论坛的上传漏洞可谓风风雨雨啊,Daniel也用这个漏洞攻下了许多顽固肉鸡,我们先就动网的上传来分析:
动网本来是不允许上传asp等危险文件的,但是其上传的处理有一定的漏洞导致程序获取的参数有误而使入侵者可以上传任意文件。
先看看提交上传的一个页面reg_upload.asp:
Fot i=0 to ubound(arrUpFileType)
If fileEXT=trim(arrUpFileType(i)) then
Enableupload=true
因为My动力所采用的上传类可以上传多个文件,我们从上面的代码可以看出,如果上传多个文件时,第N-1个文件的扩展名不合法,而第N个文件的扩展名合法的话,是可以通过检测的。所以我们只要自己构造页面,上传两个文件,并且第二个的扩展名是程序可以上传的,就可以了。但是My动力系统是禁止表单外部提交的,如何绕过这个限制呢,请看-表单的攻防。
小诀窍:
1、利用数据库的备份恢复功能把合法变非法。
毕竟还是有许多系统不存在上传的逻辑漏洞,那么我们怎么上传脚本木马呢。这个诀窍要求你能登陆后台,并且网站系统有备份和恢复数据库的功能。现通过合法渠道把木马改名为合法的扩展名上传,然后在备份和恢复数据库的页面中,把上传后的文件名写在备份和恢复的路径中,然后还原,由于程序是将数据库以asp扩展名存放的,所以木马也可以正常解析了。
五、表单的攻防
本文前面一些地方已经提到了一些关于程序中表单的不安全因素,现在我们来总结一下。对于表单的攻击,主要的思路就是把含有表单的页面保存到本地,修改去掉相关限制,并且将其action提交地址补全为网站上的地址,然后再提交。
所以不难看出,关于表单的一切,如果在服务器端不再次验证的话,都是危险和不可信的。建议程序员在客户端做表单合法性检查的同时尽量在服务器端再次验证并且在服务器端加相应的禁止外部提交的代码。:
<%server_v1=Cstr(Request.ServerVariables(\\"HTTP_REFERER\\"))
server_v2=Cstr(Request.ServerVariables(\\"SERVER_NAME\\"))
if mid(server_v1,8,len(server_v2))<>server_v2 then
response.write \\"<br><br><center><table border=1 cellpadding=20 bordercolor=black bgcolor=#EEEEEE width=450>\\"
response.write \\"<tr><td style='font:9pt Verdana'>\\"
response.write \\"你提交的路径有误,禁止从站点外部提交数据请不要乱该参数!\\"
response.write \\"</td></tr></table></center>\\"
response.end
end if%>