根据XSS的工作特性,主要可以分为三种类型:反射型XSS、存储型XSS和DOM型XSS。反射型XSS是所有XSS中漏洞最多的类型,恶意脚本代码只在用户点击时触发,执行一次,常被称为“非持久型XSS”;存储型XSS危害性较大,恶意脚本代码会被存储到服务器的本地文件或数据库中,常被称为“持久型XSS”;DOM型XSS恶意脚本代码被注入到文档节点中,本质上属于“非持久型XSS”。
反射型XSS、存储型XSS和DOM型XSS的基本原理、攻击过程和实现方法都不相同。对不同类型的跨站脚本漏洞进行分析研究,有助于理解不法分子的攻击方式,以采取更好的防护措施。
1. 反射型XSS
反射型XSS攻击指攻击者在页面中插入恶意Java Script脚本,该脚本随着HTTP/HTTPS请求数据一起发送给后端服务器,服务器对其进行响应,浏览器接收响应后将其解析渲染。恶意脚本的执行路径为“浏览器-服务器-浏览器”,浏览器中的恶意脚本发送到服务器,服务器直接对应资源返回浏览器中解析执行,整个过程类似于反射。
反射型XSS一般将包含恶意脚本的页面链接进行编码,伪装成特定的样式诱惑用户点击,在用户点击时触发恶意脚本的执行。不过,反射型XSS的恶意脚本只执行一次。攻击者向正常用户发送包含恶意Java Script脚本的链接,该链接会进行URL编码,或者生成短链接等,链接会被封装得具有迷惑性,引诱用户点击;用户点击该链接后,会向服务器发送页面请求;后端服务器收到请求后,对其响应返回恶意Java Script脚本的页面;客户端的浏览器解析执行页面的恶意脚本并中招,达到攻击者的目的,使反射型XSS攻击得以实现。
反射型XSS常用于Cookie的窃取,可借助于页面中的输入框,嵌入Java Script脚本,在浏览器界面中直接弹出当前页面的Cookie值;也可借助网络测试攻击工具进行远程监听,通过URL的参数将页面的Cookie反弹到监听服务器对应的端口。
2. 存储型XSS
存储型XSS攻击指攻击者在Web服务器的本地文件或对应的数据库中插入恶意Java Script脚本,在正常用户发送相关页面的HTTP/HTTPS请求数据时,恶意脚本被发送到浏览器进行解析执行。由于恶意脚本是被永久性地存储在服务器端的,返回的每个正常用户页面都会包含该脚本,因此用户每访问一次页面,恶意脚本就会执行一次。
存储型XSS不需要引诱用户点击链接,所有访问含恶意脚本页面的用户都会受到攻击,包括管理员用户。存储型XSS是最为广泛存在的一种XSS漏洞。攻击者首先会构造恶意Java Script脚本,将其存储到Web服务器的文件中,或者存储到数据库中,将其永久性地保存在Web应用后端;用户正常登录网站浏览页面,但是当访问含恶意脚本的页面时,就会向Web服务器发出对应的HTTP/HTTPS请求;后端服务器收到请求后,对其响应返回恶意Java Script脚本的页面;客户端的浏览器解析执行页面中的恶意脚本。每发送一次页面请求,以上步骤都会重复一遍,以实现存储型XSS攻击,导致网站的危险系数变高。
存储型XSS常见于文章发表、评论区、留言板等处,攻击者利用网站的这些功能将恶意Java Script脚本存储到后端Web服务器或数据库服务器中。当正常用户访问相应页面时,就会受到XSS攻击,被窃取Cookie、获取后端服务器地址等。
3. DOM型XSS
DOM型XSS攻击指攻击者直接对页面DOM(Document Object Model,文档对象模型)的节点进行修改,将恶意Java Script脚本嵌入到节点的属性、触发事件等内容中,直接由浏览器解析执行。
DOM型XSS是纯客户端的XSS漏洞,与后端服务器没有任何交互。一般来说,攻击者通过URL中的参数进行恶意脚本触发,其攻击原理与反射型XSS类似。
不同类型的跨站脚本攻击具有不同的属性。反射型XSS和DOM型XSS需要将包含恶意脚本的URL发送给用户,诱惑其去点击才会触发脚本的执行,而存储型XSS则会让所有访问包含恶意脚本页面的用户都受到攻击;反射型XSS和存储型XSS都有客户端和服务器共同参与,而DOM型XSS是纯客户端行为;反射型XSS和DOM型XSS都是单次触发的,而存储型XSS是持久性的,每次访问都会触发。联合利用不同类型的XSS漏洞,会引发不同的攻击方式,需要结合具体的应用场景和业务需求对其进行防范。
跨站脚本漏洞在Web应用中存在范围广,危害性较大。对跨站脚本攻击的原理进行分析,研究不同类型XSS的工作过程,有助于更好地对XSS攻击做出防护,是非常必要且有意义。