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

眾所周知,在XSS的實戰(zhàn)對抗中,由于防守方經(jīng)常會采用各種各樣嚴(yán)格的過濾手段來過濾輸入,所以我們使用的XSS Payload也會根據(jù)實際情況作出各種各樣的調(diào)整,最常見的如避免括號,避免引號,避免關(guān)鍵字等,以繞開過濾函數(shù)的檢查,從而成功將代碼注入到網(wǎng)頁中運行。

在傳統(tǒng)的XSS Payload變形中,常用的無非有以下幾種:

  1. 使用String.fromCharCode來避免關(guān)鍵字,如String.fromCharCode(97,108,101,114,116,40,49,41);

  2. 使用URL編碼來避免括號的識別,如location=’alert%281%29’;

  3. 使用正則對象的特點來避開引號,如alert(/1/);
    在多年的研究中基本上傳統(tǒng)的變形手段都被研究的差不多了,很難找到創(chuàng)新的繞開手段。

然而,近幾年ECMAScript新版本的不斷發(fā)展和推行,在帶來了各種激動人心的語言特性的同時,也不可避免地帶來了一些新的安全挑戰(zhàn)。本文中所說的模板字符串,便是ECMAScript 6草案中的一種新特性。

MDN中所述,模板字符串(Template literals)允許嵌入表達(dá)式,并且支持多行字符串和字符串插補特性。基本語法為以下幾種:

其中第一行為最基本用法,即使用反引號 (‘`’) 來代替普通字符串中的用雙引號和單引號。

第二行為多行字符串用法,即反引號中文本可以直接接受換行而不必使用\n換行符來強制換行。

第三行則為模板字符串的最核心用法,即反引號中的${expression}占位符中expression可以為任意的JavaScript表達(dá)式,甚至為模板字符串。

第四行則為使模板字符串變強大的最主要原因,如果一個模板字符串由表達(dá)式開頭,則該字符串被稱為帶標(biāo)簽的模板字符串,該表達(dá)式通常是一個函數(shù),它會在模板字符串處理后被調(diào)用,在輸出最終結(jié)果前,你都可以在通過該函數(shù)對模板字符串來進(jìn)行操作處理。

第三行的用法我們稱之為“表達(dá)式插補“,在普通字符串中嵌入表達(dá)式時,必須使用如下語法:

現(xiàn)在通過模板字符串,我們可以使用一種更優(yōu)雅的方式來表示:

第四行的用法我們稱之為”帶標(biāo)簽的模板字符串“,模板字符串的一種更高級的形式稱為帶標(biāo)簽的模板字符串。它允許您通過標(biāo)簽函數(shù)修改模板字符串的輸出。標(biāo)簽函數(shù)的第一個參數(shù)是一個包含了字符串字面值的數(shù)組(在本例中分別為“Hello”和“world”);第二個參數(shù),在第一個參數(shù)后的每一個參數(shù),都是已經(jīng)被處理好的替換表達(dá)式(在這里分別為“15”和“50”)。 最后,標(biāo)簽函數(shù)返回處理好的字符串。在后面的示例中,標(biāo)簽函數(shù)的名稱可以為任意的合法標(biāo)示符。

在了解了以上知識后,我們不難發(fā)現(xiàn),對于一個最簡單的XSS Payload:alert(‘A’)來說,我們可以利用上述例子第一行的知識,使用“ `”來代替引號,即成為alert( `A `)。之后,使用第四行的標(biāo)簽用法,我們可以直接去除括號,將alert作為標(biāo)簽,寫成 alert `A `。最后,由于ECMAScript 6中支持直接用碼點(code point)來表示Unicode字符,即直接寫成"反斜杠+u+碼點"。因此為避免alert關(guān)鍵字被識別,我們可以使用Unicode字符來替換alert幾個字符,將payload寫成\u0061\u006c\u0065\u0072\u0074 `A `。 此時最終的payload已經(jīng)完全見不到alert關(guān)鍵字,括號,以及引號了。測試結(jié)果如下:

如果需要將這個payload當(dāng)做字符串作為函數(shù)參數(shù),則可以按照表達(dá)式插補的寫法,直接在外層套一個`\${}`即可,例如:`\${alert `A`}` 或 `\${\u0061\u006c\u0065\u0072\u0074`A`}` 。則console.log(`\${alert `A`}`)也可以彈出。

以上的方法經(jīng)測試,在最新版本的Chrome,F(xiàn)irefox以及Edge瀏覽器中均可以執(zhí)行。我們可以看出,ES6的新方法給我們帶來便利的同時,也給XSS字符的安全監(jiān)測帶來了新的挑戰(zhàn)。