在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)
最后只想再感慨一次:黑客的想象力是无限的。理解代码并不难,问题是一开始时他们是怎么能想出来的 ...
- 浏览: 615532 次
- 性别:
- 来自: 杭州,长沙
最新评论
-
50854319:
elements[i] = tagArr[i]; 这个需要修改 ...
document.getElementsByName在IE下的bug解决 -
mengsina:
通过楼主的介绍,能够启动client了。但是又遇到了cisco ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
zzz_robinson:
谢谢,关闭-启动-启动。这个循序对的,否则每次都提示服务没打开 ...
(转)Cisco Systems, Inc. VPN使用过程中常见问题解决方案 -
wuchunjiesp:
总算解决了,THANK楼主,空值问题是TYPE里面参数类型定义 ...
(原创)Ibatis2调用数据库存储过程的相关示例 -
wuchunjiesp:
存储里面是这样的
FOR I IN 1..P_GOODSDI ...
(原创)Ibatis2调用数据库存储过程的相关示例
相关推荐
java实现流动雨视觉效果(实现黑客帝国电影中雨状效果)
javarain.java 黑客帝国数字雨 java源代码
在Java编程领域,"黑客帝国代码雨"是一个经典的效果,常用于展示程序的动态视觉艺术。这个效果模拟了电影《黑客帝国》中矩阵代码下落的画面。本文将深入探讨如何使用Java来实现这一效果,同时也会涉及一些基础的Java...
看过黑客帝国,很冲动,学了几天java,写了个简单的数字雨程序。
一个黑客写的编程 教程.php
黑客写挂工具包.zip
在电影《黑客帝国》中,那著名的“代码雨”效果为观众呈现了一种充满未来感的视觉体验。...总之,Java提供了一个强大的平台,让我们能够利用编程创造出各种有趣的视觉效果,包括经典的“黑客帝国代码雨”。
在Java编程语言中,"黑客帝国代码雨"(也称为"Matrix Code")是一种常见的编程艺术展示,灵感来源于电影《黑客帝国》中的经典场景。这个程序通常会模拟电影中绿色字符垂直下落的效果,作为屏幕保护程序或者演示示例...
《仿黑客帝国弹幕雨Java实现详解》 在IT领域,程序员们经常追求创新与独特,以此来展示自己的技术实力。"仿黑客帝国弹幕雨Java"项目就是一个很好的实例,它模仿了电影《黑客帝国》中经典的绿色字符弹幕效果,通过...
本教程将详细介绍如何使用Java来创建一个类似"黑客帝国"黑客入侵效果的GUI。 首先,我们需要导入必要的Java Swing库,它是Java提供的用于构建GUI的框架。在`HeikeScreen.java`文件中,我们可能会看到如下导入语句:...
在这个项目中,我们将探讨如何使用Java实现“黑客帝国二进制数字代码雨”。 首先,我们需要了解二进制。二进制是计算机科学的基础,只有两个数字:0和1。在二进制系统中,每个数字位代表一个比特(bit),它是信息...
pdf格式 黑客攻防技术电子书 阅读方便
黑客帝国html前端炫酷效果黑客帝国
黑客帝国数字雨java修改版. 由于不会用链表,颜色渐变有些问题。只是增加显示宽度。
【标题】: "Java_黑客新闻的现代安卓客户端" 是一个使用Java编程语言开发的安卓应用,旨在为用户带来一个现代化的界面,用于浏览和互动于知名的“黑客新闻”(Hacker News) 社区。这个客户端可能包含了优化的用户体验...
js黑客帝国代码雨效果源代码,黑客既视感,web优秀课程设计,小白必看! js黑客帝国代码雨效果源代码,黑客既视感,web优秀课程设计,小白必看! js黑客帝国代码雨效果源代码,黑客既视感,web优秀课程设计,小白必...
黑客新手学习必看 看到不少刚入门的菜鸟找不到适合自己的hack学习方法,到处碰壁,不但损伤信心和兴趣,而且也耽误了不少高贵的时间和金钱,做了许多无用功,到头来毫无收获。 因此我总结了一下我个人的一些学习...
【超酷屏保黑客专用】是一款专为黑客设计的炫酷屏幕保护程序,它结合了科技感和艺术性,旨在为计算机用户提供一种独特的视觉体验。这款屏保不仅外观酷炫,而且在一定程度上反映了黑客文化的魅力,使得电脑在闲置时也...
"黑客01屏保源码"这个标题指的是一个与黑客主题相关的屏幕保护程序的源代码。在IT领域,"黑客"通常指的是技术高手,尤其是那些擅长网络安全和系统破解的人。这里的"屏保"是计算机操作系统中的一种功能,当用户在一段...
"Windows黑客技术揭秘与攻防 C语言篇" 本资源为 Windows 黑客技术揭秘与攻防的 C 语言篇,涵盖了 Windows 操作系统的黑客技术和攻防策略。通过学习本资源,可以了解 Windows 黑客技术的基本概念和原理,掌握 C 语言...