<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字元的安全監測帶來了新的挑戰。