日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

XSS中JavaScript加密以及Filter bypass

發布時間:2025/3/17 javascript 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XSS中JavaScript加密以及Filter bypass 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

????????????????轉載于http://www.iteye.com/topic/947149



在2011年的BlackHat DC 2011大會上Ryan Barnett給出了一段關于XSS的示例javascript代碼:

????Javascript代碼

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

這是一段完全合法的javascript代碼,效果相當于alert(1)。它可以在大部分瀏覽器上運行。(雖然目前我測試過手頭的瀏覽器都能運行,但理論上不能保證所有瀏覽器都能正確運行,原因見下文)


這段代碼的好處(對于***)是,它不包含任何字符或數字,可以逃過某些過濾器的檢查。比如說,如果假定一個AJAX請求將返回一個只包含數字的 JSON,于是很可能會簡單判斷了一下其中不含字母就直接eval了,結果給***們留下了后門。上面的代碼功能很簡單,只是alert(1),但使用同樣 的原理,完全可以干出更復雜的事,例如alert(document.cookie)。更重要的是,這段代碼再一次提醒我,***的想象力是無限的……正如 Ryan Barnett的演講標題:"XSS:The only rule is no rule"。


那么這段代碼是如何工作的呢?


我們可以把它分為兩個部分來理解:


第一部分:

Javascript代碼 ?

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

  • 第二部分:

    Javascript代碼 ?

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

  • 其中第一部分是核心,我們首先對它進行分析,先縮進一下:

    ????Javascript代碼 ?

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

  • 顯然,最外層是(...)()形式的函數調用,我們需要看看這里究竟調用了什么函數,返回了什么。下一步,我們把原來代碼中賦值表達式提取出來,將其改寫為以下等價形式:

    ????Javascript代碼 ?

  • $?=?[];?//1?? __?=?!$+$;?//2?? _?=?-~-~-~$;?//3?? $_=!''+$;??//4?? $$?=?$_[_/_]?+?$_[+$];??//5??$=?[$][??__[_]?+??//6??({}+$)[_/_]?+??//7??$$??//8??];??//9??$();?//10


  • 現在來一行行看:
    1. $先賦值為一個空數組? (后面會被覆蓋)

    2.__?=?![]?+?[]?=?false?+?[]?=?"false"這里利用了javascript運算的強制類型轉換特性。首先空數組是一個非null值,因此![]的結果是false(布爾型)。在計算false?+?[]時,由于數組對象無法與其他值相加,在加法之前會先做一個toString的轉換,空數組的toString就是"",因此事實上在計算false + ""。這時false被自動轉換為字符串。最終結果是"false"+"" = "false"。? **

    換句話說,在$為空數組時,使用 “+$”的方式可以將任何一個值轉為字符串**

    3. 在計算~[]時,~需要一個數字操作數,空數組無法直接轉換為數字,則作為0處理。因此~[]?=?~0?=?-1

    ????Java代碼 ?

  • 參考:?? ~3?=?-4?? ~[3]?=?-4?? ~[3,2]?=?-1??(無法轉為數字)?? ~"3"?=?-4?? ~"abc"?=?-1

  • 因此:

    _?=?-~-~-~[]?=?-~-~-(-1)?=?-~-~1?=?-~-(-2)?=?-~2?=?-(-3)?=?3

    ? 理論上,可以用這種方式得出1-9所有數字

    4. !''是true,使用+$將其變為字符串 "true"

    5. 這里需要注意的是,之前一直用“值+[]”來獲得“值”的字符串形式。而“+[]”則是0(正號導致[]被自動轉換為數值0)。因此:$$?=?"true"[3/3]?+?"true"[+[]]?=?"true"[1]?+?"true"[0]?=?"rt"


    6.__[_]?=?"false"[3]?=?"s"


    7. ({} + [])導致空對象{}被轉換為字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o"

    9. 這里把$覆蓋為[[]]["s"+"o"+"rt"]。注意這里[[]]本身是一個包含空數組的數組,其實對這一步來說,任何一個數組都沒有關系(不一定要是嵌套數組),但作者巧妙地把$的首次賦值式放在了數組內部,使代碼更為緊湊。最終結果是$?=?[[]]["sort"]?=?[[]].sort?=?Array.prototype.sort


    10. 調用$(),作為整個表達式最終的取值。需要注意,$是全局范圍的,是window的一個屬性,相當于window.$。而Array.prototype.sort會返回this。對于window.$來說,this就是window。因此,整個第一部分的值,就是window本身!當然,這個過程的正確運作依賴于當前瀏覽器Array.prototype.sort實現能對this為window的情況容錯。

    通過第一部分,我們已經獲得將任何值轉換為字符串的簡單方法,并能產生任意的數值,理論上就可以從javascript的取值系統中提取出大部分 字母(不知道是不是全部,需要考證)。并且,我們獲取到了window的引用。下面就可以開始上下其手,為所欲為了。木哈哈哈哈哈!

    可以看出,上面的第10步是與瀏覽器的具體實現相關的,因此也存在著某些瀏覽器下需要對代碼作出修改的可能。

    現在看第二部分,事實上已經非常明朗了,唯一需要注意的是,現在$是一個函數,因此~$ = ~0 (無法直接轉換為數字則作為0處理) = -1。

    ????Javascript代碼 ?

    [__[_/_]+__[_+~$]+$_[_]+$$](_/_)?=?["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1)?=?["a"+"l"+"e"+"rt"](1)


    所以,整條式子相當于:

    ????Javascript代碼 ?

    window["alert"](1)

    轉載于:https://blog.51cto.com/fy20000/1742860

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的XSS中JavaScript加密以及Filter bypass的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。