XSS 基本概念和原理介绍
基本概念
跨站脚本攻击 XSS(Cross Site Scripting),为了不和层叠样式表 ( Cascading Style Sheets,CSS ) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。
恶意攻击者 往 Web 页面里插入恶意 JavaScript 代码,当用户浏览该页面时,嵌入在 Web 里面的 JS 代码会被解析执行,从而达到恶意攻击用户的目的。
在一个 Web 页面上,有一种很常见的功能是将用户输入的内容输出到页面上。
如果这里输入的内容是一段经过构造的 JS 代码,提交之后再次访问这个页面时,用户就会获取该 JS 代码在浏览器端执行的结果。
通过构造其他相应的代码,攻击者可以执行更具危害的操作。
实施 XSS 攻击需要具备两个条件:
- 能够向 Web 页面注入恶意代码;
- 这些恶意代码能够被浏览器成功执行。
XSS 分类
XSS 攻击方法主要分为 3 类,分别是 反射型 XSS,**存储型 XSS **和基于的 DOM 的 XSS。
反射型
特点:恶意脚本通过 URL 传递并在页面上立即执行。
攻击方式:攻击者诱导用户点击一个包含恶意代码的链接,恶意代码被浏览器执行。
示例:当用户点击一个包含恶意脚本的链接时,服务器将恶意脚本反射回用户的浏览器并立即执行。
非持久型
常见的就是在 URL 中构造,将恶意链接发送给目标用户。当用户访问该链接时候,会向服务器发起一个 GET 请求来提交带有恶意代码的链接。造成反射型 XSS 主要是 GET 类型。
反射型 XSS 完整的攻击流程:
A 和 B 表示的是用户和网站正常通信,从 C 开始就是 XSS 攻击的整个流程。
首先:
- C:黑客向用户发送了一个有恶意脚本的 URL。
- D:用户点击之后且登录了 Website 。
- E:服务器返回了恶意脚本的响应。
- F:恶意脚本在浏览器执行之后,向黑客已经部署的服务器上发送敏感信息。
- G:黑客前往黑客服务器获取到用户的敏感信息。
- H:黑客获取到了用户的敏感信息。
- I:黑客利用已经获取的敏感信息向 Website 发起请求,伪装成用户进行非法操作。
以上就是 反射型XSS 的整体攻击环节。
存储型
特点:恶意脚本存储在目标服务器的数据库中,并在用户访问相关页面时执行。
攻击方式:攻击者将恶意代码输入到网站的某个输入表单中,代码被存储在服务器上,其他用户访问该页面时恶意代码被执行。
示例:攻击者在论坛或评论区发布含有恶意脚本的帖子,其他用户查看该帖子时恶意脚本被执行。
持久型
常见的就是在 博客留言板、反馈投诉、论坛评论,可以将恶意代码和正文都存入服务器的数据库。每次访问都会触发恶意代码。 例如:<srcipt>alert(/xss/)</srcipt>
存储型 XSS 攻击原理
黑客事先在 Website 的 Server 中存储一端恶意脚本,之后用户点击访问获取数据,浏览器在解析文件的时候执行了恶意的脚本,向黑客发送敏感数据。
存储型 XSS 完整的攻击流程:
C 表示的是正常访问 Website 的情况。
首先:
- A : 黑客发现了浏览器有 XSS 存储型的漏洞,于是向浏览器发起恶意代码。
- B:服务器将这一段恶意代码存储到了服务器中。
- C:用户发现这个 website 有个地方吸引了他,但是黑客提前在这里埋了恶意代码。
- D:用户读取了服务器那一段有恶意的代码。
- E:浏览器执行了恶意脚本获取了用户的敏感信息
- F:恶意的代码传送到了黑客的服务器里
- G:黑客就可以从服务器中获取到用户的敏感信息,从而模拟用户登录这个 website 。
反射型 XSS 与 存储型 XSS 的区别:
一、被攻击对象的不同反射型 XSS 的被攻击对象一般是攻击者去寻找的,就比如说:一个攻击者想盗取 A 的 QQ 号,那么攻击者就可以将一个含有反射型 XSS 的 URL 链接给 A,此时我们可以看出,需要将特定的 URL,注意是特定的 URL 给 A,当 A 点击进入链接时,就受到 XSS 攻击,所以这种攻击范围不是特别的广。
而存储型 XSS 是广撒网的方式或者指定的方式,就是攻击者将存储型 XSS 放在一些有 XSS 漏洞的网站上,只要有用户访问这个链接就会中招,而攻击者也可以寻找被攻击对象,比如说上面的例子,所以我们可以看出,存储型 XSS 的危害性更大,范围更广,可以不需要寻找被攻击对象,只要存储型 XSS 在服务器上就能实施攻击。
DOM 型 XSS 的被攻击对象其实和反射型 XSS 被攻击对象差不多,就是给攻击对象放送 URL。
二、解析位置不同(个人感觉是反射型与存储型区别的本质)
反射型XSS的脚本被解析的地方是浏览器,而存储型XSS的脚本被解析的地方是服务器,DOM型XSS也是浏览器,所以DOM型又叫DOM反射型XSS。但是反射型XSS需要联网,而DOM型不需要!
三、存储时间不同
反射型XSS是既有即用,没有持久性,而存储型 XSS 是存储在服务器上,只要服务器不挂机或者是被干掉,就一直会有,DOM 型 XSS 和反射型差不多,但是用人就扯淡了,那反射型只要不改变源代码不就是一直存在吗?不是的,反射型XSS是必须得特定的URL才能使得被攻击对象中招,如果是单单官方网页,就没有了咯,存储型就不同,只要服务器里面有存储型XSS,不论是不是官网,被攻击对象都会被攻击。四、允许输入点的不同(这是DOM型与其他两种的区别)
一般情况下,反射型XSS在搜索框啊,或者是页面跳转啊这些地方,而存储型XSS一般是留言,或者用户存储的地方,而DOM呢?是在DOM位置上,不取决于输入环境上。
DOM 型
特点:恶意脚本通过修改浏览器的 DOM(文档对象模型)结构执行。
攻击方式:攻击者操纵页面中的 JavaScript,使其执行恶意代码,通常无需与服务器交互。
示例:通过恶意 URL 参数或输入值,攻击者修改页面的 JavaScript 代码,使其在用户的浏览器中执行恶意操作。
在讲解 DOM-XSS 之前,先以图来说明到底什么是 DOM:
文档对象模型 Document Object Model(DOM)是一个与平台、编程语言不相干的接口,允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果会成为展示页面的一部分。
DOM 型 XSS 其实是一种特殊类型的反射型 XSS,也被称作本地跨站,它是基于 DOM 文档对象模型的一种漏洞。DOM XSS 和反射型 XSS、存储型 XSS 的区别在于 DOM XSS 代码并不需要服务器参与,出发 XSS 靠的是浏览器的 DOM 解析,完全是客户端的事情。
DOM 中 有很多对象,其中一些对象可以被用户所操纵,如 url,location 等。客户端的脚本程序可以通过 DOM 来动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而是从客户端取得 DOM 中的数据后并在本地执行,因此仅从服务器端是没有办法防御 DOM 型 XSS 漏洞的,如若 DOM 中的数据没有经过严格的验证,便会产生基于 DOM 的 XSS 漏洞。
基于 DOM 的 XSS 是反射的特例,其中 JavaScript 隐藏在 URL 中,并在其呈现时由页面中的 JavaScript 取出,而不是在提供服务时嵌入到页面中。
总结:基于 DOM 的 XSS 的攻击场景和反射性 XSS 是一样的,唯一不同的就是,基于 DOM 的 XSS,不是发生在服务器端,而是直接发生在了浏览器那里。这可以使其比其他攻击更隐蔽,并且监控页面正文的 WAF 或其他防护检测不出恶意内容。
- 反射型 XSS:通过 URL 传递并立即执行。
- 存储型 XSS:存储在服务器端数据库中,用户访问时执行。
- DOM XSS:通过修改客户端的 DOM 执行,不需要与服务器交互。