浅谈web安全——XSS攻击

跨站脚本攻击(XSS)

跨站脚本攻击(XSS)是客户端脚本安全的头号大敌,OWASP TOP 10 威胁多次把XSS列为榜首。XSS即(Cross Site Scripting)中文名称为“跨站脚本攻击”。本来缩写是CSS,但是为了和层叠样式表区分,所以在安全领域叫做XSS。

XSS攻击是Web攻击中最常见的攻击方法之一,其特点是不对服务器端造成任何伤害,而是通过一些正常的站内交互途径,攻击者可以利用 web应用的漏洞或缺陷之处,通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的。例如发布评论,提交含有 JavaScript 的内容文本等。这时服务器端如果没有过滤或转义掉这些脚本,作为内容发布到了页面上,其他用户访问这个页面的时候就会运行这些脚本。一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发送虚假诈骗信息,可以删除用户的日志等等,有时候还和其他攻击方式同时实施,比如SQL注入攻击服务器和数据库Click劫持、相对链接劫持等实施钓鱼,它带来的危害是巨大的,是web安全的头号大敌。

通俗的来说我们的页面在加载并且渲染绘制的过程中,如果加载并执行了意料之外的程序或代码(脚本、样式),就可以认为是受到了 XSS攻击。

XSS的分类

XSS根据效果的不同,可以分为以下几类:

  1. 反射型XSS:

只是简单的把用户输入的数据反射给浏览器,黑客往往需要给用户发送页面或者链接,让用户点击来进行攻击,反射型XSS也叫做“非持久型XSS”。

  1. 存储型XSS:

把攻击存放在服务端,可能造成传播(比如博客系统,每个访问该页面的人都有可能被攻击),主动性更强。比较常见的一种场景就是,黑客写下一篇包含有恶意JavaScript代码的博客文章,文章发表后,所有访问该博客文章的用户,都会在他们的浏览器中执行这段恶意的Javascript代码。黑客把恶意的脚本保存到服务器端,所以这种XSS攻击叫做“存储型XSS”。也叫做“持久型XSS”,因为从效果上来说,它存在的时间是比较长的。

  1. DOM型XSS:

本质上是反射型,但是是通过用户点击,修改原本dom元素的属性,构造攻击动作。

 

反射型和dom型区别:

反射型是构造好了攻击动作,然后就等你打开那个页面;dom型也是等你点击,但是不是页面,通过用户动作,把原来的动作注释掉,然后加上自己修改的动作。

 

反射型 XSS 跟存储型 XSS 的区别:

存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

 

DOM 型 XSS 跟前两种 XSS 的区别:

DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

各个分类的攻击步骤

存储型 XSS

存储型 XSS 的攻击步骤:

  1. 攻击者将恶意代码提交到目标网站的数据库中。
  2. 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 在部分情况下,恶意代码加载外部的代码,用于执行更复杂的逻辑。
  5. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

 

反射型 XSS

反射型 XSS 的攻击步骤:

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
  3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
  4. 在部分情况下,恶意代码加载外部的代码,用于执行更复杂的逻辑。
  5. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。

DOM 型 XSS

DOM 型 XSS 的攻击步骤:

  1. 攻击者构造出特殊的 URL,其中包含恶意代码。
  2. 用户打开带有恶意代码的 URL。
  3. 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
  4. 在部分情况下,恶意代码加载外部的代码,用于执行更复杂的逻辑。
  5. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

XSS的危害

  1. 通过 document.cookie 盗取 cookie中的信息。
  2. 使用 js或 css破坏页面正常的结构与样式。
  3. 流量劫持(通过访问某段具有 window.location.href 定位到其他页面)。
  4. 利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。
  5. 利用XMLHttpRequest或Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作,并且攻击者还可以利用 iframe进一步的进行 CSRF 攻击。
  6. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力。

Xss攻击带来的危害有很多中,可能只是简单的恶作剧,也可以是盗号或者其他未授权的操作。

如何规避XSS攻击?

实际上简单的通过正则判断 script、link、style、img 等HTML标记并不可取,因为,首先输入点的情况变化多样,很难把所有的 html标记的特性都考虑进来,其次对html标记的限制,也会让产品的可用性大大降低(比如有些特殊的关键字会被程序阻止,使得用户使用非常不便),最后这种判断本身也不安全,比如攻击者会在关键字中插入空格、制表符以及其它HTML实体编码来躲避侦测。

既然我们前面说到攻击必须有两个要点:“输入点”,“输出点”,所以防御的时候,我们只要做好这两个点的控制,就基本上可以万无一失!

1对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。

2对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。

3将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的是URL,就判读是否满足URL格式)。

4对于 JSON解析请使用 JSON.parse() 方法。

5后端接口也应该要做到关键字符过滤的问题。

就目前而言,应对XSS攻击的主要手段还是编码与过滤两种,编码用于将特殊的符号 "<、>、&、'、""进行转义,而过滤则是阻止特定的标记、属性、事件。建议采用“编码”的方案。     

你可能感兴趣的:(技术类文章)