JavaScript 无括号调用函数的新玩法
Yet another way to invoke functions without parentheses
我发现了一种在 JavaScript 中无需括号即可调用任意函数的新技巧。其核心原理是利用 Error 对象的 prepareStackTrace 函数来生成自定义代码,该函数通常在访问错误堆栈时被触发。由于堆栈本质上是数组,我通过覆盖 Array.prototype.toString 方法,将其转换为特定的 JavaScript 代码片段。结合原型污染技术,我成功操控了 Error.prototype.toString 的输出。最后,利用 valueOf 技巧将生成的对象作为原语调用,从而实现了无括号执行。这一系列操作展示了 JavaScript 引擎机制的巧妙利用,为代码执行提供了全新的视角。
我确信还有更多方法可以实现这一目标。
HN 评论区
85- hans_castorp
这让我想起了《创造者承认 Unix 和 C 是骗局》(例如 https://www.gnu.org/fun/jokes/unix-hoax.html)
> 当我们能用以下语法编译通过时,我们就停手了:
for(;P("\n"),R--;P("|"))for(e=C;e--;P("_"+(*u++/8)%2))P("| "+(*u/4)%2);
- nathell
我太喜欢这个了。这是个有趣的黑客技巧,但文章也让人回想起 LLM 出现之前的日子,那时人们还对 _代码_ 本身感兴趣。
- amelius
我想把被调用的函数放在参数后面:
(((x)f)g)h
这样我就能从左到右清楚地看到事情发生的顺序。
而不是:
f(g(h(x)))
那种写法我得倒着读。
- MattCruikshank
我想写一本极其较真的书,展示我能想到的所有将数据从“这里”移动到“那里”的方法。无论是在同一个程序内,还是在不同程序之间。
全局变量。
函数参数。
传递一个 functor/lambda,获取值。
环境变量。
注册表。
文件。
存在 ping 响应里。
写入后读取的 VRAM 纹理。
数据库。
REST 服务器。
我敢肯定我能想出上千种方法。
但是……为什么?我为什么要写这本书?为什么这件事一直萦绕在我心头?
- CreepyHunterX
这是一个很有创意的黑客技巧,而且它确实很重要。基于黑名单的净化器和 WAF 通常通过匹配字符串或正则表达式来工作,所以这类技巧通常能绕过它们。我在审计中发现过这类 XSS 漏洞,存在于由正则表达式黑名单保护的遥测字段中。真正的修复方案不仅仅是延长黑名单,而是上下文感知的输出编码(再加上 CSP 作为纵深防御)。