一、什么是XSS?
- XSS 全称是Cross Site Scripting即跨站脚本,是一种网站应用程序的安全漏洞攻击,是代码注入的一种。
- XSS 允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。
- XSS 攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
- XSS 攻击通常包含了HTML以及用户端脚本语言,就是在目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行的过程。
二、有哪些危害?
- 进行网页挂马
- 盗取用户 Cookie
- DDOS(拒绝服务)客户端浏览器
- 钓鱼攻击,高级的钓鱼技巧
- 删除目标数据、恶意篡改数据、嫁祸
- 劫持用户 Web 行为,甚至进一步渗透内网
- 爆发 Web2.0 蠕虫
- 蠕虫式的 DDoS 攻击
- 蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
- 传播跨站脚本蠕虫
三、有哪些攻击种类?
-
反射型(非持久型)
基本简介
- 发出请求时XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS。
- 反射型XSS只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。
触发场景
-
将不可信数据插入到HTML标签之间时,例如DIV, P, TD;
-
将不可信数据插入到HTML属性里时,形如:
<div width=$INPUT> …content… </div>
-
将不可信数据插入到SCRIPT里时,如下:
<script> var message = ” $INPUT “; </script>
-
还有插入到Style属性里的情况,同样具有一定的危害性
<span style=” property : $INPUT ”> … </span>
-
将不可信数据插入到HTML URL里时,形如:
<a href=”http://www.abcd.com?param= $INPUT ”> Link Content </a>
-
使用富文本时,没有使用XSS规则引擎进行编码过滤。
攻击流程
-
存储型(持久型)
基本简介
- 存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。
- 存储型 XSS 攻击最常发生在由社区内容驱动的网站或 Web 邮件网站,不需要特制的链接来执行。
- 存储型 的 XSS 的危险性比非持久性高,因为用户没有办法保护自己。一旦黑客成功在某个页面注入了漏洞利用代码,他将宣传受感染页面的 URL 来希望不知情的用户中招。即使用户对非持续性 XSS 的 URL 懂得识别,也会很容易的受到影响。
触发场景
- 最典型的例子是留言板XSS,用户提交一条包含XSS代码的留言存储到数据库,目标用户查看留言板时,那些留言的内容会从数据库查询出来并显示,浏览器发现有XSS代码,就当做正常的HTML与Js解析执行,于是触发了XSS攻击。
攻击流程
-
DOM型 XSS
基本简介
- DOM XSS和反射型XSS、存储型XSS的差别在于DOM XSS的代码并不需要服务器参与,触发XSS靠的是浏览器端的DOM解析,完全是客户端的事情。
- 前面两种恶意脚本都会经过服务器端然后返回给客户端,相对DOM型来说比较好检测与防御,而DOM型不用将恶意脚本传输到服务器在返回客户端,即DOM型XSS一般和服务器的解析响应没有直接的关系,而是在JavaScript脚本动态执行的过程中产生的。
攻击流程
-
反射型DOM base XSS
-
存储型DOM base XSS
四、如何预防攻击?
对用户输入进行检查
- 使用XSS Filter类,过滤掉非法字符
对后台输出进行检查
- 一般来说,除了富文本的输出外,在变量输出到HTML页面时,可以使用编码或转义的方式来防御XSS攻击
- 编码分为很多种,针对HTML代码的编码方式是HtmlEncode
存放于cookie中的数据设置为http-only
- HttpOnly并非为了对抗XSS——HttpOnly解决的是XSS后的Cookie劫持攻击,但添加了HttpOnly不等于解决了XSS问题,使用HttpOnly有助于缓解XSS攻击
- Cookie设置了HttpOnly,则使用XSS窃取用户的Cookie会失败,因为JavaScript读取不到Cookie的值
- XSS攻击带来的不光是Cookie劫持问题,还有窃取用户信息、模拟用户身份执行操作等诸多严重的后果。如前文所述,攻击者利用AJAX构造HTTP请求,以用户身份完成的操作,就是在不知道用户Cookie的情况下进行的