XSS
是跨站脚本攻击(Cross Site Scripting),不写为CSS
是为了避免和层叠样式表(Cascading Style Sheets)的缩写混淆,所以将跨站脚本攻击写为XSS
。
一、XSS原理
XSS
是指攻击者通过向Web
页面里面插入客户端脚本,通常是JavaScript
编写的恶意代码,当用户浏览这个被嵌入恶意代码的页面时,就会运行被插入的JavaScript
代码,达到攻击者的目的。
XSS
攻击类似于 SQL
注入攻击,SQL
注入攻击中以SQL
语句作为用户输入,从而达到查询/修改/删除数据的目的。
从上述内容可知,XSS
属于被动式且用于客户端的攻击方式。受害者最终是用户。 不要以为受害者是用户,就认为跟自己的网站、服务器安全没有关系。但请注意,千万不要忘记网站管理人员也属于用户之一,这就意味着 XSS
可以攻击“服务器端”。因为管理员要比普通用户的权限大得多,一般管理员都可以对网站进行文件管理、数据管理等操作,而攻击者就有可能靠管理员身份作为“跳板”实施攻击。
二、XSS类型
XSS
攻击主要分成三类:反射型、存储型、DOM型。
1、反射型XSS
反射型XSS 也被称为 非持久型XSS,是现在最容易出现的一种XSS
漏洞。
当用户访问一个带有XSS
代码的 URL
请求时,服务器端接收数据后处理,然后把带有 XSS
代码的数据发送到浏览器,浏览器解析这段带有 XSS
代码的数据后,最终造成 XSS
漏洞。这个过程就像一次射,故称为反射型XSS。
2、存储型 XSS
存储型 XSS 又被称为 持久性 XSS,存储型 XSS 是最危险的一种跨站脚本。
允许用户存储数据的 Web
应用程序都可能会出现存储型XSS漏洞,当攻击者提交一段 XSS
代码后,被服务器端接收并存储,当攻击者再次访问某个页面时,这段 XSS
代码被程序读出来响应给浏览器,造成XSS
跨站攻击,这就是存储型XSS。
存储型 XSS 与反射型 XSS、DOM 型 XSS相比,具有更高的隐蔽性,危害性也更大。它们之间最大的区别在于反射型 XSS 与DOM 型 XSS 执行都必须依靠用户手动去触发,而存储型XSS 却不需要。
3、DOM型 XSS
DOM
的全称为Document Object Model,即文档对象模型,DOM
通常用于代表在HTML
,XHTML
和XML
中的对象。使用DOM
可以允许程序和脚本动态地访问和更新文档的内容、结构和样式。
通过JavaScript
可以重构整个HTML
页面,而要重构页面或者页面中的某个对象,JavaScript
就需要知道HTML
文档中所有元素的“位置”。而DOM
为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构。根据DOM
规定,HTML
文档中的每个成分都是一个节点。
DOM
的规定如下:
- 整个文档是一个文档节点
- 每个
HTML
标签是一个元素节点 - 包含在
HTML
元素中的文本是文本节点 - 每一个
HTML
属性是一个属性节点 - 节点和节点之间都有等级关系
HTML
的标签都是一个个节点,而这些节点组成了DOM
的整体结构。
简单了解了DOM
后,再来看看 DOM型XSS就比较简单了。
可以发现,DOM
本身就代表文档的意思,而基于DOM型XSS是不需要与服务器端交互的,它只发生在客户端处理数据阶段。
三、总结
XSS
攻击可以简单划分为两类:非持久型XSS攻击和持久型XSS攻击
非持久型XSS攻击:顾名思义,非持久型XSS攻击是一次性的,仅对当次的页面访问产生影响。非持久型XSS攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
持久型XSS攻击:持久型XSS,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。
详细可分为三类:
反射型XSS:经过后端,不经过数据库
存储型XSS:经过后端,经过数据库
DOM型XSS:不经过后端,DOM- XSS是通过url传入参数去控制触发的。
四、解决方法
1、对传入参数的非法的 HTML 代码包括单双引号等进行转义。
2、通过正则表达式过滤传入参数的HTML 标签来防范XSS攻击