不需要字母構建的XSS向量

 之前我在玩一個XSS遊戲的時候突然有了些想法,於是便有了這篇文章。在此,我將分享一個以前沒有接觸過的一個XSS攻擊向量。
相同水平的前提下,在攻擊向量中不使用任何字母,且必須調用alert(1)。
閒話少說,看這裏:

""[(!1+"")[3]+(!0+"")[2]+(''+{})[2]][(''+{})[5]+(''+{})[1]+((""[(!1+"")[3]+(!0+"")[2]+(''+{})[2]])+"")[2]+(!1+'')[3]+(!0+'')[0]+(!0+'')[1]+(!0+'')[2]+(''+{})[5]+(!0+'')[0]+(''+{})[1]+(!0+'')[1]](((!1+"")[1]+(!1+"")[2]+(!0+"")[3]+(!0+"")[1]+(!0+"")[0])+"(1)")()

 

真是一團糟,我們到底做了些什麼呢?接下來容我慢慢給大家道來。

分析

首先從空字符串開始,接下來我們訪問括號而不是我們熟悉的點符號的屬性。

請注意,在接下來的一分鐘我們將構建字符串,不會用到點符號構造字符串名的對象屬性,現在切換到括號。

現在我們訪問的是什麼屬性?下面這個就是“字符串”


         (!1+"")[3]+(!0+"")[2]+(''+{})[2]

 

接下來從!1(false)開始,將“”添加到一個non-String值中是一個快速且直接的方法,所以(!1+””)我們得到false

將字符帶入索引3中的“false”(結果切好是s),在(!0+””)[2]或者“true”[2]再次嘗試,你會得到字母u。最後將字符帶入索引2的字符串“[object Object]”中,你會得到字母b。

不使用任何字母,構造一個字符串來訪問空字符串對象的“sub”屬性,然而sub不僅僅是一個屬性,它還是一個函數!

此時此刻,你可能會認爲我接下來會通過調用String.sub函數破壞過濾。或許這麼做也行,但是我選擇更加有深度的做法,函數有什麼內置屬性?如何構造函數?

如果你打開一個JavaScript控制檯,鍵入“”[“sub”][“constructor”],你看到了什麼?爲什麼得到了Function()函數!似乎我們有事情幹了…

給你點提示:這其中有n

 

((""[(!1+"")[3]+(!0+"")[2]+(''+{})[2]])+"")[2]

 

我們有熟悉的“”[“sub”]:

((""["sub"])+"")[2]

 

向其中增加“”,得到function sub() { [native code] }。將字符帶入索引2得到字母n

總結

我們現在得到了相當於Function()的“”[“sub”][“constructor”],調用它我們就可以定義一個函數了。當我們嘗試調用alert(1)時,就需要連接更多的“true”和“false”來構建alert字符串,其後在加上+”(1)”。

現在我們調用Function(“alert(1)”),大功告成,現在只需一個調用,返回一個匿名函數就可以實現彈出。

 

// empty string""// ["sub"][(!1+"")[3]+(!0+"")[2]+(''+{})[2]]// ["constructor"][(''+{})[5]+(''+{})[1]+((""[(!1+"")[3]+(!0+"")[2]+(''+{})[2]])+"")[2]+(!1+'')[3]+(!0+'')[0]+(!0+'')[1]+(!0+'')[2]+(''+{})[5]+(!0+'')[0]+(''+{})[1]+(!0+'')[1]]// ("alert(1)")(((!1+"")[1]+(!1+"")[2]+(!0+"")[3]+(!0+"")[1]+(!0+"")[0])+"(1)")// call anonymous function returned by Function()()

 

本文最開始的Function(“alert(1)”)()確實十分混亂,不使用任何可識別的字符串確實很難辨識。你可以在地址欄鍵入“javascript:”複製粘貼上面的代碼點擊回車鍵進行測試。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章