XSS跨站脚本攻击的基本原理和SQL注入攻击类似,都是利用系统执行了未经过滤的危险代码,不同点在于XSS是一种基于网页脚本的注入方式,也就是将脚本攻击载荷写入网页执行以达到对网页客户端访问用户攻击的目的,属于客户端攻击。而SQL注入攻击将危险代码绕过正常的文本输入变为可执行的SQL执行语句从而操纵数据库,从而进一步探测、操纵数据库信息。
在这里谈到的跨站漏洞利用主要包括跨站脚本攻击、以及跨站请求伪造与其它的同源攻击,这些攻击都是目前极普遍的攻击方式,而同源攻击主要涉及几种攻击方式:跨站脚本攻击、跨站请求伪造、跨站请求跟踪、网站缓存投毒、HTTP响应 Splitting、HTTP请求 Smuggling、HTML和JavaScript网络扫描。
跨站脚本攻击
跨站脚本攻击是一种准许将恶意代码注入到网页中的安全漏洞。这种攻击主要用于:
A、钓鱼或者 cookie窃取,目的是为了访问受限信息。
B、为了恶搞、丑化其它网站或实施社交工程攻击
C、在网站的客户端上执行恶意代码
这种攻击可以通过利用IMG标记来实施破坏或恶搞,如关闭用户浏览器的窗口,然后打开一个既无菜单也无工具栏的窗口,并播放一些恶搞性的声音。
1、攻击原理及类型
那么,这种攻击是如何进行的呢?总体说来,它分为两种类型:其一是反射式攻击,这种攻击跟踪网站通过cookies进行的身份验证,这种网站一般都不太安全,容易遭受跨站脚本攻击。使用社会工程(如告诉用户“你中奖了!”),如果目标用户受到诱骗,并单击攻击者注入到标准HTML代码中的包含恶意代码的链接,攻击者就可以访问用户的cookie信息(会话和身份验证信息等)。其二是存储式攻击,其原理是:假设某个网站利用后端数据库作为搜索网页的信息源,黑客们并不将恶意代码注入到普通页面中,而是将SQL代码注入到这种数据库中。于是,每次从后端数据库中返回查询结果时,都会包含着攻击者的恶意代码。可以想像,这种攻击并不是针对哪个客户端,而是感染整个论坛的用户组,并感染大量的容易轻信的受害者。
2、防范措施最重要的是要保护代码。
你应当限制用户输入信息的显示,实施过滤,仅显示绝对需要的信息。建议你验证并清理所有形式的数据、数据源,以及你无法直接控制的URL参数。
一个很实用的技巧是用HTML实体(如&)来代替特别字符。为了减少特定HTML字符的数量,你必须限制用户输入,仅准许用于网站的合法代码段。例如,许多论坛通过运用 {b}标记让用户输入大写字符,但是典型情况下,这些站点并不准许你增添加自己的表单,所以不应当准许表单。此外,如果这些标记有特定的语法和值,那么你应当仅准许与其语法保持一致的值(例如,字体颜色是一个仅包含字母A-F或数字0-9的3个或6个字符的值,所以,如果你准许用户输入整个SQL语句,那么事情就糟了。)
此外,多数清理例程会用标记来替换回车符和换行符,以及一些有害的单词,如“script”,这虽然依赖于具体的应用程序,但是许多网站有理由使用这种单词,所以这些措施很难普及。
下面给出几个不安全的例子:
Python的例子:
print""
ASP的例子:
将这种文本直接写到HTML中会导致:
这里你可以看到的是合法的HTML,所以会得到处理:
下面给出几个较安全的例子:
Python:
print cgi.escape("")
ASP:
跨站请求伪造
跨站请求伪造是另一种同源策略攻击,它的目的是为了欺骗受害者加载一个包含恶意请求的网页,要求用户输入其账户及口令等。这种欺骗依赖于用户对其身份信息的信任。用户一般会认为他们只是在执行不同的任务,只不过是使用一种HTTP请求。攻击者借用用户自己的浏览器将攻击发送给目标站点。
1、跨站请求伪造的原理
首先,攻击者将达到恶意站点的链接发布到目标站点上,然后,就会有一些轻信的用户浏览恶意网站,从而成为受害者,更有甚者,会成为其帮凶。在用户受到诱骗将表单提交给原始的目标网站(最初被植入恶意链接的网站)时,用户就会成为攻击者的帮凶。因为用户已经通过了身份验证,所以目标网站会接受表单提交请求,并准许修改敏感数据,如用户自己的口令或从网站上获取关键的信息。
2、保护代码
首先,要通过检查REQUEST链接请求来限制对POST或Web应用程序的访问。
注意:有些浏览器会有一个空的链接请求,这也应当被阻止。
因而,相互认证一般情况下是令牌化认证的请求,即如果数据包含着一个适当的机密值,才可以接受粘贴数据。而且通过实行多个步骤的写入过程或确认页面会强化这种安全机制。
总结
同源策略是一个在多数浏览器中实施的概念,但它可被XSS攻击利用(它利用了一个用户对于某个网站或应用程序的信任),也可被XSRF利用(它利用了网站或应用程序对用户的信任)。
那么,我们的策略简单地说就是:绝不相信任何人!
不妨将信任看做是一个双向的街道:你永远不会知道哪个方向会出现车流。任何人都可以潜入到信任关系的中间,并滥用这种信任关系。