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() ;""
这是有效的语法。
我在看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() ;""
这是有效的语法。