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. phpcms 整合 discuz!

    第一步,进入discuz后台,点击UCenter菜单,然后点击应用管理,接着点击右侧的添加新应用按钮 然后填写应用相关信息: 1.应用类型选择“其他” 2.应该名称填写“phpcms” //此处可以自 ...

  2. react native RadioButton(单选按钮)

    刚刚写完这个多选按钮,我觉得没有单选的话,总会觉得有一点点不爽,因为在项目中我也没有用到单选,所以我没有好好研究源码,所以我在Github上找了一下,发现有一个挺好的,简单,不花哨. 在Github上 ...

  3. Good Bye 2016 - B

    题目链接:http://codeforces.com/contest/750/problem/B 题意:地球的子午线长度为40000,两极点的距离为20000.现在你从北极出发,按照题目输入方式来走. ...

  4. 一台电脑安装多个版本的jdk

    我们平时在做Java开发的时候,有时需要使用多个版本的jdk, 那么一台电脑上需要安装多个JDK了. 那一台电脑上可不可以同时安装多个版本的jdk呢? 答案是可以的! 但使用的时候,只能使用一个,不能 ...

  5. ASP.NET中使用UpdatePanel实现局部异步刷新方法和攻略(转)

    asp.net UpdatePanel实现异步局部刷新 如有雷同,不胜荣欣,若转载,请注明 鉴于最近项目需要,研究了一下UpdatePanel控件的使用方法,现总结如下,可能有很多地方不足,还望大家斧 ...

  6. C++: Perfect Forwarding

    Link: Rvalue References and Perfect Forwarding in C++0x (https://www.justsoftwaresolutions.co.uk/cpl ...

  7. POJ 1160 题解

    Post Office Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18835   Accepted: 10158 Des ...

  8. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...

  9. dotnet webapi 中添加Swagger文档

    首先添加"SwaggerGenerator": "1.1.0","SwaggerUi": "1.1.0" 需要注意的是这 ...

  10. 使用git把项目提交到github

    1.需要在https://github.com/注册一个账户 2.注册成功后,新建一个repository,用来存放你要上传的项目,如下图所示 这里你需要输入你的项目的名称,可以对你的项目进行描述,如 ...