Код, который использует сайт:
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> ""
Так что теперь вам нужно выяснить, какие символы могут go в <SOMETHING ELSE>
, что приведет к действительному Javascript коду.
Если вы просто введете alert()
, это будет недействительно:
ma = "Ma name " alert() ""
Это синтаксическая ошибка. Вам нужно что-то, чтобы указать, что alert
имеет отношение к строковому литералу, который находится перед ним. -
может справиться с задачей, но любой другой оператор, например +
, %
и т. Д., Может это сделать. Вам также нужно соединить конец alert
с возобновленным строковым литералом, таким образом, нужен другой оператор в конце:
ma = "Ma name "-alert('foo')-""
// ^^^^^^^^^^^^^^^^
ma = "Ma name "-alert('foo')-""
Итак, символы, которые нужно вставить:
"-alert('foo')-"
Обратите внимание, что поскольку строка доставляется внутри параметра поиска, a +
не будет интерпретироваться как буквенный символ +
, скорее, будет интерпретироваться как пробел . Так что jeff="+alert(1337)+"
не будет работать, но jeff="%2balert(1337)%2b"
будет работать.
Точки с запятой также работают, потому что они приводят к:
ma = "Ma name " <SOMETHING ELSE> ""
ma = "Ma name "; alert() ;""
, который является допустимым синтаксисом.