Web安全之XSS跨站
XSS(Cross Site Scripting)的全称是跨站脚本攻击,之所以叫XSS,是想与Web中的另一个层叠样式表CSS区分开来。该攻击主要是在网页中嵌入JavaScript脚本代码,当用户访问此网页时,脚本就会在浏览器中执行,从而达到攻击的目的。在XSS攻击中,一般有3个角色参与:攻击者、目标服务器、受害者的浏览器。由于有些服务器没有对用户的输入进行安全验证,攻击者可以通过正常书写的方式并带有部分的HTML恶意脚本代码的方法来进行攻击,当受害者的浏览器访问目标服务器时,由于对目标服务器的信任,这段恶意代码的执行不会受到什么阻碍,从而形成了XSS攻击。
下面通过一个的实例来演示一下XSS具体情况。我们要使用到JavaScript的脚本如下:
<script>alert(document.cookie);</script>
这个语句的含义是以警告框的形式将用户访问网站的Cookie输出。如果攻击者向一个网站输入数据时,在正常数据后面带上这一段代码,那么那个网站的源码将变成如下情况。
<html>
…
test<script>alert(document.cookie);</script>
…
</html>
熟悉 JavaScript 的朋友,这时候应该已经明白如果受害者访问这个网页时会发生什么事情。当他访问的时候,浏览器界面就会弹出用户的Cookie信息。这里只是XSS的一个小演示,只要愿意,黑客可以向里面插入任意的代码,甚至写一个js文件代码,以引用的形式插入进入网页。下面介绍XSS的攻击类型。
1. 反射型XSS
反射型 XSS 又称非持久型 XSS。之所以称为反射型 XSS,是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等方式“反射”回来的。而称为非持久型XSS,则是因为这种攻击方式是一次性的。攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者单击该链接时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,从而在该浏览器上执行了这段脚本。例如,攻击者将如下链接发送给受害者:
http://www.example.com/search.asp?input=。
当受害者单击这个链接的时候,注入的脚本被当作搜索的关键词发送到目标服务器的search.asp页面中,则在搜索结果的返回页面中,这段脚本将被当作搜索的关键词而嵌入。这样,当用户得到搜索结果页面后,这段脚本也得到了执行。这就是反射型XSS攻击的原理,可以看到,攻击者巧妙地通过反射型XSS的攻击方式,达到了在受害者的浏览器上执行脚本的目的。由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在单击链接的时候才产生作用,这也是它被称为非持久型XSS的原因。
2. 存储型XSS
存储型XSS又称持久型XSS,它和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库和文件中。这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到攻击。可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面当中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型XSS攻击将没有多大作为,而存储型XSS则不同,由于它注入的往往是一些受信任的页面,因此无论多么小心,都难免会受到攻击。可以说,存储型XSS更具有隐蔽性,带来的危害也更大,除非服务器能完全阻止注入,否则任何人都很有可能受到攻击。
3. DOM XSS
DOM XSS全称是DOM Based XSS(基于DOM的XSS),其实这种XSS攻击并不是以是否存储在服务器中来划分的。理论上,这种攻击也属于反射型XSS攻击,但之所以不将它归为反射型是因为它具有特殊的地方。这种类型的攻击不依赖于起初发送到服务器的恶意数据。这似乎与前面介绍的XSS有些出入,但是可以通过一个例子来解释这种攻击。
当Javascript在浏览器执行时,浏览器提供给Javascript代码几个DOM对象。文档对象首先在这些对象之中,并且它代表着大多数浏览器呈现的页面的属性。这个文档对象包含很多子对象,如 location、URL和referrer。这些对象根据浏览器的显示填充浏览器。因此,document.URL和document.location是由页面的URL按照浏览器的解析填充的。注意,这些对象不是提取自HTML的body,它们不会出现在数据页面。文档对象包含一个body对象,它代表对于HTML的解析。
<HTML>
<TITLE>Welcome!</TITLE>
Hi
<SCRIPT>
var pos=document.URL.indexof("name=")+5;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<BR>
Welcome to our system
</HTML>
以上是HTML里面解析URL和执行一些客户端逻辑的代码。然后,在发送请求的后面加上如下的指令:
http://www.example.com/welcome.html?name=abc。
当受害者访问到该网站时,浏览器会解析这个 HTML 为 DOM,DOM 包含一个对象叫document,document里面有一个URL属性,这个属性里填充着当前页面的URL。当解析器到达javascript代码,它会执行它并且修改HTML页面。倘若代码中引用了document.URL,那么,这部分字符串将会在解析时嵌入到 HTML 中,然后立即解析,同时,Javascript 代码会找到(alert(document.cookie))并且在同一个页面执行它,这就产生了XSS的条件。
4. 检测
可以看出,XSS攻击是与SQL注入类似的代码注入类漏洞。并且在JavaScript灵活运用的今天,对于XSS的检测与预防必不可少。下面简单介绍一下XSS的预防措施。
(1)输入检测对用户输入的数据进行检测。对于这些代码注入类的漏洞原则上是不相信用户输入的数据的。所以,我们要对用户输入的数据进行一定程度的过滤,将输入数据中的特殊字符与关键词都过滤掉,并且对输入的长度进行一定的限制。只要开发的人员严格检查每个输入点,对每个输入点的数据进行检测和XSS过滤,是可以阻止XSS攻击的。(2)输出编码造成XSS的还有一个原因是应用程序直接将用户输入的数据嵌入HTML页面中。如果我们对用户输入的数据进行编码,之后在嵌入页面中,那么HTML页面会将输入的数据当作是普通的数据进行处理。(3)Cookie安全利用XSS攻击可以轻易获取到用户的Cookie信息,那么需要对用户的Cookie进行一定的处理。首先应尽可能减少Cookie中敏感信息的存储,并且尽量对Cookie使用散列算法多次散列存放。
更多关于“网络安全培训”的问题,欢迎咨询千锋教育在线名师。千锋教育多年办学,课程大纲紧跟企业需求,更科学更严谨,每年培养泛IT人才近2万人。不论你是零基础还是想提升,都可以找到适合的班型,千锋教育随时欢迎你来试听。