【问题标题】:How does Javascript treat hyphens?Javascript 如何处理连字符?
【发布时间】:2020-06-20 21:34:41
【问题描述】:

我正在查看XSS Game 和这个名为Jeff 的挑战。

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

所以,我们有这个评估:

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

获得警报框的解决方案输入是(剧透警报!没有双关语。):

"-alert(1337)-"

现在,我迫切需要了解 Javascript 如何处理这些连字符!救命!?

【问题讨论】:

  • eval 的结果是ma = "Ma name "-alert(1337)-"",所以重要的是初始引号,而不是连字符(仅被视为正常减法)。 ";alert(1337);// 将是另一个有效的解决方案。
  • 是的,阅读链接的帖子 10 次并没有给我任何关于 Javascript 如何处理连字符以使 XSS 工作的好线索..
  • 你是对的 - 这不会产生一元运算符(例如ma = -x),它会产生 2 个标准运算符,例如ma = A - B - C.
  • 谢谢,@cmbuckley。最初的引号是有道理的,我自己用分号解决了它。我仍然不明白连字符在警报工作中的作用。为什么减法有效,而不是加法?
  • @Quentin 我认为这与一元 - 无关。当将第一个字符串文字的末尾与后面的表达式连接时,需要(在两边)使语法有效。

标签: javascript xss


【解决方案1】:

网站使用的代码是:

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

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

ma = "Ma name <CHARACTERS>"

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

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

ma = "Ma name " <SOMETHING ELSE> ""

所以现在你需要弄清楚哪些字符可以进入&lt;SOMETHING ELSE&gt;,这将产生有效的Javascript代码。

如果你只是输入alert(),那将是无效的:

ma = "Ma name " alert() ""

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

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

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

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

"-alert('foo')-"

请注意,由于字符串是在搜索参数内部传递的,+ 不会被解释为文字字符 + - 而是interpreted as a space。所以jeff="+alert(1337)+" 不起作用,但jeff="%2balert(1337)%2b" 会。

分号也可以,因为它们会导致:

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

这是有效的语法。

【讨论】:

  • 谢谢!这就说得通了!! :100:
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 2020-03-19
  • 2019-01-22
  • 2013-04-22
  • 2014-03-16
  • 2011-08-06
  • 1970-01-01
  • 2017-05-16
相关资源
最近更新 更多