2019独角兽企业重金招聘Python工程师标准>>>

在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)

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

转载于:https://my.oschina.net/oncereply/blog/14008

神码,JavaScript!相关推荐

  1. 神码ai人工智能写作机器人_人工智能和机器学习的最佳资源

    神码ai人工智能写作机器人 机器学习指南 (MACHINE LEARNING GUIDE) Half of this crazy year is behind us and summer is her ...

  2. 神码ai人工智能写作机器人_机器学习简介part1与人工智能的比较

    神码ai人工智能写作机器人 https://www.eastwestbank.com/ReachFurther/en/News/)https://www.eastwestbank.com/ReachF ...

  3. 神码ai人工智能写作机器人_从云到设备到边缘的人工智能和机器学习的未来

    神码ai人工智能写作机器人 A brief overview of the state-of-the-art in training ML models on devices. For a more ...

  4. 神码ai人工智能写作机器人_机器学习和人工智能最佳书籍

    神码ai人工智能写作机器人 Here you will get list of best books for Machine Learning and Artificial Intelligence ...

  5. 神码ai人工智能写作机器人_AI启动协变量AI为机器人构建通用AI

    神码ai人工智能写作机器人 One could be excused for confusing the Investor's list on the Covariant.ai website wit ...

  6. 神码ai人工智能写作机器人_机器学习与医学:人工智能在医疗保健中的陷阱

    神码ai人工智能写作机器人 Bias in Artificial Intelligence (AI) is the most dangerous factor in the development o ...

  7. 神码ai人工智能写作机器人_人工智能和机器学习可以改善营销的6种方式

    神码ai人工智能写作机器人 Six months ago, bustling cities with flourishing businesses and communities across the ...

  8. 神码AI黑科技,人工智能写作的发展空间有目共睹

    人工智能并不是新鲜玩意,最早的研究距今已经有了60多年的历史了,可以看到人工智能年龄比我们都大了.人工智能包含了很多方面,与我们的日常生活息息相关,比如神码AI人工智能写作等等之类的黑科技. 关于人工 ...

  9. 解密支付宝所谓黑科技神码

    最近群里一直有发什么支付宝黑科技神码 代码发出来自己操作 https://ds.alipay.com/?scheme=alipays://platformapi/startapp?appId=2000 ...

最新文章

  1. vue引用js文件的多种方式
  2. python异步封装_python中用协程(异步)实现map函数,爬虫也可以封装进去,
  3. android studio 写文件,在Android Studio中从我自己的类读取和写入文本文件
  4. eclipse 导入zip
  5. 九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解...
  6. spark 查看yarn日志_spark周边项目之Livy
  7. 201621123053《Java程序设计》第十四周学习笔记文章
  8. pandas之在Excel上绘制柱形图
  9. hdu 2570 (贪心)
  10. windows开机后一键启动应用程序
  11. 基于51单片机利用ADC0808芯片实现A/D转换。
  12. 带你玩转接口测试利器Apifox亲测好用
  13. Mac屏幕截图软件SnapNDrag激活教程分享
  14. printf左右对齐
  15. 怎样给word插入页码,点击进来有惊喜
  16. 微软产品界面配色方案分析
  17. exmail邮件被退回
  18. 如何用MATLAB求解一元高次方程
  19. android wear刷机,1分钟搞定刷机 百度DuWear手表系统公测版上线
  20. iPhone 自动关机 原因 天气太冷

热门文章

  1. 软件测试方法划分等价类,软件测试基础-软件测试方法之等价类划分.ppt
  2. FTP服务器的搭建与使用FTP软件进行文件上传
  3. 加速 Nginx 响应的 5 个措施!赶紧用…
  4. js 编程 判断身高,体重的比例是否正常
  5. Aries(白羊座)框架的学习之路-1
  6. 水一下:百年难得一遇
  7. 爱尔兰圣三一大学计算机专业硕士,圣三一大学两大热门硕士专业
  8. 都柏林圣三一计算机在线测试,(完整版)圣三一4级模拟测试.docx
  9. 二分排序法(折半插入法)
  10. 18 非理性:如何管住你的“动物精神”