一段Javascript的代碼

作者: coolshell  發布時間: 2011-01-31 13:04  閱讀: 848 次  推薦: 2   原文鏈接   [收藏]  

  我們先看一段Javascript的代碼,如下所示:(你能看出來這是干什么的?)

 
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+
($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__
[_
+~$]+$_[_]+$$](_/_)

  這段代碼來自BlackHat DC 2011((黑帽安全大會,全世界最大兩個黑客大會之一,另一個是Defcon)中的一個叫Ryan Barnett黑客做的XSS Street-Fight!的演講(XSS是Web上比較經典的跨站式攻擊,操作起來也有些復雜),一共69頁,基本上都是一些比較枯燥的Javascript,不過這段代碼挺有意思的,如果上面這段代碼換個樣子:

 
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+
($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__
[_
+~$]+$_[_]+$$](document.cookie)

  你看到了document.cookie,于是你可能會想到這是偷用戶帳號免登錄cookie的。是的,就是這樣。答案是,這代碼等價于alert(document.cookie),而最上面的那個代碼等價于alert(1)——當然,還不僅僅只是alert。看到這里,你可能會想起變態的C語言Hello World程序,以及如何加密/混亂C源代碼,是的,這回的這個是Javascript版的,混亂Javascript的會比混亂C的更難懂,因為Javascript的變量類型是可以亂用的。

  好,下面讓我們來對這個代碼做個解析。

  首先,我們先明確一點,在Javascript和C中,混亂后的代碼都是要使用一個或多個下劃線(_)來當變量名使用的,所以,請把其中的下劃線看成變量名。

  其次,這段代碼可以分成兩個部分,第一個部門其實就是sort(),第二個部分才是alert():

 
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+
($$=($_=!''+$)[_/_]+$_[+$])])()
 
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)

  我們來看看細節的解釋。

  • $=[] 是一個空數組
  • $=[$=[]] 是一個引用空數組的數組。所以 $ 的解引用就是數字 0。
  • __ =  (__ = !$ + $ )   等價于字符串”false”
  • _ = -~-~-~$    中~是位運算符“非”,~$等于-1,所以-~$ 就是+1,基本上來說,~N就是 -(N+1),所以這個表達式的值為3。
  • 因為_ = 3,所以 _/_ = 3/3 = 1

  于是:

  • (__ = !$ + $ )[ _ = -~-~-~$]
  • (“false”)[_]
  • (“false”)[3]
  • “false”[3] = s

  而:

  • ({} + $)[_/_]
  • (” object”)[_/_]
  • (” object”)[1]
  • ” object”[1] = o

  再來:

  • $ = ( $_ = !” + $)[_/_]
  • $ = ( “true”)[1]
  • “true”[1] = r

  最后:

  • $_[+$] = “true”[0] = t

  因為:

  • ($$ = ( $_ = !” + $)[_/_] + $_[+$] ))

  所以我們可以經過下面的推算得出$$的值:

  • !” = “true”
  • $_ = (true)
  • $_[1] = r
  • $_[0] = t
  • $$ = rt

  所以第一部分就成了 sort(),也就是以下的代碼:

 
($ = [ $=[]] ["s" + "o"+ "r"+ "t" ] )()

  Sort 接受一個作為函數的參數來運行,從而執行了第二部份。

 
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)

  我們知道:

  • $ = 0
  • _ = 3
  • __ = “false”
  • $! = “true”
  • $$ = “rt”

  [__[_/_]+__[_+~$]+$_[_]+$$](_/_)

  等價于:
  [__[1] + __[3 + -1] + $![3] + $$)(1);

  等價于:
  ["false"[1] + “false”[3 + -1 ] + “true”[3] + “rt”] (1)

  等價于:
  [ a + l + e + r + t ](1)

  等價于:
  alert(1)

  就是這樣!于是這段代碼可能繞過你的一些對Javascript的檢查。

2
0
 
標簽:Javascript
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()