看了这个js后就别说自己js很牛了
转载:http://www.iteye.com/topic/947149
在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
显然,最外层是(...)()形式的函数调用,我们需要看看这里究竟调用了什么函数,返回了什么。下一步,我们把原来代码中赋值表达式提取出来,将其改写为以下等价形式:
$ = []; //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)
分享到:
相关推荐
3.27 黑客帝国中的字符下落效果 3.28 获取表单中文本框的个数 3.29 光标停在文字最后 3.30 分行取textarea中的值 3.31 自动插入文本 3.32 选取textarea的指定行 3.33 文本放大镜 3.34 文本框的默认输入法 3.35 ...
3.27 黑客帝国中的字符下落效果 3.28 获取表单中文本框的个数 3.29 光标停在文字最后 3.30 分行取textarea中的值 3.31 自动插入文本 3.32 选取textarea的指定行 3.33 文本放大镜 3.34 文本框的默认输入法 3.35 ...
JavaScript和jQuery可能用于增强交互效果,如滑动展示、弹出窗口等。同时,考虑到搜索引擎优化(SEO),模板会遵循SEO最佳实践,如合理的关键词布局、元标签设置,以提高网站在搜索引擎中的排名。 安装和使用【电子...
强制每个人都使用令人敬畏的音乐标记器并获得井井有条的收藏 具有可点击链接和多项选择答案的类似终端的网络界面 上传和导入音乐无需共享 FTP/SSH 访问 应该适用于个人电脑、手机和平板电脑 几乎没有依赖的轻量级...
【标题】:“自己的收藏夹”揭示了这是一份个人整理并珍藏的电脑学习资源集合。这个压缩包可能包含了各种与计算机技术学习相关的网站链接、教程文档、视频课程或者其他有助于初学者入门和进阶的资料。 【描述】:...
SQL注入针对的是数据库查询,命令注入则能让攻击者执行操作系统命令,而XSS攻击则可能导致用户浏览器执行攻击者的JavaScript代码。 郁金香代码注入器可能具备以下功能: 1. **扫描与识别**:查找目标系统中的可利用...
流星种子计划我的个人 Meteor ...ui-bootstrap-3 阿兰宁:角色测试迈克:摩卡速度:html-记者速度:核心收藏aldeed:collection2 aldeed:简单模式(包含在 collection2 中) 性能监控流星黑客:卡迪拉流星黑客:区域
webextensions-lib-tab-favicon-helper 帮助显示选项卡中的收藏夹图像。 如,WebExtensions 不提供任何功能来缓存有效的图标。 我们需要为图像文件做更多的变通方法。 这个库可以帮助你使用 favicon 来实现一些东西...
如果您喜欢此收藏集,请对其进行分叉并制作成自己的收藏(只需将第3方归因保留在适当的位置)! 一些编程原则 我试图使它们保持移动友好性,因为与使用鼠标和键盘相比,幼儿可以更轻松地与触摸屏进行交互。 我将...
随着技术的发展,浏览器组件的多样性和复杂性也日益增加,为黑客攻击提供了更多可能的攻击面。特别是在使用Chromium内核的浏览器中,其安全风险尤为突出。本文将深入剖析Chromium组件,尤其是渲染引擎和浏览器内核这...
##特征时标##技术均值堆栈节点JS ExpressJS后端-利用大多数服务于JSON的RESTful路由角度前端MongoDB(以及Mongoose或Monk) 古尔普用于身份验证的PassportJS 引导程序时分双工切里奥 ##伸展目标添加收藏夹列表...
HF反大写锁定-自动将线程标题中的大写锁定中的单词转换为“标题大小写”。 HF Games列出了其他网站- 将其他网站添加到游戏列表。 HF API添加链接-在子论坛中将链接添加到API控制面板,并在API控制面板中添加子论坛...
这个项目是由一群热情的小组在为期两天的黑客马拉松中原型化的,并由一个了不起的学生和工程师在一个多月的时间内实现了。 感谢您试用我们的网站,请随时通过向我们发送反馈。 网站 我们创建了一个称为Gen Studio的...
这是黑客新闻的仿制品。 Hacker News是由Y-Combinator运营的社交新闻网站,用户在其中发布与计算机科学和企业家精神或其他智力刺激主题有关的故事。 要查看该站点,请转到。 特征 用户可以创建登录所需的帐户和授权...
8. 安全防护:通过安全编码、防火墙、验证码等手段,保护商城免受黑客攻击和恶意操作。 源码结构通常包含以下几个部分: 1. 核心框架:这部分包含了系统的基础架构,如路由分发、模型层、视图层等。 2. 控制器...
是否公开关注用户/标签/粉丝、收藏帖子、积分列表 是否公开在线状态 是否公开 UA 信息 是否公开地理位置 是否参与财富/消费排行 另外,用户还可以完整导出数据,包括帖子和回帖。 编辑历史与匿名发布 ...
收藏RecCollector 的概念验证胖客户端。 其目标是以可访问的方式按位置提供娱乐信息数据库 (RIDB) 站点信息。 [参考实例] ( ) 基于 Bluemix 构建介绍RecCollection 是一个由 [IBM 员工] ( ) 团队发起的黑客马拉松...
黑链是近年兴起的一种黑客方式的链接交易模式,即黑客攻破服务器并修改网站内容,出售网站的隐形链接。越来越多的黑链流向市场,黑链的存在将使您的网站严重降权,甚至被K,您的网站上是否也存在黑链?本软件是...
自己写规律的开始代码和结束代码一定要填好,一定不可以重复! 对采集不熟悉的朋友,建议你先下个动易2006sp4玩玩他们的采集。。。 如果连动易的采集都不会用的话,那这个采集你没法用了。。。 其它的说明: admin_...
2. **安全性**:由于其代码存在漏洞,IE成为黑客攻击的目标,安全问题频发。 3. **性能**:相比于Chrome等浏览器,IE的渲染速度和内存管理效率较低。 4. **更新缓慢**:微软对IE的更新速度较慢,难以跟上互联网技术...