秦宇
(广东外语艺术职业学院,广东 广州 510640)
【摘 要】高职院校的网络安全类课程教学中,需要学生既具有扎实的基础理论知识,又要求在教学中给学生提供一个模拟或者真实的操作环境帮助学生全面的掌握网络安全知识。如何防范跨站脚本攻击是当前网络安全工作中的一个重要课题,本文结合了日常教学的经验,在详细分析跨站脚本攻击原理的基础上,在php+mysql环境上搭建出一个真实的实验环境,帮助学习者深刻理解跨站脚本攻击的相关知识,并学会如何进行有效防范。
教育期刊网 http://www.jyqkw.com
关键词 跨站脚本攻击; 网络安全; 实验平台
【Abstract】The students in vocational college are required to have enough knowledge about the principle of network security, and an experimental platform is also needed to help students lean network security. Cross Site Script(XSS) attack and defense is an important subject in network security field. An experimental platform is developed to help learner understand about XSS attack and defense, and the principle of XSS attack and defense is also analyzed. The platform is developed using php+mysql tools. This article is based on the author’s regular teaching experience.
【Key words】Cross site script attack; Network security; Experimental platform
跨站脚本攻击在各种网络安全漏洞中,一直被OWASP(Open Web Application Security Project) 组织评为十大安全漏洞中的第二威胁漏洞。2011年,国内最热门的信息平台“新浪微博”爆发跨站脚本攻击,仅持续16分钟,感染的用户就达33000个,可见其危害之大。
高职院校的《网络安全与防范》课程也把跨站脚本攻击作为一个重点的教学内容。为了让学生充分掌握跨站脚本攻击的防范方法,就必须透彻的了解跨站脚本攻击的原理和具体的实施过程。
我们开展了一项课题,旨在搭建一个网络攻防的应用平台,帮助学习者更深刻的理解各种网络攻防的原理和了解其实施的步骤,以采取更高效的防范措施,来杜绝网络攻击的产生。跨站脚本攻击就是其中的一项任务。
本文中,我们会对跨站脚本攻击进行详细的分析,并结合搭建的网络平台重建攻击过程,并提出防范方法。
跨站脚本攻击是由于网站的后台系统对用户的输入过滤不严而产生的。攻击者利用这一点把恶意代码加入到网站的后台系统中(通常是网页之中),当用户浏览这些网页时,那些隐含在正常网页中的恶意代码就会在用户的机器中得以执行,从而达到各种攻击用户电脑的目的。
为了理解跨站脚本攻击,有必要先了解用户访问一个没有恶意代码的简单网页的过程。访问如图 1所示的一个网页,用wireshark工具进行网络数据的捕获。
总共捕获到两个数据包,一个是浏览器发送给网站的请求数据包,其内容如图 2:
在请求数据包中,比较重要的一个字段是cookie字段,其具体内容记录了用户平时登录各种网站的账号和密码信息。跨站脚本攻击往往会通过这个字段获取到用户的账号等重要信息。
网站回送给浏览器的响应数据包如图 3:
在响应数据包中,除了一些头信息外,还附带上了网页的内容。可见,一个基本的网页访问过程就是由一个请求数据包和响应数据包组成的。
接下来,在我们搭建的实验平台上,对一个网站进行跨站脚本攻击,以实现一个不断弹出的窗口,迫使正常的网页浏览无法继续下去。在一个存在有漏洞的商品评价网页中,通过对商品添加评价进行攻击。如图 4:
在评论内容里面,写下如下的代码:
<script>while(true) alert(/You have been XSS attacked!/) </script>,
发表评论后,当其他用户登录网站,通过点击“查看该商品评论”查看评论时,就会出现如图 5所示的情况:
并且无论点击多少次“确定”按钮,都无法关闭此弹出窗口,表明此用户已经受到了跨站脚本攻击。打开由网站传送回来的网页源代码,可以发现这样一句代码:“<script>while(true) alert(/You have been XSS attacked!/) </script>”,这段代码已经被插入到网页中,当浏览器解析到这一段代码时,因为“<script>”标签的原因,标签对里面的内容会被解释执行,而不是作为对商品的评论原封不动的显示在页面上。通过查看网站后台数据库,发现如图 6所示的语句已经被写入了数据库:
当其他用户查看此商品的评论时,此条记录被读出,并插入到网页中,从而形成了跨站脚本攻击。
另外一个跨站脚本攻击的案例是盗取用户的登录账号和密码。
用户“qy1”在如图 7所示的网页中进行登录后:
在用户的机器上会保留一个cookie,里面记录了用户登录时输入的账号和密码。可以通过在用户的浏览器的地址栏输入语句“javascript:alert(document.cookie)”来显示出账号和密码,如图 8所示:
可见用户的账号和密码都保存在了用户的计算机中。通过跨站脚本攻击可以在攻击者的机器上获得用户的账号和密码。
攻击者a在某一个商品的评论中发表如图 9所示的内容:
其中,评论内容中输入的是: “<script>var ck=document.cookie;var url=\’http://www.kaikaixinxin.net/qlunwen1216/jieshoucookie.php?zhanghao=\’+ck;var daima=\´<iframe width=0 height=0 src=\"\’+url+\’\"></iframe>\’;document.write(daima);</script>”。
当用户“qy1”登录网站查看这一个评论时,其账号和密码就会发送到攻击者a所指定的机器上,并存储在“cookie.txt”文件中,其中的内容如图 10:
由此攻击者就利用跨站脚本攻击获取到了被攻击者的账号和密码等重要信息。
分析此次跨站脚本攻击,攻击者在商品评论里面并没有写入评论性的语句,而是写入了一段javascript代码,这段代码并没有经过过滤就被写到了网站的后台数据库中,如图 11:
当受攻击者浏览这个商品的评论时,这段代码没有经过任何过滤就被传送给了浏览器,而浏览器当解析到<script></script>所包括的语句时,会认为这是一段javascript语句,会执行语句中的内容。而这段代码的作用就是读取被攻击者机器上所存储的cookie信息,并且把此信息发送给攻击者所指定的网站的指定接收页面。我们再来看,这个接收页面的内容如下:
<?php
$cookie=$_GET[´zhanghao´];
$cookierec=fopen("cookie.txt","a");
fwrite($cookierec,$cookie."\n");
fclose($cookierec);
?>
其作用就是接收被攻击者发送过来的账号信息,并把它存储在文件“cookie.txt”里面。
被攻击者的机器在不知不觉中向攻击者指定的机器发送了数据包,其内容如图 12:
数据包中的GET语句包括了用户的账号等重要信息。
到此为止,一个详细的跨站脚本攻击过程就已经详细的展现出来。如何防止此种跨站脚本攻击呢。通过分析以上攻击过程,发现实现此类攻击,要具备以下条件:
(1)网站存在供用户输入数据的页面,类似留言板,商品评论,搜索框等。
(2)用户浏览了被攻击者恶意修改过的网页。
(3)用户的机器允许执行这些恶意代码。
(4)网站没有对用户的输入内容进行有效的过滤,即过滤掉那些攻击性的代码,并且在输出用户的评论或者搜索内容时也没有进行过滤。
对于以上的第一点,由于现在绝大多数网页都会有和用户交互的需要,所以给用户输入信息的功能,不能取消。
对于第二点,用户可以提高警惕,对于一些非法网站,尽量不要去访问。
对于第三点,用户可以禁止浏览器的活动脚本的执行,可以如图 13设置:
对于第四点,要求网站开发人员对用户的输入信息进行过滤,过滤掉恶意的代码。或者在输出时进行过滤,过滤掉恶意代码。
例如,可以建立一个如下的函数:
function unhtml($content){
$content=str_replace("&","&",$content);
$content=str_replace("<","<",$content);
$content=str_replace(">",">",$content);
$content=str_replace(" ," ",$content);
$content=str_replace(chr(13),"<br>",$content);
$content=str_replace("\\","\\\\",$content);
$content=str_replace(chr(34),""",$content);
return $content;
}
利用此函数把”<” ,”>”, “&”等字符转化为<, >, &等字符。这样浏览器在输出时,遇到<, >, &等字符时,就会在网页上显示”<” ,”>”, “&”等字符,而不会把这些字符对中所包含的内容当作可运行的代码进行执行了。
在实验平台的网站后台页面代码中加入unhtml函数,例如在显示商品评论的网页showpl.php中加入如下代码
<?php echo unhtml($info1[content]);?>
成功对商品评论中的输出内容进行了过滤,避免了跨站脚本攻击,用户看到的输出结果如图 14:
结论:
为了让学习者理解如何防范跨站脚本攻击,搭建了一个基于php+mysql的实验平台,在对跨站脚本攻击进行了原理上的详诉后,对攻击中的每个步骤进行了模拟,每一步的模拟都是一个真实攻击的再现。最后,讲解如何防范跨站脚本攻击,对于后台防范代码做了详解,演示了防范后的效果。我们搭建的实验环境让学习者不再局限于对跨站脚本攻击原理上的了解,而是有了一个实操的环境,极大的提高了学习者的学习兴趣,增加了学习效率。基于我们搭建的实验平台,将来还可以开展更多的实验。
教育期刊网 http://www.jyqkw.com
参考文献
[1]赵彬.黑客攻防Web安全实战详解[M].北京:中国铁道出版社,2014.
[2]肖遥.大中型为了入侵要案直击与防御[M].北京:电子工业出版社,2011.
[3]武新华,陈艳艳,王英英.矛与盾:黑客攻防与脚本编程[M].北京:机械工业出版社,2010.
[责任编辑:汤静]