神奇的javascript-不用括号带参执行函数

/

两周前,我遇到一个挺有意思的xss,过滤了很多符号,包括<>=()[]等。

我将此问题抽象成ctf题目[1],题目源码公开在 github[2]

前两天在 题目评论[3] 中看到有师傅把答案贴出来了,我就说一下这个案例。

测试时遇到的问题

实际测试时遇到的问题,也是题目中有两个比较难的地方:

  1. * javascript不用 <>=()`[] 等符号,怎么调用函数?
  2. * javascript不用 <>=()`[] 等符号,怎么调用函数,并且带上参数?

第一个问题简单一点:在发生类型转换时,会执行valueOf或者toString属性值指向的函数。

  1. 1-{valueOf:function(){alert(1)}}

第二个问题难一点,需要对this的用法比较熟悉。

  1. 在函数外部,this指向window对象
  2. 在函数内部:
  3. * 普通调用时
  4. * strict模式下,this指向undeined
  5. * strict模式下,this指向当前对象

还有一些方式改变this指向的对象,包括:

  1. * 调用call函数、apply函数等指定对象
  2. * new构造函数

this涉及的情况比较多,也比较反直觉,这里就不多说了。可以看 11 | this:从JavaScript执行上下文的视角讲清楚this[4] 这篇文章。

题目解法
我的解法和 @rmb122 师傅一样:

  1. https://04bdb3a0.o53.xyz/a1e60ae3-4bac-4012-a0f3-5b7018677979.php?a=xx%27-{valueOf:test.a,%27call%27:%22%27%22%2blocation.hash}-%27#';hello('a','b','c');//

我也把题目发给我做前端开发的朋友,他的解法如下:

  1. https://04bdb3a0.o53.xyz/a1e60ae3-4bac-4012-a0f3-5b7018677979.php?a=%27%2B{toString:%20test.a,call:%20%27hello%27%2B[...hello%2B%27%27][29]%2B%22%27a%27,%22%2B%22%27b%27,%22%2B%22%27c%27%22%2B[...hello%2B%27%27][56]}%2B%27

中间有个小插曲:在朋友把他的解法发我后,我在代码中添加了对[]符号的过滤,因为我碰到的实际案例中也过滤了[]符号。

总结
虽然当时绕过了xss的过滤,也清楚触发流程,但是我不明白为什么会这么触发。

所以补了一下和此题相关的语法及概念,包括以下内容:

  1. * 类型转换
  2. * this是什么
  3. * 函数是一等公民

由这个问题想到,是否其他语言有类似场景?比如某个对象可控时,对它做运算会导致函数调用。

  1. obj = {"可控key":"可控value"}
  2. 操作 obj

这是一个木有答案的问题。

Reproduced please indicate the author and the source, and error a link to this page.
text link: //v2ci.com/43.html