`
sbpya
  • 浏览: 615525 次
  • 性别: Icon_minigender_1
  • 来自: 杭州,长沙
社区版块
存档分类
最新评论

Java script 看看黑客怎么写的 (转)

 
阅读更多

在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例java script 代码: 

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

这是一段完全合法的java script 代码,效果相当于alert(1)。它可以在大部分浏览器上运行。(虽然目前我测试过手头的浏览器都能运行,但理论上不能保证所有浏览器都能正确运行,原因见下文) 

这 段代码的好处(对于黑客)是,它不包含任何字符或数字,可以逃过某些过滤器的检查。比如说,如果假定一个AJAX请求将返回一个只包含数字的JSON,于 是很可能会简单判断了一下其中不含字母就直接eval了,结果给黑客们留下了后门。上面的代码功能很简单,只是alert(1),但使用同样的原理,完全 可以干出更复杂的事,例如alert(document.cookie)。更重要的是,这段代码再一次提醒我,黑客的想象力是无限的……正如Ryan Barnett的演讲标题:"XSS:The only rule is no rule"。 

那么这段代码是如何工作的呢? 

我们可以把它分为两个部分来理解: 
第一部分: 

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

第二部分: 

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

其中第一部分是核心,我们首先对它进行分析,先缩进一下: 

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

显然,最外层是(...)()形式的函数调用,我们需要看看这里究竟调用了什么函数,返回了什么。下一步,我们把原来代码中赋值表达式提取出来,将其改写为以下等价形式: 

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


现在来一行行看: 
1. $先赋值为一个空数组  (后面会被覆盖) 

2. __ = ![] + [] = false + [] = "false"  这里利用了java script 运算的强制类型转换特性。首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时,由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"",因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。  **换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串** 

3. 在计算~[]时,~需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1 


参考: ~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的情况容错。 

通 过第一部分,我们已经获得将任何值转换为字符串的简单方法,并能产生任意的数值,理论上就可以从java script 的取值系统中提取出大部分字母(不知道是不是全部,需要考证)。并且,我们获取到了window的引用。下面就可以开始上下其手,为所欲为了。木哈哈哈哈 哈! 

可以看出,上面的第10步是与浏览器的具体实现相关的,因此也存在着某些浏览器下需要对代码作出修改的可能。 

现在看第二部分,事实上已经非常明朗了,唯一需要注意的是,现在$是一个函数,因此~$ = ~0 (无法直接转换为数字则作为0处理) = -1。 

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

所以,整条式子相当于: 

window["alert"](1)

最后只想再感慨一次:黑客的想象力是无限的。理解代码并不难,问题是一开始时他们是怎么能想出来的 ...

分享到:
评论

相关推荐

    java实现流动雨视觉效果(黑客帝国电影效果)

    java实现流动雨视觉效果(实现黑客帝国电影中雨状效果)

    javarain.java 黑客帝国数字雨

    javarain.java 黑客帝国数字雨 java源代码

    Java实现黑客帝国代码雨

    在Java编程领域,"黑客帝国代码雨"是一个经典的效果,常用于展示程序的动态视觉艺术。这个效果模拟了电影《黑客帝国》中矩阵代码下落的画面。本文将深入探讨如何使用Java来实现这一效果,同时也会涉及一些基础的Java...

    黑客帝国数字雨java程序

    看过黑客帝国,很冲动,学了几天java,写了个简单的数字雨程序。

    一个黑客写的编程教程.php

    一个黑客写的编程 教程.php

    黑客写挂工具包.zip

    黑客写挂工具包.zip

    黑客帝国代码雨-java实现

    在电影《黑客帝国》中,那著名的“代码雨”效果为观众呈现了一种充满未来感的视觉体验。...总之,Java提供了一个强大的平台,让我们能够利用编程创造出各种有趣的视觉效果,包括经典的“黑客帝国代码雨”。

    Java实现黑客帝国代码雨(待机屏保)

    在Java编程语言中,"黑客帝国代码雨"(也称为"Matrix Code")是一种常见的编程艺术展示,灵感来源于电影《黑客帝国》中的经典场景。这个程序通常会模拟电影中绿色字符垂直下落的效果,作为屏幕保护程序或者演示示例...

    仿黑客帝国弹幕雨java

    《仿黑客帝国弹幕雨Java实现详解》 在IT领域,程序员们经常追求创新与独特,以此来展示自己的技术实力。"仿黑客帝国弹幕雨Java"项目就是一个很好的实例,它模仿了电影《黑客帝国》中经典的绿色字符弹幕效果,通过...

    java实现“黑客帝国”中的gui

    本教程将详细介绍如何使用Java来创建一个类似"黑客帝国"黑客入侵效果的GUI。 首先,我们需要导入必要的Java Swing库,它是Java提供的用于构建GUI的框架。在`HeikeScreen.java`文件中,我们可能会看到如下导入语句:...

    黑客帝国二进制数字代码雨代码

    在这个项目中,我们将探讨如何使用Java实现“黑客帝国二进制数字代码雨”。 首先,我们需要了解二进制。二进制是计算机科学的基础,只有两个数字:0和1。在二进制系统中,每个数字位代表一个比特(bit),它是信息...

    黑客攻防技术

    pdf格式 黑客攻防技术电子书 阅读方便

    黑客帝国html前端炫酷效果黑客帝国

    黑客帝国html前端炫酷效果黑客帝国

    黑客帝国数字雨java修改版

    黑客帝国数字雨java修改版. 由于不会用链表,颜色渐变有些问题。只是增加显示宽度。

    Java_黑客新闻的现代安卓客户端.zip

    【标题】: "Java_黑客新闻的现代安卓客户端" 是一个使用Java编程语言开发的安卓应用,旨在为用户带来一个现代化的界面,用于浏览和互动于知名的“黑客新闻”(Hacker News) 社区。这个客户端可能包含了优化的用户体验...

    js黑客帝国代码雨效果源代码,黑客既视感,web优秀课程设计,小白必看!

    js黑客帝国代码雨效果源代码,黑客既视感,web优秀课程设计,小白必看! js黑客帝国代码雨效果源代码,黑客既视感,web优秀课程设计,小白必看! js黑客帝国代码雨效果源代码,黑客既视感,web优秀课程设计,小白必...

    黑客学习必看

    黑客新手学习必看 看到不少刚入门的菜鸟找不到适合自己的hack学习方法,到处碰壁,不但损伤信心和兴趣,而且也耽误了不少高贵的时间和金钱,做了许多无用功,到头来毫无收获。 因此我总结了一下我个人的一些学习...

    超酷屏保黑客专用

    【超酷屏保黑客专用】是一款专为黑客设计的炫酷屏幕保护程序,它结合了科技感和艺术性,旨在为计算机用户提供一种独特的视觉体验。这款屏保不仅外观酷炫,而且在一定程度上反映了黑客文化的魅力,使得电脑在闲置时也...

    黑客01屏保源码

    "黑客01屏保源码"这个标题指的是一个与黑客主题相关的屏幕保护程序的源代码。在IT领域,"黑客"通常指的是技术高手,尤其是那些擅长网络安全和系统破解的人。这里的"屏保"是计算机操作系统中的一种功能,当用户在一段...

    Windows黑客技术揭秘与攻防 C语言篇

    "Windows黑客技术揭秘与攻防 C语言篇" 本资源为 Windows 黑客技术揭秘与攻防的 C 语言篇,涵盖了 Windows 操作系统的黑客技术和攻防策略。通过学习本资源,可以了解 Windows 黑客技术的基本概念和原理,掌握 C 语言...

Global site tag (gtag.js) - Google Analytics