<b>es6中的模板字符串和新xss payload</b>
<b></b>
<b>作者:负羽</b>
众所周知,在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草案中的一种新特性。
其中第一行为最基本用法,即使用反引号 (‘`’) 来代替普通字符串中的用双引号和单引号。
第二行为多行字符串用法,即反引号中文本可以直接接受换行而不必使用\n换行符来强制换行。
第三行则为模板字符串的最核心用法,即反引号中的${expression}占位符中expression可以为任意的javascript表达式,甚至为模板字符串。
第四行则为使模板字符串变强大的最主要原因,如果一个模板字符串由表达式开头,则该字符串被称为带标签的模板字符串,该表达式通常是一个函数,它会在模板字符串处理后被调用,在输出最终结果前,你都可以在通过该函数对模板字符串来进行操作处理。
第三行的用法我们称之为“表达式插补“,在普通字符串中嵌入表达式时,必须使用如下语法:
现在通过模板字符串,我们可以使用一种更优雅的方式来表示:
第四行的用法我们称之为”带标签的模板字符串“,模板字符串的一种更高级的形式称为带标签的模板字符串。它允许您通过标签函数修改模板字符串的输出。标签函数的第一个参数是一个包含了字符串字面值的数组(在本例中分别为“hello”和“world”);第二个参数,在第一个参数后的每一个参数,都是已经被处理好的替换表达式(在这里分别为“15”和“50”)。 最后,标签函数返回处理好的字符串。在后面的示例中,标签函数的名称可以为任意的合法标示符。
如果需要将这个payload当做字符串作为函数参数,则可以按照表达式插补的写法,直接在外层套一个`${}`即可,例如:`${alert `a`}` 或 `${\u0061\u006c\u0065\u0072\u0074`a`}` 。则console.log(`${alert `a`}`)也可以弹出。
以上的方法经测试,在最新版本的chrome,firefox以及edge浏览器中均可以执行。我们可以看出,es6的新方法给我们带来便利的同时,也给xss字符的安全监测带来了新的挑战。