ES6中的模板字符串和新XSS Payload

众所周知,在XSS的实战对抗中,由于防守方经常会采用各种各样严格的过滤手段来过滤输入,所以我们使用的XSS Payload也会根据实际情况作出各种各样的调整,最常见的如避免括号,避免引号,避免关键字等,以绕开过滤函数的检查,从而成功将代码注入到网页中运行。

在传统的XSS Payload变形中,常用的无非有以下几种:

  1. 使用String.fromCharCode来避免关键字,如String.fromCharCode(97,108,101,114,116,40,49,41);

  2. 使用URL编码来避免括号的识别,如location=’alert%281%29’;

  3. 使用正则对象的特点来避开引号,如alert(/1/);

    在多年的研究中基本上传统的变形手段都被研究的差不多了,很难找到创新的绕开手段。

然而,近几年ECMAScript新版本的不断发展和推行,在带来了各种激动人心的语言特性的同时,也不可避免地带来了一些新的安全挑战。本文中所说的模板字符串,便是ECMAScript 6草案中的一种新特性

MDN中所述,模板字符串(Template literals)允许嵌入表达式,并且支持多行字符串和字符串插补特性。基本语法为以下几种:

其中第一行为最基本用法,即使用反引号 (‘`’) 来代替普通字符串中的用双引号和单引号。

第二行为多行字符串用法,即反引号中文本可以直接接受换行而不必使用\n换行符来强制换行。

第三行则为模板字符串的最核心用法,即反引号中的${expression}占位符中expression可以为任意的JavaScript表达式,甚至为模板字符串。

第四行则为使模板字符串变强大的最主要原因,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以在通过该函数对模板字符串来进行操作处理。

第三行的用法我们称之为“表达式插补“,在普通字符串中嵌入表达式时,必须使用如下语法:

现在通过模板字符串,我们可以使用一种更优雅的方式来表示:

第四行的用法我们称之为”带标签的模板字符串“,模板字符串的一种更高级的形式称为带标签的模板字符串。它允许您通过标签函数修改模板字符串的输出。标签函数的第一个参数是一个包含了字符串字面值的数组(在本例中分别为“Hello”和“world”);第二个参数,在第一个参数后的每一个参数,都是已经被处理好的替换表达式(在这里分别为“15”和“50”)。 最后,标签函数返回处理好的字符串。在后面的示例中,标签函数的名称可以为任意的合法标示符。

在了解了以上知识后,我们不难发现,对于一个最简单的XSS Payload:alert(‘A’)来说,我们可以利用上述例子第一行的知识,使用“ `”来代替引号,即成为alert( `A `)。之后,使用第四行的标签用法,我们可以直接去除括号,将alert作为标签,写成 alert `A `。最后,由于ECMAScript 6中支持直接用码点(code point)来表示Unicode字符,即直接写成"反斜杠+u+码点"。因此为避免alert关键字被识别,我们可以使用Unicode字符来替换alert几个字符,将payload写成\u0061\u006c\u0065\u0072\u0074 `A `。 此时最终的payload已经完全见不到alert关键字,括号,以及引号了。测试结果如下:

如果需要将这个payload当做字符串作为函数参数,则可以按照表达式插补的写法,直接在外层套一个`\${}`即可,例如:`\${alert `A`}` 或 `\${\u0061\u006c\u0065\u0072\u0074`A`}` 。则console.log(`\${alert `A`}`)也可以弹出。

以上的方法经测试,在最新版本的Chrome,Firefox以及Edge浏览器中均可以执行。我们可以看出,ES6的新方法给我们带来便利的同时,也给XSS字符的安全监测带来了新的挑战。

作者:负羽,更多安全类文章,请访问阿里聚安全博客

ES6中的模板字符串和新XSS Payload的更多相关文章

  1. es6 中的 模板字符串

    Template literals are string literals allowing embedded expressions. You can use multi-line strings ...

  2. ES6中的模板字符串使用方法

    传统的 JavaScript 语言,输出模板通常是这样写的. $('#result').append( 'There are <b>' + basket.count + '</b&g ...

  3. ES6中的模板字符串---反引号``

    在react中,反引号``有特殊的含义. 如MDN中所述,模板字符串(Template literals)允许嵌入表达式,并且支持多行字符串和字符串插补特性.基本语法为以下几种: 其中第一行为最基本用 ...

  4. es6学习笔记--模板字符串

    这几天简单看了一下深入浅出es6这本书,感觉特实用,学习了一个新特性---模板字符串在项目开发中,拼接字符串是不可缺少的,动态创建dom元素以及js操作数据都要拼接字符串,在es6出来之前,我们都通常 ...

  5. es6中的模版字符串

    目录 字符串拼接 includes() startsWith() endsWith() padStart() es6中的模版字符串替代了原有的字符串拼接功能. 字符串拼接 es5方式 传统的字符串拼接 ...

  6. ES6 Template String 模板字符串

    模板字符串(Template String)是增强版的字符串,用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量. 大家可以先看下面一段代码: $(&quo ...

  7. ES6中新增的字符串方法

    实例方法:includes(), startsWith(), endsWith() 传统上,JavaScript 只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6 又提供 ...

  8. ES6中有关数组的一些新操作

    1.Array.isArray() 用于确定传递的值是否是一个 Array. Array.isArray([1, 2, 3]); // true Array.isArray({foo: 123}); ...

  9. es6的新特性--模板字符串

    这几天简单看了一下深入浅出es6这本书,感觉特实用,学习了一个新特性---模板字符串在项目开发中,拼接字符串是不可缺少的,动态创建dom元素以及js操作数据都要拼接字符串,在es6出来之前,我们都通常 ...

随机推荐

  1. Kafka基本原理

    简介 Apache Kafka是分布式发布-订阅消息系统.它最初由LinkedIn公司开发,之后成为Apache项目的一部分.Kafka是一种快速.可扩展的.设计内在就是分布式的,分区的和可复制的提交 ...

  2. js对象克隆方法

    方法1: function clone(obj){ var o; switch(typeof obj){ case 'undefined': break; case 'string' : o = ob ...

  3. 【leetcode】Isomorphic Strings

    题目简述: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the ...

  4. 前端试题本(Javascript篇)

    JS1. 下面这个JS程序的输出是什么:JS2.下面的JS程序输出是什么:JS3.页面有一个按钮button id为 button1,通过原生的js如何禁用?JS4.页面有一个按钮button id为 ...

  5. 2 Unique Binary Search Trees II_Leetcode

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  6. CPPFormatLibary提升效率的优化原理

    CPPFormatLibary,以下简称FL,介绍:关于CPPFormatLibary. 与stringstream,甚至C库的sprintf系列想比,FL在速度上都有优势,而且是在支持.net格式化 ...

  7. 更改pip安装源的镜像解决安装总是timeout的情况

    由于国外的pip源总是由于各种原因不能被访问或者网速过慢,而造成的timeout错误 解决方法是修改pip的配置文件(如果没有配置文件在相应的地方新建,配置文件的路径和名字参考这里),设置安装包时候访 ...

  8. 盘点销售一体机 打印POS一体的设备。 打印,盘点,销售PDA(手持终端)+移动销售POS软件

    一.产品介绍 本产品为一个PDA(手持终端)+移动销售POS管理软件组合.可以实现功能如下: 可以实现移动销售(销售退货).盘点.配送.移库.打印小票的功能. 销售时,可以选择客户.业务员.库房,并且 ...

  9. 2016多校联合训练4 F - Substring 后缀数组

    Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...

  10. Json格式示意图

    json视图工具:http://www.bejson.com/jsonviewernew/ 一.Json格式化,(看到数组里面又有数组一下子疑问不是合格json):尾门地址查询: =>=> ...