看到下面的代码之后,我开始想知道是否有办法在不使用任何字母的情况下访问完整的小写字母(条件将在下面应用):
[($=(!0)+'')[0]+$[1]+$[2]+((!1)+'')[3]+$[0],(([]+[])[1]+'')[1]+([]+{})[1],([]+{})[1]+(([]+[])[1]+'')[1]+$[3]].join(' ');
// "trust no one"
使用下面的各种声明可以访问以下字母a b c d e f g i j l m n o p r s t u v x y
:
// "true" yeilds: e r t u
!0+'';
// "false" yeilds: a f l s
!1+'';
// "[object Object]" yeilds: b c j o t
[]+{}+'';
// "undefined" yeilds: d i n
[][1]+'';
// "Infinity" yeilds: y
1/0+'';
// Using the above statements "constructor" can be spelled
// It has no value by itself but can be coupled with other statements to get more letters
($=[]+{}+'')[5]+$[1]+(([]+[])[1]+'')[1]+((!1)+'')[3]+($=!0+'')[0]+$[1]+$[2]+($=[]+{}+'')[5]+$[6]+$[1]+((!0)+'')[1];
// "function RegExp() { [native code] }" yeilds: g p v x
(/./)[/*constructor" from above*/]+'';
// "function Number() { [native code] }" yeilds: m
(0)[/*"constructor" from above*/]+'';
使用以下限制访问剩余字符h q w z
有哪些方法:
global
表示节点,window
表示浏览器等。答案 0 :(得分:1)
([]+{}+'')[5]+([]+{}+'')[1]+(([]+[])[1]+'')[1]+(!1+'')[3]+(!0+'')[0]
+(!0+'')[1]+(!0+'')[2]+([]+{}+'')[5]+(!0+'')[0]+([]+{}+'')[1]+(!0+'')[1]
为您提供构造函数'然后您可以使用这样的字符串文字:
('')[([]+{}+'')[5]+([]+{}+'')[1]+(([]+[])[1]+'')[1]+(!1+'')[3]+(!0+'')[0]
+(!0+'')[1]+(!0+'')[2]+([]+{}+'')[5]+(!0+'')[0]+([]+{}+'')[1]+(!0+'')[1]]+''
为您提供'function String() { [native code] }'
,为您提供了&#39; v&#39;和&#39; <&#39;
编辑:您找到了&#39;构造函数&#39;如果没有办法访问全局变量,获得更多的东西也很棘手。
这是在Node中获取全局变量的一种方法:
('')['constructor']['constructor']('','return global')()
使用上述方法:
('')[
// 'constructor'
({}+'')[5] + ({}+'')[1] + (([]+[])[1]+'')[1] + (!1+'')[3] +
(!0+'')[0] + (!0+'')[1] + (!0+'')[2] + ({}+'')[5] +
(!0+'')[0] + ({}+'')[1] + (!0+'')[1]
][
// 'constructor'
([]+{}+'')[5] + ([]+{}+'')[1] + (([]+[])[1]+'')[1] + (!1+'')[3] +
(!0+'')[0] + (!0+'')[1] + (!0+'')[2] + ([]+{}+'')[5] +
(!0+'')[0] + ([]+{}+'')[1] + (!0+'')[1]
](
'',
// 'return'
(!0+'')[1] + (!0+'')[3] + (!0+'')[0] + (!0+'')[2] + (!0+'')[1] + (([]+[])[1]+'')[1] +
' ' +
// 'g'
(('')[
([]+{}+'')[5] + ([]+{}+'')[1] + (([]+[])[1]+'')[1] +
(!1+'')[3] + (!0+'')[0] + (!0+'')[1] + (!0+'')[2] +
([]+{}+'')[5] + (!0+'')[0] + ([]+{}+'')[1] + (!0+'')[1]
] + '')[14] +
// 'lobal'
(!1+'')[2] + ({}+'')[1] + ({}+'')[2] + (!1+'')[1] + (!1+'')[2]
)()
从那里你可以访问global.env
,并从那里几乎作弊。
编辑:你也可以建立这个:
[]['constructor']['constructor'](
'o',
"var a=[];for(var x in o){a.append(x)};return a")
这为您提供了一个穷人的Object.keys()
,您可以使用它来访问各种对象的名称&#39;方法
您还可以构建一个eval函数&amp;将其分配给$
:
$=[]['constructor']['constructor']('s','return eval(s)')
答案 1 :(得分:1)
unescape
,则为了清晰起见未编码:
[]['constructor']['constructor']['call']('','return unescape' + '("%68%71%77%7' + 'a' +'")')()
这给了我们hqwx,当然可以给我们任何其他的东西。
唯一无法达到的位是'("%68%71%77%7<a goes here>")'
,但满足符号和数字规则。 a可以用其他方式构建。
如果我们想要避免unescape,我们可以使用(828035)['toString'](36)
- &#34;魔法&#34;号码828035
是使用parseInt('hqwz',36)
生成的。
并且已编码 - 为了便于阅读而分发了大部分内容:
// From your post
str_constructor = ($=[]+{}+'')[5]+$[1]+(([]+[])[1]+'')[1]+
((!1)+'')[3]+($=!0+'')[0]+$[1]+$[2]+($=[]+{}+'')[5]+
$[6]+$[1]+((!0)+'')[1];
// call
str_call = ([]+{}+'')[5]+($=!1+'')[1]+$[2]+$[2];
// return unescape ( bonus, not using a literal space character )
ret_unescape = ($=!0+'')[1]+$[3]+$[0]+$[2]+$[1]+($=''[1]+'')[1]+
([]+{}+'')[7]+$[0]+$[1]+$[3]+($=!1+'')[3]+([]+{}+'')[5]+$[1]+
((/./)[str_constructor]+'')[14]+(!0+'')[3];
// finally
[][str_constructor][str_constructor][str_call]('',ret_unescape + '("%68%71%77%7' + (!1+'')[1] +'")')() // "hqwz"
// or -- toString
str_toString = (!0+'')[0]+([]+{}+'')[1]+($=(('')[str_constructor]+''))[9]+$[10]+$[11]+$[12]+$[13]+$[14]
(828035)[str_toString](36) // hqwz
加成奖金:
如果我们偷偷摸摸,我们甚至可以抛弃数字。
true: !![]
false: ![]
0: ![]+![]
1: !![]+![]
2: !![]+!![]
10: (!![]+![]+'')+(![]+![])
因此,我讨厌的神奇常数可能是:
((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+((!![]+!![])+'')+
((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+
(![]+![]+'')+(!![]+!![]+!![]+'')+((!![]+!![])*(!![]+!![])+!![])-![]