在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例javascript代码:
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
这是一段完全合法的javascript代码,效果相当于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" 这里利用了javascript运算的强制类型转换特性。首先空数组是一个非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的情况容错。
通过第一部分,我们已经获得将任何值转换为字符串的简单方法,并能产生任意的数值,理论上就可以从javascript的取值系统中提取出大部分字母(不知道是不是全部,需要考证)。并且,我们获取到了window的引用。下面就可以开始上下其手,为所欲为了。木哈哈哈哈哈!
可以看出,上面的第10步是与浏览器的具体实现相关的,因此也存在着某些浏览器下需要对代码作出修改的可能。
现在看第二部分,事实上已经非常明朗了,唯一需要注意的是,现在$是一个函数,因此~$ = ~0 (无法直接转换为数字则作为0处理) = -1。
[__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)
所以,整条式子相当于:
window["alert"](1)
最后只想再感慨一次:黑客的想象力是无限的。理解代码并不难,问题是一开始时他们是怎么能想出来的 ...
备注 : 本文属于转载
分享到:
相关推荐
超级黑客 超级黑客是一个CLI应用程序,可以将精美的代码输出到您的终端,让您震惊您的朋友和家人。 默认情况下,输出缓冲区设置为3,但可以覆盖。 要退出,请按esc或ctrl-c 。 例子 没有标志的超级黑客使用默认语言...
本文实例为大家分享了canvas实现代码雨效果的具体代码,供大家参考,具体内容如下 先看效果图 这个效果图是不是像极了以前电影里面的黑客技术,看起来蛮难的,其实操作起来还是挺简单的。 canvas其实就是画布的...
Digital一个展示所有黑客(包括他们的统计数据)列表的平台,参加了DigitalOcean举办的为期一个月的Hacktoberfest挑战赛。 Hacktoberfest参与者-社区:jack-o-lantern:一个显示所有黑客名单的平台,该平台参加了...
复古的未来主义设计启发了黑客入侵的黑暗主题。 借助优化的突出显示背景和不透明度,可以在任何地方搜索和查找代码。 差异代码可以使用易于理解的差异背景颜色进行智能更改。 窥视视图代码,例如具有深色背景和...
作者: kostis90gr 翻译: 黯魂[S.S.T] 本文已发表于《黑客防线》6月刊,版权属于《黑客防线》及脚本安全小组,转载请保持文章完整性,谢谢 :) 这份指南仅仅是出于报告目的,如果任何人把它用于违法目的,我不负...
3、让你轻松入门学习HTML、Javascript、VBscript等客户端脚本语言,从而在本质上认识挂马、跨站等黑客技术,同时还有一些常见的脚本病毒的编写。 4、数据库学习。先介绍SQL语言的基础学习,为后面分析程序漏洞打下...
用html5语言做的ppt来介绍html5 这样效果会更好吧 你可以边演示边给大家看里边的代码 另外附送两个很炫的javascript效果演示(黑客帝国和星球大战),这样还可以很好的给让受众明白html和javascript结合的强大之处。...
我们遇到的挑战我们对JavaScript不太熟悉,也没有分形的经验。我们引以为傲的成就下拉菜单选择某些选项。 使用线性颜色插值创建树形分形。我们学到了什么分形比看起来复杂得多。 如何使用HTML5 Canvas功能。ArtMath...
去看看吧! 所有评论都显示在/ 。 如果您自己托管,则可以使用POST /submissions和DELETE /submissions来维护显示的评论。 RESTful 评论管理 查看routes/index.js的三个函数。 安装 确保你已经安装了 node.js。 ...
#TuneByte! 这个项目是在数小时内完成一次黑客马拉松的。 我们从谷歌搜索“什么是智能合约”发展到看起来可行的东西。 我们度过了一段愉快的时光,了解了有关区块链的大量知识。
写给大家看的设计书(第3版) 黑客与画家 富爸爸,穷爸爸 JavaScript高级程序设计(第3版) 彼得·林奇的成功投资 厚黑学 超越自卑 你不知道JavaScript(上卷) JavaScript语言精粹 2015: JavaScript权威指南 Web...
用JavaScript实现的常见排序算法和数据结构的交互式概述。 还包括其他一些算法挑战,类似于编程采访中提出的挑战。 这旨在帮助您在准备面试时掌握计算机科学的基础知识,算法和解决问题的技能! 这仅作为参考/评论-...
_Staries #1 ~ 最终这些点变成了酒窝,你必须进去看看发生了什么_ 概念使命调查地形上的墙壁、地板和开口代码和大脑之间的辩证法能否创造出没有另一个就无法创造的设计?想象为参与者提供新技能或新技能的意识发现...
黑客攻击 100 天 2013-12-31 -第 0 天已发布 2014-01-01 -第 1 天 读它充满了非常好的材料,但主要是复习。 2014-01-02 -第 2 天 读但是跳过了关于预处理器和 jQuery 的章节。 读了解有关 CSS 架构(经典、SMACSS、...
我最喜欢做的事情是在空闲时间编写代码(即github上的代码) 看看在github上这真棒回购,这是一个关于黑客的天才,如果你喜欢PMG回购。 如果您喜欢的话,您将把我的帐户赠品回购给我和我的朋友。 你可以如果您想...
警告:这里是hacky代码 ... 这是因为我想看看我是否可以让它工作,因为以前我有各种各样的客户或潜在客户要求这样的东西。 哦,我还加入了 react-router 来显示页面导航而不停止音频也有效。 蛮好玩的。
您可以在他们的网站上了解更多信息: [Node JS 网站] ( )开始黑客攻击server.js 文件通过 node.js 启动服务器它侦听端口 1337,因此当您键入时(安装节点后): node server.js 然后你可以看看你好:
JoinNow 现在就加入完成这个报名系统的攻城计画吧! ! Installation step1 Install mongodb $ aptitude install mongodb $ /etc/init.d/mongodb start ...快来试试看吧 详细功能内容请到讨论群组内详谈! !
它是如何下降的你选择你想看的名人,戴上 Oculus,然后看着你视野中的人变成所有名人。我们遇到的挑战最初,没有任何 Oculi 可供我们借出,所以我们不得不改变我们创建 Oculus hack 的决定。 幸运的是,一群人最终在...
这是一个 chrome 扩展,它实现了一个白帽黑客键盘记录器。 每当在 chrome 网页上输入密码时,记录器都会检测到。 然后它会记录密钥日志并将密码与其他相关表单数据一起发送到电子邮件中。 可以使用扩展选项更改详细...