Как Javascript относится к дефисам? - PullRequest
2 голосов
/ 09 марта 2020

Я смотрю на XSS Game и этот один вызов называется Джефф .

Задача принимает параметр запроса с именем jeff в качестве входных данных и сохраняет его в переменной с именем jeff. Цель задачи - загрузить окно оповещения на странице. Решение использует дефисы для запуска Javascript в функции eval().

Итак, у нас есть следующее значение:

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

И входное решение решения для получения окна предупреждения (Спойлер бдительность! Никакой каламбур не предназначен.):

"-alert(1337)-"

Теперь мне крайне необходимо понять, как Javascript относится к этим дефисам! Помощь!

1 Ответ

3 голосов
/ 09 марта 2020

Код, который использует сайт:

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()        ;""

, который является допустимым синтаксисом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...