IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

一段Javascript的代码

酷壳 - CoolShell.cn 2011-02-14 21:26:04 累计浏览 4,312 次
本机暂存

    我们先看一段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的检查。

    同分类推荐文章

    1. 绿盟科技《APT组织研究年鉴》(2026 版)正式发布 (2026-06-16 20:21:10)
    2. 【已复现】Linux内核Fragnesia权限提升漏洞(CVE-2026-46300) (2026-06-15 10:53:58)
    3. 企业文档安全最佳实践(二):给文档上“身份证”——手动标密与智能自动标密 (2026-06-12 17:18:33)

    查看更多 安全 文章 →

    建议继续学习

    1. JQuery实现Excel表格呈现 (累计阅读 48,333)
    2. 深入理解Javascript之执行上下文(Execution Context) (累计阅读 18,384)
    3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,909)
    4. 图片动态局部毛玻璃模糊效果的实现 (累计阅读 14,828)
    5. 天朝第二代身份证号码的验证机制 (累计阅读 14,748)
    6. HTML 5 的data-* 自定义属性 (累计阅读 14,329)
    7. 分享一个JQUERY颜色选择插件 (累计阅读 14,208)
    8. 什么是全栈工程师? (累计阅读 14,016)
    9. 快速排序(Quicksort)的Javascript实现 (累计阅读 11,713)
    10. 7 天打造前端性能监控系统 (累计阅读 11,171)