跨站提交表单详解

跨站提交表单详解 说明:本文原发表于《黑客X档案》2006第2期,转载请注明作者为玄猫,来自《黑客X档案》杂志,特此声明!

以前的杂志中我们曾多次提到使用跨站的一个危害性巨大的应用方法-利用跨站提交表单,但是今天在邪恶八进制论坛上发现仍然有一些朋友不是很理解这种方法如何应用,这里撰写本文,详细介绍此方法的原理、适用范围以及使用过程,并对其中设计到的技术要点逐一做分析。

我想跨站的原理以及其表现大家都非常清楚了,跨站简单来说就是利用程序对用户输入估计不足,没有进行充分的过滤,从而导致用户的非法输入可以显示在页面上被其他的访问者访问,从而被动执行其输入的HTML代码。

而跨站提交表单的主要应用则是使得管理员访问我们写入危险字符的页面而进行侵害的。

我们知道,网络程序中管理员登陆后即获得一个"session",此session为管理员在服务器上的一个标志,其信息以一个长字符串sessionid的形式保存在管理员所使用的计算机的cookies中,服务器通过服务器端内存中保存的sessionid与管理员所使用的计算机中的sessionid进行比对,认证其身份,因此如果我们能够让已登陆的管理员为我们进行某些操作,那就是合法操作。

简单来说,上面介绍了使用跨站提交表单利用管理员权限的条件,即:程序存在跨站漏洞,且管理员在执行我们提交的恶意代码时已经登陆为相应权限。

其实本方法在提出之前,曾有人这样设想,通过偷cookies的方法盗取管理员的sessionid信息,并在入侵者本地伪造此信息即可,但是这样就存在当入侵者伪造此信息时管理员在服务器上保存的sessionid是否仍然可用的问题,因为我们知道,服务器上保存的session是有超时期限的,对于IIS来说,超时期限为20分钟,即如果管理员不经退出关闭页面,则20分钟后,此sessionid将失效,当然,如果管理员在程序中注销退出,则sessionid会立即过期。

现在我们已经知道可以利用管理员的身份了,那么如何进行利用呢?

根据所要入侵的程序不同,其步骤也略有差异,而我们的总体思路已经明确-利用管理员的身份。

某些网络程序在后台有添加网站管理员等页面,此页面一般是接收管理员在上个页面填写的新增管理员的用户名密码等信息,并根据此表单信息来添加一个管理员,这样我们的利用思路就出来了:自己根据填写管理员信息的页面伪造一个表单,并利用管理员的身份提交此表单。

伪造表单很容易,但是如何让表单自动提交呢,这里我们使用一段javascript代码来操作:

例如已经伪造好的表单名称(id属性)为form1,则我们在所伪造网页的body标签后加入一段属性信息,经过修改后的body标签就是:

<body οnlοad="javascript:document.form1.submit()">

本代码的意思就是,当网页载入时(onload),就执行后面的javascript代码,具体执行什么样的代码呢,就是document.form1.submit(),此javascript调用文档对象的form1子对象,并执行form1对象的submit()方法,即提交表单。

当然,由于我们要构造表单,所以跨站利用管理员身份提交表单这种安全漏洞针对的还是开源程序,非开源程序我们无从知道其后台代码究竟如何,也无从谈到如何构造表单了。

要想成功利用,还有一个问题就是网站程序是否在后台的处理代码中禁止了外部提交,现在网络程序通用的一段检测并禁止外部提交的代码都是类似的,如下(ASP版):

<%

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

%>

为了照顾暂时没有学过asp的读者,我们来讲解一下这段代码,server_v1这个变量获取的是进入此页面的上个页面的地址,server_v2这个变量获取的是当前网站的域名,例如:blog.blackwoods.cn,后面对server_v1进行截取,取得其网站域名部分,并和server_v2进行比对,如果不同,则说明是外部提交,就显示错误信息并终止网页继续运行。


由此我们可以看到绕过外部提交限制的方法就是利用在同一个域名下的文件,此时可以利用的方法有这么几种:

1、如果当前网站允许上传gif或者jpg等文件,则可以利用IE浏览器解析文件的一个漏洞,将自己构造的表单网页的文件名改为允许上传文件的扩展名,并上传至当前服务器。

2、如果在当前域名下其他网站允许上传或可以控制,则上传至这些网站。

根据是否禁止外部提交的不同,将我们构造的自提交表单页面上传至目标服务器或者我们自己的服务器后,应该如何让管理员访问到呢?利用跨站。

我们在可以跨站的地方写入如下代码:

<iframe src=" http://blog.blackwoods.cn/submit.htm" width="0" height="0"></iframe>

Iframe即html中创建页面框架块的代码,其中src后引号中的值为存放自提交表单的地址,width="0"和height="0"则分别设定此框架块的宽和高为0,这样可以隐藏而不被管理员发现。

以上讲解了跨站提交表单的一种应用,即添加管理员应用,此应用可以引出一类应用,如更改用户权限,更改用户密码等,均为对后台提交管理员或者用户信息更改表单的利用。

下面来介绍另外一类利用即,后台对于文件操作的利用。

有些网络程序在其后台提供了对数据库的备份功能,此功能的实现即复制文件的操作,此时我们可以利用其来获得一个webshell。

首先要求程序有前台上传图片的功能,我们将webshell文件扩展名改为gif或者其他允许上传的图片类型,并在上传图片的地方上传,然后通过已知的源代码找到程序后台备份数据库的表单,源数据库路径填写我们图片的相对路径,目标路径随意填写,但是注意将文件的扩展名改为webshell原本的扩展名,如asp,这样构造一个自提交表单,在管理员被跨站攻击提交了表单之后,就可以将我们上传的文件更改为扩展名为可执行的web程序的扩展名,达到上传了webshell的目的。

此类漏洞还可以应用为已知服务器上敏感文件的位置,但是不能下载(如防下载的数据库文件,其扩展名为asp),可以利用此功能拷贝一个可以访问并下载的副本。

最后顺便提一下以前QQ秀他人支付中存在的跨站漏洞,由于“他人支付”的留言部分可以跨站,因此我们只需构造一个表单,首先在用户cookies中写入要购买的商品代码值,然后通过跨站访问结算页面,即可不经用户同意而完成支付你的购物请求,这个漏洞是我觉得一个比较有意思,并且是我所见到的构造最为复杂的一个跨站表单提交利用,有兴趣的朋友可以研究一下。文章原文可以在网上搜索《QQ跨站漏洞巧利用,强迫他人为你购买QQ秀》或者参考光盘中的word文档。

跨站提交表单的基本技术就介绍到这里了,本文的写作主要告诉大家,其实跨站漏洞的危害也是非常大的,而并非只有盗取cookies那么简单。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值