在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)
最后只想再感慨一次:黑客的想象力是无限的。理解代码并不难,问题是一开始时他们是怎么能想出来的 ...
备注 : 本文属于转载
分享到:
相关推荐
值得注意的是,虽然这个黑客代码雨看起来很酷,但它并没有实际的黑客攻击功能。它只是模拟了电影中的特效,而不是真正的入侵行为。因此,它不会对你的电脑造成任何危害,除非代码本身有问题,但这种情况在正规渠道...
《黑客帝国数字雨登陆界面》是一款独特而引人入胜的网页设计,它结合了HTML、CSS和JavaScript技术,为用户创造出与电影《黑客帝国》中经典的“数字雨”(Matrix Rain)相似的视觉体验。这个登陆界面不仅具有高度的...
这段CSS将`<marquee>`元素的宽度设为100%,颜色设为黑色,背景色设为深蓝色,字体选择固定宽的"Courier New",并调整了字号和行高,使其看起来更像经典的代码显示。 此外,还可以通过JavaScript来增强交互性,比如...
首先,黑客专用记事本可能包含对多种编程语言和脚本的语法高亮支持,如Python、Java、C++、JavaScript、SQL等,这使得用户在查看或编写代码时可以更清晰地分辨出不同类型的语句,提高代码可读性。此外,它可能还具有...
标题 "黑客攻防-请看介绍" 涉及到的是网络安全领域中的一个重要主题——黑客攻击与防御。在这个主题下,我们主要探讨四个关键的知识点: 1. **基础知识**:这是学习任何领域的基础,对于黑客攻防也不例外。基础知识...
6. **响应式设计**:为了让页面在不同设备上看起来都像黑客界面,需要考虑响应式布局,确保在手机和平板等设备上也能正常显示。 7. **安全提示**:虽然这个主题是“伪装黑客”,但开发者应该强调这只是模拟,并非...
在黑客帝国效果中,我们需要创建一个或多个包含字符或数字的元素,并通过定时器控制它们的位置变化,使其看起来像在不断滚动。 具体实现步骤如下: 1. **创建元素**:在HTML中,我们可以预先定义一个div或其他容器...
超级黑客 超级黑客是一个CLI应用程序,可以将精美的代码输出到您的终端,让您震惊您的朋友和家人。 默认情况下,输出缓冲区设置为3,但可以覆盖。 要退出,请按esc或ctrl-c 。 例子 没有标志的超级黑客使用默认语言...
"js-文字雨-黑客帝国效果"是一个使用JavaScript实现的特效,模仿了电影《黑客帝国》中经典的“绿色代码雨”场景。这个效果通过动态地在页面上显示滚动的文字,营造出一种科技感强烈的视觉体验。 要创建这种文字雨...
此外,可以调整字符之间的间距,使得矩阵看起来更紧凑或稀疏。还可以考虑使用CSS3的`transform`和`transition`属性来实现平滑的动画效果。 总的来说,HTML5和JavaScript的结合为我们提供了实现《黑客帝国》文字矩阵...
最后,为了让效果更加接近“黑客帝国”,我们可以调整字符的颜色、大小、速度,甚至添加一些随机的偏移,使字符的落点看起来不那么规整,增加真实感。 总的来说,实现“黑客帝国”代码下雨效果主要涉及JavaScript对...
为了更好地理解CSP策略的应用,下面我们来看两个实际应用场景的例子: ##### 场景一:禁止外部资源加载,但允许内嵌脚本执行 响应头设置如下: ``` X-Content-Security-Policy: default-src 'unsafe-inline' 'self...
接下来,我们来看看代码的实现。首先,我们需要创建一个HTML文件,并在其中添加一个DIV元素,用于显示我们的效果。然后,我们需要使用JavaScript来控制这个效果。我们可以使用JavaScript来创建一个表格,每个单元格...
你可以尝试去了解其背后的代码逻辑,研究如何用编程语言实现这样的效果,比如使用Python的pygame库或者JavaScript的Canvas API。这不仅可以锻炼编程技能,也能更深入地理解电影中的数字雨是如何通过代码实现的。 总...
Digital一个展示所有黑客(包括他们的统计数据)列表的平台,参加了DigitalOcean举办的为期一个月的Hacktoberfest挑战赛。 Hacktoberfest参与者-社区:jack-o-lantern:一个显示所有黑客名单的平台,该平台参加了...
`move`函数是实现滚动的关键,它检查`ul`元素的`offsetLeft`值,当达到边界时进行回转,使得滚动条看起来像是在循环移动。`setInterval`定时器每30毫秒调用一次`move`函数,实现平滑的滚动效果。 左右按钮的点击...
通常,黑客界面会展示一些命令行界面(CLI)或者图形用户界面(GUI),这些界面看起来像是在进行复杂的数据分析或网络入侵。开发者可能使用了各种技巧,如文本动画、模拟的命令输入反馈等,来营造出一种正在执行黑客...
标题中的“DigitalRain”指的是一个使用JavaScript实现的动画效果,灵感来源于电影《黑客帝国》中的经典元素——“数字雨”或“绿色代码”。这个动画在网页上呈现出类似于矩阵中不断下落的字符或数字,给人一种高...
总的来说,"throw-to-selfie:Flipkart 黑客马拉松 2015"代表了一个早期的、创新的JavaScript项目,旨在提供一种新颖的自拍体验。虽然现在无法直接体验到这个项目,但它反映了当时开发者们的创新精神和对新技术的应用...
从压缩包文件 "hak-my-pod-master" 来看,这可能是一个开源项目,包含了整个黑客马拉松作品的所有源代码和资源。通常,这样的文件夹结构会包括 HTML 文件(用于页面结构)、CSS 文件(用于样式设计)、JavaScript ...