在Web安全的领域中,XSS攻击是最常见的一种攻击方式。小编整理出了XSS的基础知识,包括了XSS的简介、原理与类型来帮助大家梳理出XSS的基础知识点,快来看看吧。
一、XSS攻击简介
XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。
作为一种HTML注入攻击,XSS攻击的核心思想就是在HTML页面中注入恶意代码,而XSS采用的注入方式是非常巧妙的。在XSS攻击中,一般有三个角色参与:攻击者、目标服务器、受害者的浏览器。
由于有的服务器并没有对用户的输入进行安全方面的验证,攻击者就可以很容易地通过正常的输入手段,夹带进一些恶意的HTML脚本代码。当受害者的浏览器访 问目标服务器上被注入恶意脚本的页面后,由于它对目标服务器的信任,这段恶意脚本的执行不会受到什么阻碍。而此时,攻击者的目的就已经达到了。
下面我们以一段简单的JavaScript脚本为例,来描述整个XSS攻击的过程:
上面这段脚本的执行具体内容就是弹出一个对话框显示用户的Cookie信息。攻击者在向目标服务器的某个页面进行数据输入的过程中,通过正常的输入方式夹带进这段脚本。假如一切正常的时候,生成的页面代码如下形式:
…
text //正常输入的数据
…
如果用户的输入为textalert(document.cookie);,而目标服务器又没有对这个输入进行检验的话,则会生成如下形式的页面代码:
…
text
…
可以看到,这段脚本已经成功嵌入到该页面当中。当受害浏览器访问这个页面的时候,这段脚本也将被认为是页面的一部分,从而得到执行,即弹出对话框显示受害浏览器的Cookie信息。
二、XSS原理
XSS的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码,当用户浏览该页之时,嵌入其中 Web 里面的脚本代码会被执行,从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的。
三、XSS攻击类型
根据XSS脚本注入方式的不同,我们可以将XSS攻击简单的分类为反射型XSS、存储型XSS、DOM-based 型、基于字符集的XSS、基于 Flash 的跨站 XSS、未经验证的跳转 XSS6种类型。
1、反射型XSS(非持久型XSS)
又称非持久型XSS。之所以称为反射型XSS,是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的:发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS。 而称为非持久型XSS,则是因为这种攻击方式具有一次性,由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在点击链接的时候才产生作用。
攻击者通过电子邮件等方式给别人发送带有恶意脚本代码参数的URL,当 URL 地址被打开时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,特有的恶意代码参数被 HTML 解析、执行。
非持久型XSS漏洞攻击的四大特点:①即时性。不经过服务器存储,直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击,拿到用户隐私数据;②攻击者需要诱骗点击;③反馈率低,所以较难发现和响应修复;④盗取用户敏感保密信息。
防止出现非持久型XSS漏洞的五大措施:①Web页面渲染的所有内容或者渲染的数据都必须来自于服务端;②尽量不要从URL,document.referrer,document.forms 等这种 DOM API 中获取数据直接渲染;③尽量不要使用eval, new Function(),document.write(),document.writeln(),window.setInterval(),window.setTimeout(),innerHTML,document.creteElement() 等可执行字符串的方法;④如果做不到以上几点,也必须对涉及DOM渲染的方法传入的字符串参数做 escape 转义;⑤前端渲染的时候对任何的字段都需要做escape转义编码。
2、存储型XSS(持久型XSS)
存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。
一般存在于Form表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。
这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。
可以看到,存储型XSS的攻击方式能够将恶意代码永久地嵌入一个页面当中,所有访问这个页面的用户都将成为受害者。如果我们能够谨慎对待不明链接,那么反射型的XSS攻击将没有多大作为,而存储型XSS则不同,由于它注入的往往是一些我们所信任的页面,因此无论我们多么小心,都难免会受到攻击。可以说,存储型XSS更具有隐蔽性,带来的危害也更大,除非服务器能完全阻止注入,否则任何人都很有可能受到攻击。
持久型XSS的三大特点:①持久性,植入在数据库中;②危害面广,甚至可以让用户机器变成DDoS攻击的肉鸡;③盗取用户敏感私密信息。
防止持久型XSS漏洞的三大措施: ①后端在入库前应该选择不相信任何前端数据,将所有的字段统一进行转义处理;②后端在输出给前端数据统一进行转义处理;③前端在渲染页面DOM的时候应该选择不相信任何后端数据,任何字段都需要做转义处理。
3、DOM-based型
客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从URL中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的 JavaScript 脚本,而这些脚本没有经过适当的过滤和消毒,那么应用程序就可能受到 DOM-based XSS 攻击。需要特别注意以下的用户输入源 document.URL、 location.hash、 location.search、 document.referrer 等。
4、基于字符集的XSS
哪怕现在很多的浏览器以及各种开源的库都专门针对了XSS进行转义处理,尽量默认抵御绝大多数 XSS 攻击,但是还是有很多方式可以绕过转义规则,让人防不胜防。比如「基于字符集的 XSS 攻击」就是绕过这些转义处理的一种攻击方式,比如有些 Web 页面字符集不固定,用户输入非期望字符集的字符,有时会绕过转义过滤规则。
可以形成「基于字符集的XSS攻击」的原因是由于浏览器在 meta 没有指定 charset 的时候有自动识别编码的机制,所以这类攻击通常就是发生在没有指定或者没来得及指定 meta 标签的 charset 的情况下。
避免基于字符集的XSS攻击的两大方法:①记住指定;②XML中不仅要指定字符集为 utf-8,而且标签要闭合。
5、基于 Flash 的跨站 XSS
基于Flash的跨站 XSS 也是属于反射型 XSS 的一种,AS 脚本可以接受用户输入并操作 cookie,攻击者可以配合其他 XSS(持久型或者非持久型)方法将恶意 swf 文件嵌入页面中。主要是因为 AS 有时候需要和 JS 传参交互,攻击者会通过恶意的 XSS 注入篡改参数,窃取并操作cookie。
基于Flash的跨站 XSS 的两种避免方法:①严格管理cookie的读写权限;②对Flash能接受用户输入的参数进行过滤 escape 转义处理。
6、未经验证的跳转XSS
有一些场景是后端需要对一个传进来的待跳转的URL参数进行一个 302 跳转,可能其中会带有一些用户的敏感(cookie)信息。如果服务器端做302 跳转,跳转的地址来自用户的输入,攻击者可以输入一个恶意的跳转地址来执行脚本。
防止未经验证的跳转XSS漏洞的两种措施:①对待跳转的URL参数做白名单或者某种规则过滤;②后端注意对敏感信息的保护,比如 cookie 使用来源验证。
以上就是小编整理出来的XSS基础知识的全部内容啦,相信大家看完以后对XSS攻击也有了一定的了解。