Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >消灭 DOM 型 XSS 的终极杀招!

消灭 DOM 型 XSS 的终极杀招!

作者头像
ConardLi
发布于 2024-07-25 02:59:16
发布于 2024-07-25 02:59:16
33600
代码可运行
举报
文章被收录于专栏:code秘密花园code秘密花园
运行总次数:0
代码可运行

大家好,我是 ConardLi

最近发现 Chrome 团队在博客更新了一篇文章,表示 YouTube 要实施 Trusted Types(可信类型)了,要求相关插件的开发者尽快完成改造,不然插件可能就用不了了。

Trusted Types 要求第三方浏览器扩展程序在为 DOM API 赋值时使用类型化对象而不是字符串。自 2024 年 7 月 25 日起,不符合 Trusted Types 安全要求的浏览器扩展程序可能会在强制执行后停止运行,因此我们鼓励相应的开发者遵循 “预防基于 DOM 的跨站点脚本漏洞” 指南,以确保浏览器扩展程序与新的 YouTube 安全标准兼容。

其实 Trusted Types(可信类型)在我之前的文章里也介绍过:

聊一下 Chrome 新增的可信类型(Trusted types)

不过当时它还是一个非常早期的提案,过了很久都没什么动静,我以为要凉凉了,然而最近发现 YouTube 这样大的站点居然都要开始实施它了,说明这个提案已经逐步走向标准化,并且开始被大家所认可了。

今天我们就继续来聊聊 Trusted Types ,看看 YouTube 为什么要求开发者做改造才能继续使用呢?

多年来,DOM XSS 一直是最普遍且最危险的网络安全漏洞之一。

跨站脚本攻击XSS)有两种类型。一些 XSS 漏洞是由服务端代码不安全地拼接构成网站的 HTML 代码引起的。另一些则根源于客户端,即 JavaScript 代码将用户可控的内容传入危险函数。

为了防止服务器XSS,尽量不要通过拼接字符串的方式来生成 HTML。相反,使用安全的上下文自动转义模板库,并结合基于 nonce内容安全策略(Content Security Policy)来进一步减少漏洞。

基于 nonce 的内容安全策略(Content Security Policy),这个可能很多同学理解不了,其实它也是用来防护 XSS 风险的一个非常好的手段,在后面的文章里我会给大家讲解。

而浏览器现在推出的 Trusted Types 就是防护 DOM 型的 XSS 攻击的。

Trusted Types 的工作原理

基于 DOM 的跨站脚本攻击(DOM XSS)一般发生在用户可控的源(如用户名或从 URL 片段中获取的重定向 URL)数据到达一个接收点时,这个接收点是一个可以执行任意 JavaScript 代码的函数(如 eval())或属性设置器(如 .innerHTML)。

Trusted Types 的工作原理就是锁定以下风险接收函数,并且保障这些函数的调用方式,或者传入的参数一定是安全的。

脚本操作:

  • <script src> 和设置 <script> 元素的文本内容。

从字符串生成 HTML:

  • innerHTML
  • outerHTML
  • insertAdjacentHTML
  • <iframe> srcdoc
  • document.write
  • document.writeln
  • DOMParser.parseFromString

执行插件内容:

  • <embed src>
  • <object data>
  • <object codebase>

运行时 JavaScript 代码编译:

  • eval
  • setTimeout
  • setInterval
  • new Function()

Trusted Types 要求我们在将数据传递给这些接收函数之前必须要对其进行处理。

如果仅使用字符串的话就会被阻止,因为浏览器不知道数据是否可信:

❌ 危险的做法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
anElement.innerHTML = location.href;

启用 Trusted Types 后,浏览器会抛出一个 TypeError,并防止使用字符串作为 DOM XSS 接收点。

为了表明数据已被安全处理,需要创建一个特殊对象 —— Trusted Type

✅ 安全的做法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
anElement.innerHTML = aTrustedHTML;

启用 Trusted Types 后,浏览器会要求这些传入的参数必须是 TrustedHTML 对象,另外对于其他的一些敏感接收点,还有 TrustedScriptTrustedScriptURL 对象。

听起来可能有点抽象,我们来举几个具体的例子,下面几种场景会被 Trusted Types 认为是安全的:

1.使用结构化的对象动态创建 DOM ,而不是使用 innerHTML
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
element.textContent = '';
const img = document.createElement('img');
img.src = 'ConardLi.jpg';
element.appendChild(img);
2.使用支持可信类型的三方库处理后的数据:

比如我们可以使用 DOMPurify 清理 HTML 中的危险代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import DOMPurify from 'dompurify';
element.innerHTML = DOMPurify.sanitize(html, {RETURN_TRUSTED_TYPE: true});

DOMPurify 已经支持了可信类型,并返回封装在 TrustedHTML 对象中的经过清理的 HTML,以免浏览器生成违规行为。

另外,这个列表里列举了所有已经和 Trusted Types 集成的开源库:

https://github.com/w3c/trusted-types/wiki/Integrations

3.自己创建可信类型策略

有的时候我们可能没办法移除导致违规的代码,而且也没有任何库可以用来清理危险代码,在这些情况下,我们可以自行创建可信类型对象。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 检查浏览器是否支持 Trusted Types 以及是否可以创建策略
if (window.trustedTypes && trustedTypes.createPolicy) { 
  // 创建一个名为 'myEscapePolicy' 的策略,用于转义 HTML 字符 '<'
  const escapeHTMLPolicy = trustedTypes.createPolicy('myEscapePolicy', {
    createHTML: string => string.replace(/\</g, '&lt;')
  });
}

// 使用上面定义的策略来转义 HTML 字符串
const escaped = escapeHTMLPolicy.createHTML('<img src=x onerror=alert(1)>');

// 验证转义后的结果是否为 TrustedHTML 实例
console.log(escaped instanceof TrustedHTML);  // true

// 将转义后的 HTML 安全地插入到 DOM 中
el.innerHTML = escaped;  // '&lt;img src=x onerror=alert(1)>'

还有一些情况,比从 CDN 加载第三方库时,我们无法更改违规代码。在这种情况下,可以使用默认策略:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (window.trustedTypes && trustedTypes.createPolicy) { // Feature testing
  trustedTypes.createPolicy('default', {
    createHTML: (string, sink) => DOMPurify.sanitize(string, {RETURN_TRUSTED_TYPE: true})
  });
}

如何实施 Trusted Types?

Trusted Types 目前也是基于 CSP 来实施的,我们可以在 CSP Header 中增加下面的指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Content-Security-Policy: require-trusted-types-for 'script'; 

这就表示要求网站上所有以上提到的风险函数,比如符合 Trusted Types 要求才能继续执行,否则就会被拦截。

这也是为什么 YouTube 要求广大插件开发者做相应的安全改造,因为这些插件往往有很多更改 DOM 的操作,如果不按照 Trusted Types 的要求进行改造,插件就可能挂掉。

当前,直接增加这个指令,特别是对于一些比较老的网站,可能会带来一些负面影响,我们也不确定一次性是不是可以改的全,所以一般我们会先使用 Report Only 模式进行观察:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Content-Security-Policy-Report-Only: require-trusted-types-for 'script'; report-uri //my-csp-endpoint.example

通过配置 report-uri 或者 Reporting API ,我们可以先在浏览器检测到违规行为时上报到我们提供的一个服务器,而不是直接进行拦截,上报的格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
"csp-report": {
    "document-uri": "https://www.conardli.top",
    "violated-directive": "require-trusted-types-for",
    "disposition": "report",
    "blocked-uri": "trusted-types-sink",
    "line-number": 17,
    "column-number": 17,
    "source-file": "https://www.conardli.top/script.js",
    "status-code": 0,
    "script-sample": "Element innerHTML <img src=x"
}
}

这表示在 https://www.conardli.top/script.js 的第 17 行中,使用以 <img src=x 开头的字符串调用了 innerHTML

Trusted Types 断点

为了方便开发者进行调试,Chrome Devtools 还专门提供了用于 Trusted Types 的断点:

Sources 选项卡的 Breakpoints 窗格中,转到 CSP Violation Breakpoints 部分并启用以下选项之一或同时启用这两个选项,然后执行代码:

勾选 Sink Violations

勾选 Policy Violations

Trusted Types Polifill

ES5 / ES6 版本可以直接在浏览器中加载。浏览器 polyfill 有两种提供方式 - api_only (light)fullapi_only 定义了 API,我们可以用来创建策略和类型。完整版本还基于从当前文档推断的 CSP 策略,在 DOM 中启用类型强制。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- API only -->
<script src="https://w3c.github.io/webappsec-trusted-types/dist/es5/trustedtypes.api_only.build.js"></script>
<script>
     const p = trustedTypes.createPolicy('foo', ...)
     document.body.innerHTML = p.createHTML('foo'); // works
     document.body.innerHTML = 'foo'; // but this one works too (no enforcement).
</script>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!-- Full -->
<script src="https://w3c.github.io/webappsec-trusted-types/dist/es5/trustedtypes.build.js" data-csp="trusted-types foo bar; require-trusted-types-for 'script'"></script>
<script>
    trustedTypes.createPolicy('foo', ...);
    trustedTypes.createPolicy('unknown', ...); // throws
    document.body.innerHTML = 'foo'; // throws
</script>

在 Node.js 环境中,也提供了专门的 NPM 包:

安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ npm install trusted-types

使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const tt = require('trusted-types'); // or import { trustedTypes } from 'trusted-types'

最后

参考:

  • https://github.com/w3c/trusted-types
  • https://web.dev/articles/trusted-types
  • https://developer.chrome.com/blog/trusted-types-on-youtube
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 code秘密花园 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
聊一下 Chrome 新增的可信类型(Trusted types)
Chrome 即将在 83 版本新增一个可信类型(Trusted types),其号称这一特性可以全面消除 DOM XSS,为此我连夜分析了一波,下面我就带大家来具体看一下这个特性:
ConardLi
2020/05/08
2.9K0
聊一下 Chrome 新增的可信类型(Trusted types)
WEB攻击与安全策略
恶意代码未经过滤,与网站正常的代码混在一起,浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。
且陶陶
2023/04/12
9920
WEB攻击与安全策略
XSS分析及预防
XSS(Cross Site Scripting),又称跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。在WEB前端应用日益发展的今天,XSS漏洞尤其容易被开发人员忽视,最终可能造成对个人信息的泄漏。如今,仍然没有统一的方式来检测XSS漏洞,但是对于前端开发人员而言,仍是可以在某些细微处避免的,因此本文会结合笔者的学习和经验总结解决和避免的一些方案,并简要从webkit内核分析浏览器内核对于XSS避免所做的努力,了解底层基础设施对预防XSS所做的贡献。 XSS的种类和特点 此处不详细讲解XSS的一
欲休
2018/03/15
1.3K0
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析EXP以及 如何防御和修复(1)———— 作者:LJS
我们先分析代码,正则表达式过滤了什么,()`\并且是全局过滤,这样一来,不能使用()就对弹窗很不利,那么我首先想到的办法就是编码,利用编码绕过
盛透侧视攻城狮
2024/10/21
2830
2024全网最全面及最新且最为详细的网络安全技巧 七之 XSS漏洞典例分析EXP以及 如何防御和修复(1)———— 作者:LJS
告别 XSS!新的 W3C 提案助你安全操作 DOM
Sanitizer API 是一个新的提案,目标是构建一个强大的处理器,以便将任意字符串更安全地插入到 HTML 页面。
ConardLi
2021/10/19
7830
告别 XSS!新的 W3C 提案助你安全操作 DOM
AngularDart 4.0 高级-安全
本页面介绍了Angular内置的针对常见的Web应用程序漏洞和跨站脚本攻击等攻击的内置保护。 它不包括应用程序级别的安全性,如身份验证(此用户是谁?)和授权(此用户可以做什么?)。
南郭先生
2018/08/14
3.8K0
AngularDart 4.0 高级-安全
为什么你的网页需要 CSP?
内容安全策略(CSP)是一个 HTTP Header,CSP 通过告诉浏览器一系列规则,严格规定页面中哪些资源允许有哪些来源, 不在指定范围内的统统拒绝。
ConardLi
2020/05/07
3.4K1
XSS 攻击与防御
XSS(跨站脚本攻击,Cross-site scripting,它的简称并不是 CSS,因为这可能会与 CSS 层叠样式表重名)是一种常见的 web 安全问题。XSS 攻击手段主要是 “HTML 注入”,用户的数据被当成了 HTML 代码一部分来执行。
多云转晴
2020/04/27
4K0
前端安全防护:XSS、CSRF攻防策略与实战
跨站脚本攻击(XSS)和跨站请求伪造(CSRF)是威胁用户数据安全和网站稳定性的两大主要风险。在本文中,我将深入剖析这两种攻击方式的特点与危害,介绍针对性的防御策略,并通过代码示例演示如何在实际开发中有效实施这些防护措施。
Jimaks
2024/04/16
7210
CSP | Electron 安全
大家好,今天和大家讨论的是 CSP ,即内容安全策略。相信很多朋友在渗透测试的过程中已经了解过 CSP 了
意大利的猫
2024/04/28
6550
CSP | Electron 安全
防XSS的利器,什么是内容安全策略(CSP)?
内容安全策略(CSP),是一种安全策略,其原理是当浏览器请求某一个网站时,告诉该浏览器申明文件可以执行,什么不可以执行。CSP是专门解决XSS攻击而生的神器。 CSP的引入会使得我们的引入扩展程序更加安全,并且可以由开发者指定可以加载扩展程序的类型,避免恶意的脚本在浏览器中执行,造成信息泄露问题。
房东的狗丶
2023/02/17
2.2K0
web安全之XSS实例解析
跨站脚本攻击(Cross Site Script),本来缩写是 CSS, 但是为了和层叠样式表(Cascading Style Sheet, CSS)有所区分,所以安全领域叫做 “XSS”;
前端迷
2020/07/03
1.4K0
web安全之XSS实例解析
[ Security ] WEB安全(一)之图解XSS注入
xxs 攻击英文全称是 Croess SiteScripting ,意思就是跨站脚本攻击。是一种网站应用程序的安全漏洞攻击。是脚本代码注入的一种。其核心的攻击原理就是注入有攻击行为的脚本代码,通过浏览器的执行从而完成攻击行为。
GavinUI
2021/04/14
2.1K0
[ Security ] WEB安全(一)之图解XSS注入
TCTF/0CTF2018 XSS Writeup
刚刚4月过去的TCTF/0CTF2018一如既往的给了我们惊喜,其中最大的惊喜莫过于多道xss中Bypass CSP的题目,其中有很多应用于现代网站的防御思路。
Seebug漏洞平台
2018/04/19
3.8K1
TCTF/0CTF2018 XSS Writeup
Web安全
跨站脚本攻击,Cross-site Script,简称 XSS(因CSS与样式脚本命名一样)。 是一种代码注入攻击。攻击者想尽一切办法,在网站上注入恶意脚本,使之在用户的浏览器上运行,当用户访问该网站的时候浏览器执行该脚本 攻击者可通过恶意脚本的执行窃取用户的Session、Cookie等敏感信息,进而危害数据安全。
epoos
2022/06/06
7330
如何进行渗透测试XSS跨站攻击检测
国庆假期结束,这一节准备XSS跨站攻击渗透测试中的利用点,上一节讲了SQL注入攻击的详细流程,很多朋友想要咨询具体在跨站攻击上是如何实现和利用的,那么我们Sinesafe渗透测试工程师为大家详细的讲讲这个XSS是如何实现以及原理。
技术分享达人
2019/10/08
2.8K0
如何进行渗透测试XSS跨站攻击检测
XSS 攻击案例
XSS 攻击指的是攻击者通过在受信任的网站上注入恶意的脚本,使得用户的浏览器在访问该网站时执行这些恶意脚本,从而导致信息泄露等安全问题。
Jimmy_is_jimmy
2023/10/16
5140
XSS 攻击案例
通过代码重用攻击绕过现代XSS防御
XSS已有近二十年的历史了,但它仍然是Web上最常见的漏洞之一。因此,已经发展了许多机制来减轻漏洞的影响。我经常会误以为这些机制可以作为针对XSS的保护。今天,我们将了解为什么情况并非如此。我们将在代码重用攻击领域探索一种相对较新的技术。Web的代码重用攻击于2017年首次描述,可用于绕过大多数现代浏览器保护,包括:HTML sanitizers,WAF和CSP。
FB客服
2020/05/14
2.7K0
通过代码重用攻击绕过现代XSS防御
跨站脚本攻击—XSS
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
FEWY
2019/09/18
1.7K0
跨站脚本攻击—XSS
XSS防御速查表
一、介绍 本文提供了一种通过使用输出转义/编码来防止XSS攻击的简单有效模型。尽管有着庞大数量的XSS攻击向量,依照下面这些简单的规则可以完全防止这种攻击。这篇文章不会去研究XSS技术及业务上的
奶糖味的代言
2018/04/16
5.1K0
XSS防御速查表
相关推荐
聊一下 Chrome 新增的可信类型(Trusted types)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验