XSS的实质是HTML代码与Javscript代码的注入。但由于XSS的攻击对象是与客户对等的服务端,因此常常不被开发者所重视。
XSS是OWASP Top10中第二普遍的安全问题,存在于近三分之二的应用中。自动化工具能自动发现一些XSS问题,特别是在一些成熟的技术中,如: PHP、J2EE或JSP、ASP.NET。XSS对于反射和DOM的影响是中等的,而对于存储的XSS,XSS的影响更为严重,譬如在受攻击者的浏览器上执行远程代码,例如: 窃取凭证和会话或传递恶意软件等。
一、常见的三种XSS攻击类型
1、反射型 (Reflected XSs)
应用程序或API包含未经验证和未经转义的用户输入,作为HTML输出的一部分。若攻击者攻击成功,可使攻击者在受害者的浏览器中执行任意HTML和JavaScript。通常用户需要与指向攻击者控制的页面的某些恶意链接进行交互,例如恶意漏洞网站广告或类似内容。
2、存储型(Stored XSS)
应用程序或API将未初始化的用户输入存储了下来,之后在其他用户或者管理员的页面展示出来。存储的XSS通常被认为是高风险或严重风险。
3、DOM型(DOM XSS)
DOM:文档对象模型(Document Obiect Model),可以使程序和脚本能够动态访问和更新文档的内容结构以及样式。
DOM就是一个树状的模型,可以编写Javascript代码根据dom一层一层的节点,去遍历/获取/修改对应的节点,对象,值。DOM XSS 取决于输出位置,并不取决于输出环境,因此它既有可能是反射型的,也有可能是存储型的,简单去理解就是因为他输出点在DOM。dom - xss是通过url传入参数去控制触发的,只因为输出地点不同而导致结果不一致。
在网站页面中有许多页面的元素,当页面到达浏览器时浏览器会为页面创建一个顶级的Document object文档对象,接着生成各个子文档对象,每个页面元素对应一个文档对象,每个文档对象包含属性、方法和事件。可以通过JS脚本对文档对象进行编辑从而修改页面的元素。也就是说,客户端的脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。基于这个特性,就可以利用JS脚本来实现XSS漏洞的利用。
二、漏洞产生的原因
典型的XSS攻击可导致:
● 会话窃取
● 重定向到恶意链接
● 绕过MFA (Multi-Factor Authentication,多因子身份证)
● DOM节点替换或损坏 (如特洛伊木马登录面板)
● 对用户浏览器的攻击(例如:恶意软件下载、恶意代码执行)以及其他用户侧的攻击
一般意义上的XSS通常可以用简单的方法检测出来:当用户输入中某个参数的全部或其中一部分,原封不动地在源代码里出现时,我们就可以认为这个参数存在XSS漏洞。
三、如何防御?
防止XSS需要将不可信数据与动态浏览器的内容分离。这可以通过如下步骤实现:
● 使用设计上就会自动编码转义来解决XSS的框架,如: Ruby 3.0 或 React JS。了解每个框架的XSS保护的局限性,并适当地处理未覆盖的用例;
● 为了预防反射型或存储型的XSS漏洞,最好的办法是根据HTML输出的上下文(包括: 主体、属性、JavaScript、CSS或URL) 对所有不可信的HTTP请求数据进行恰当的转义;
● 分析和强化客户端JS代码,特别是受到用户影响的DOM对象,注意能直接修改DOM和创建HTML文件的相关函数或方法;
● 在客户端修改浏览器文档时,为了避免DOM XSS攻击,最好的选择是实施上下文敏感数据编码。避免客户端文档重写、重定向或其他敏感操作,同时避免使用客户端数据,这些操作尽量在服务器端使用动态页面来实现;
● 使用内容安全策略 (CSP) 是对抗XSS的深度防御策略。