反射型XSS (Reflected XSS)
当web应用在搜索结果,错误消息或其他响应返回用户输入时,就会发生反射型XSS。最常见的做法
是攻击者利用web应用的xss漏洞,构造一个url,通过邮件短信等方式诱导用户点击,当请求发出后,
web应用返回url中隐藏的恶意代码,并在用户浏览器中执行,从而发生发射型XSS。
存储型XSS (Stored XSS)
当web应用未对用户输入进行安全校验时,恶意代码可能会被输入并存储到服务器的数据库,当其他用户
浏览相关页面时,恶意代码就会从数据库中取出,并发送到用户浏览器中进行执行,从而形成多用户,
持久性的攻击,从而形成存储型xss。
基于Dom的XSS (Dom Based XSS)
数据源在Dom中,接收器也在Dom中,数据流不会离开浏览器。数据源可能是页面的URL,也可能是HTML
的一个元素,最常见的是来自ajax请求返回响应数据。 而接收器则是一个敏感的方法调用, 比如
Element.innerHTML, document.write, eval等它会导致 执行恶意的数据。
服务端XSS (Server XSS)
当恶意代码包含在服务器生成的HTTP响应中时,就会发生服务端XSS。此恶意代码数据可能来自请求,
也可能来自数据库存储,因此服务端XSS,即可能包含反射型XSS,也可能包含存储型XSS。
这种情况,整个漏洞都在服务端代码中,浏览器只是响应并执行嵌入其中的任何有效脚本。
客户端XSS (Client XSS)
当使用不受信任的用户提供的数据通过不安全的javascript调用更新Dom时,就会发生客户端XSS。
此数据的来源可能来自Dom,也可能是服务器发送的。数据的最终来源可能来自请求,或者来自客户端
或服务器上的存储位置。因此客户端XSS可能具有反射型XSS,也可能包含存储型XSS。基于Dom的XSS只是
客户端XSS的一个子集,其数据源来自于Dom中的某个位置而不是服务器。
XSS 分类矩阵
| XSS | 服务端 | 客户端 |
|-----|-----|-----|
| 存储型 | 服务端存储型XSS | 客户端存储型XSS |
| 反射型 | 服务端反射型XSS | 客户端反射型XSS |
服务端XSS防御
服务端XSS是由在HTML响应中包含不受信任的数据引起的,因此在大多数情况下,针对服务端XSS
最简单和最强的防御是:上下文相关的服务器端输出编码。(HTML实体编码,javascript编码,url编码)
客户端XSS防御
当使用不受信任的数据通过不安全的javascript调用更新Dom时,会导致客户端XSS。针对客户端XSS最
简单和最强的防御是:使用安全的javascript API。
如果某个javascrpt API 是不安全的(eval ), 则建议找到替代的安全方法来使用(JSON.parse).
如果由于某种原因无法使用安全的替代方法,则可以在浏览器中完成上下文相关的输出编码,然后将
该数据传递给不安全的javascript 方法。