探秘 JavaScript 中的六个字符

译者:小青年
链接:http://www.zcfy.cc/article/1370
原文:http://jazcash.com/a-javascript-journey-with-only-six-characters/

JavaScript 是一个奇怪而有趣的语言,我们可以写一些疯狂却仍然有效的代码。它试图帮助我们把事情转换到基于我们如何对待他们的特定类型。

如果我们添加一个字符串,JavaScript 会假定我们希望为文本形式表示,所以将它转换为一个字符串。如果我们添加一个正负前缀符号,JavaScript 会假定我们希望为数值形式表示。如果可能的话,对我们来说并将字符串转换为一个数字。如果我们添加一个否定符号,JavaScript 会将将字符串转换为一个布尔值。

我们可以使用 Javascript 中[,],(,),!+这六个符号写一些神奇的代码。如果你现在不是在手机,你可以打开浏览器的控制台,你可以将任何代码示例粘贴到控制台,并且代码值为 true。

让我们从最基本的开始,要记住一些黄金规则:

  • !后面跟的字符会被转换成布尔值
  • +后面跟的字符会被转换成数值
  • []后面跟的字符会被转换成字符串

来看下面的例子:

![] === false
+[] === 0
[]+[] === "" 

另一件事你应该知道的是,它可以从字符串使用方括号检索特定的字母,像这样:

"hello"[0] === "h"

还记得可以使多个数字号码通过添加字符串表示在一起,然后把整个表达式转换成一个数字:

+("1" + "1") === 11 

我们们继续把一些东西结合在一起得到字母a

![] === false
![]+[] === "false"
+!![] === 1
------------------------
(![]+[])[+!![]] === "a"  // same as "false"[1] 

举一反三!

我们可以通过truefalse得到相似的字母a,e,f,l,r,s,t,u,那么我们可以从其他地方得到的字母吗?

我们可以通过一些特别的式子如[][[]]得到undefined,利用我们上面讲到的黄金法则得到另外的字母d,in

`[][[]] + [] === "undefined"` 

到目前为止,利用我们已经获得的所有字母,我们可以拼fill, filterfind。当然也有一些其他的单词,我们也可以拼写,但这些单词最重要的是,他们都是数组的方法。这意味着他们是数组对象的一部分,可以直接调用数组实例,如:[2,1].sort()

现在,了解 JavaScript 的另一件重要的特性是一个对象的属性可以通过点符号.或方括号[]访问。上述数组方法是数组对象本身的属性,我们可以使用方括号代替点符号调用这些方法。

所以[2,1]["sort"]() 等效于 [2,1].sort().

我们继续看看,当我们试图使用一个数组的方法会发生什么,我们可以使用到目前为止我们拼写的但没有调用的字母。

[]["fill"]

这会得到function fill() { [native code] },我们可以把这个方法头作为一个字符串,再次使用我们的黄金法则:

[]["fill"]+[] === "function fill() { [native code] }"

所以,现在我们又得到其他的字符:c,o,v,(,),{,[,],}

随着我们新得到的co,我们现在可以形成constructor这个单词。构造函数是一个方法,所有 JS 对象仅返回自己的构造函数。

到目前为止我们已经处理的对象,我们可以得到它用字符串表示的构造器函数:

true["constructor"] + [] === "function Boolean() { [native code] }"  
0["constructor"] + []    === "function Number() { [native code] }"  
""["constructor"] + []   === "function String() { [native code] }"
[]["constructor"] + []   === "function Array() { [native code] }"
({})["constructor"] + [] === "function Object() { [native code] }" 

通过这些式子,我们可以将下面的字符加入到我们的库中:
B,N,S,A,O,m,b,g,y,j

现在我们可以构造一个我们可以使用方括号的函数"toString",我们可以这样调用:

(10)["toString"]() === "10"

使用我们的黄金法则,我们已经可以将任何我们想要转换成一个字符串,但是上面这个式子怎么用呢?

好吧,我告诉你,Number类型的toString方法有一个称为radix(“基数”)的秘密的论点。它可以将数值在转换为一个字符串之前先经过基数换算,像这样:

(12)["toString"](10) === "12"  // 十进制
(12)["toString"](2) === "1100" // 二进制
(12)["toString"](8) === "14"   // 八进制
(12)["toString"](16) === "c"   // 十六进制 

但是为什么基数只写到 16?最大值是 36,包括所有的字符0-9a-z,所以现在我们可以得到任何我们想要的字母数字:

(10)["toString"](36) === "a"
(35)["toString"](36) === "z" 

太棒了!但是其它符号如标点符号和大写字母呢?我们接着深入探索。

这取决于你的 JS 执行时,它可能会,或可能不会访问特定的预定义的对象或数据。如果你在浏览器中运行它,那么你可以访问一些存在的HTML包装器方法

例如,bold是一个包装在<>标签中的字符串方法。

"test"["bold"]() === "<b>test</b>" 

通过这个我们得到<>/两个字符。

你可能听说过escape方法,它主要将字符串转换为一个 URI 友好的格式,可以让简单的浏览器解释。如果我们传递一个空格字符,我们得到的"%20"。

这里有一个工具可以自动将每个字符自动转换。

工具地址:http://www.jsfuck.com/
源代码地址:https://raw.githubusercontent.com/aemkei/jsfuck/master/jsfuck.js

为什么这几个字符有用?

它不是易趣网做的一些不好的事情,不久前允许卖家将执行 JS 在页面中使用只能使用这些字符,但它是一个相当罕见的攻击向量。有些人说混淆,但事实上,有更好的方法混淆。

最后,希望你会喜欢本次探秘之旅。


资源:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容