Javascript 如何处理连字符?

How does Javascript treat hyphens?

我在看XSS Game and this one challenge called Jeff

挑战将名为 jeff 的查询参数作为输入,并将其存储在名为 jeff 的变量中。挑战的目标是在页面上加载一个警告框。该解决方案在 eval() 函数中使用连字符 运行 Javascript。

所以,我们有这个评估:

eval(`ma = "Ma name ${jeff}"`)

获得警告框的解决方案输入是(剧透警告!无双关语意。):

"-alert(1337)-"

现在,我迫切需要了解 Javascript 如何处理那些连字符!帮忙!?

网站使用的代码是:

let jeff = (new URL(location).searchParams.get('jeff') || "JEFFF")
eval(`ma = "Ma name ${jeff}"`)

注意searchParams给你一个URLSearchParams对象,它的.get方法给你一个string对应参数。所以, objective 是想出一些字符,当插入到

ma = "Ma name <CHARACTERS>"

和运行,导致任意代码执行。

第一步是将"中的字符包围起来,从而结束name之后的字符串文字,恢复CHARACTERS:

之后的字符串文字
ma = "Ma name " <SOMETHING ELSE> ""

所以现在你需要弄清楚什么样的字符可以进入 <SOMETHING ELSE>,这将导致有效的 Javascript 代码。

如果您只输入 alert(),那将无效:

ma = "Ma name " alert() ""

这是语法错误。您需要一些东西来指示 alert 与它之前的字符串文字标记有什么关系。 - 可以做到这一点,但任何其他运算符也可以,例如 +% 等。您还需要将 alert 的末尾与恢复的字符串文字连接起来,因此末尾需要另一个运算符:

ma = "Ma name "-alert('foo')-""
//            ^^^^^^^^^^^^^^^^

ma = "Ma name "-alert('foo')-""

所以,需要插入的字符是:

"-alert('foo')-"

请注意,由于字符串是在搜索参数内部传递的,因此 + 不会被解释为文字字符 + - 而是 interpreted as a space. So jeff="+alert(1337)+" won't work, but jeff="%2balert(1337)%2b"会.

分号也有效,因为它们导致:

ma = "Ma name " <SOMETHING ELSE> ""
ma = "Ma name "; alert()        ;""

这是有效的语法。