У Google есть забавный новичок, вроде XSS-игры, и хотя это было довольно легко, я кое-что выучил.

Так что эта статья предназначена для тех, кто застрял в игре, или тех, кто хочет просто понять, почему полезная нагрузка уровней работает.

Просто совет. Если вы просто застряли, рекомендую прогуляться, выпить кофе и попробовать позже, имея более свежий разум. Очень часто переход прямо к решению не так многому вас научит, как если бы вы делали это в одиночку.

Ну что ж, поехали:

Уровень 1: Привет, мир XSS

Решение: Этот уровень - всего лишь вводная задача, чтобы показать, как работает XSS, конечно, это «очень простой и нереалистичный» пример. Все, что мы набираем, встраивается в страницу. Следовательно, просто вставьте тег скрипта с кодом предупреждения.

Полезная нагрузка уровня 1:

<script>alert()</script>

Почему это работает. Код просто добавляет вводимые пользователем данные на веб-страницу без какой-либо очистки, поэтому браузер воспринимает его как часть кода страницы и выполняет.

Уровень 2: настойчивость - ключ к успеху

Решение. Как и на предыдущем уровне, уязвимость этой страницы заключается в том, что HTML прямо на ней. Но на этот раз есть проверка, которая не позволяет нам использовать тег скрипта. Чтобы обойти это, мы можем вставить тег изображения с недопустимым URL-адресом и атрибутом onerror, который будет запускать предупреждение javascript.

Полезная нагрузка 2-го уровня:

<img src='x' onerror='alert()'>

Почему это работает: страница будет пытаться загрузить изображение из источника 'x', что терпит неудачу, а затем активирует атрибут onerror код.

Уровень 3: Это опускающееся чувство ...

Решение: приложение выбирает вкладку изображения на основе первого фрагмента URL (хеш после URL). Передача вредоносного фрагмента, который будет вставлен на страницу, вызовет предупреждение.

Полезная нагрузка 3-го уровня:

1' onerror='alert();//

Почему это работает. Исходный код страницы показывает, что он получает фрагмент URL и передается в функцию choosetab.

window.onload = function() {
chooseTab(unescape(self.location.hash.substr(1)) || "1");
}

Эта функция затем добавляет фрагмент текста в источник тега изображения и загружает новый тег на страницу.

function chooseTab(num) {
// Dynamically load the appropriate image.
var html = "Image " + parseInt(num) + "<br>";
html += "<img src='/static/level3/cloud" + num + ".jpg' />";
$('#tabContent').html(html);
...

Мы можем обмануть это, закрыв атрибут src одинарной кавычкой, а затем добавив атрибут onerror с функцией предупреждения , как на предыдущем уровне. , и комментируя часть '.jpg' двойной косой чертой.

Он создаст следующий тег img, который отлично работает.

<img src='/static/level3/cloud1' onerror='alert();//.jpg' />

Уровень 4: контекст имеет значение

Решение. На странице указателя отображается форма, в которую мы можем передать число, которое передается на страницу таймера, функция которой просто подсчитывает число, которое мы передали в секундах, а затем перенаправляет нас обратно в начало. Мы можем обмануть его функцию таймера для выполнения произвольного кода, поскольку он напрямую добавляется на страницу.

Полезная нагрузка уровня 4:

3'**alert());//

Почему это работает. Значение, переданное страницей индекса, сразу добавляется в параметр функции на таймере.

<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />

Таким образом, мы можем манипулировать исполняемым здесь javascript. Если мы передадим следующий параметр:

3'**alert());//

JavaScript попытается оценить 3 ** alert () перед вызовом функции startTimer. Кроме того, для оценки результата 3 ** alert () необходимо получить значение, возвращаемое функцией alert (), которое заставит браузер выполнить функцию предупреждения.

Уровень 5: нарушение протокола

Решение 1

Решение. На самом деле страница приветствия ничего не делает, просто ведет нас на страницу подписки, где происходит волшебство. На странице подписки мы можем ввести адрес электронной почты (или что-то еще, в конце концов, он не оценивается) и нажать ссылку далее, которая приведет нас на страницу передается следующим параметром r (например,? next = confirm). Мы можем обмануть этот параметр, внедрив в него код javascript, выполнив функцию предупреждения.

Полезная нагрузка 5-го уровня:

https://xss-game.appspot.com/level5/frame/signup?next=javascript:alert()

Почему это работает. Код страницы просто вводит значение параметра next в атрибут href следующей ссылки.

<a href="{{ next }}">Next >></a>

Таким образом, мы можем вставить код javascript в атрибут, который будет восприниматься браузером как букмарклет.

javascript:alert()

Решение 2

Решение. После нажатия следующей ссылки вы перейдете на страницу подтверждения, которая перенаправит вас в начало в заданное время. Но глядя на исходный код confirm, мы видим, что он также принимает следующий параметр, который используется для перенаправления вас к заданному значению. Тогда мы снова можем с этим связываться.

Полезная нагрузка 5-го уровня (нужно подождать, пока истечет время):

https://xss-game.appspot.com/level5/frame/confirm?next=javascript:alert()

Почему это работает. Страница подтверждения также принимает следующий параметр и использует его для перенаправления пользователя к заданному значению.

<script>
setTimeout(function() { window.location = '{{ next }}'; }, 5000);
</script>

По истечении времени мы будем перенаправлены по ссылке:

javascript:alert()

Это будет восприниматься браузером как букмарклет, выполняющий код.

Уровень 6: Следуйте 🐇

Решение. На странице добавляется тег скрипта с атрибутом src, указывающим на значение первого фрагмента URL. Но перед этим он оценивает, начинается ли фрагмент словами «http» или «https», чтобы предотвратить загрузку внешних файлов. Но мы можем обойти эту проверку, опустив протокол http. Для этого решения я использую файл по умолчанию, предоставленный Google в задаче (заменяя «foo» на «alert»).

Полезная нагрузка уровня 6:

//www.google.com/jsapi?callback=alert

Почему это работает. Если вы опустите протокол в URL-адресе, он унаследует протокол от текущей среды (страницы). В этом случае он унаследует протокол https. Подробнее об этом здесь (кратко) и здесь (полностью).

Поздравления

Итак, мы выполнили задачу. И последний совет: основным навыком для использования всего приложения была способность искать источники и приемники, поэтому, если вы не знакомы с этой концепцией, взгляните на это потрясающее видео.

Как рассердился

Как вам игра в целом? О: Мне она понравилась!

Как насчет трудности? О: Слишком просто.

Надеюсь, вам понравилась статья! Если вам понравилось, пришлите мне несколько аплодисментов 👏, расскажите, где вы застряли, решили ли вы это другим способом или как вы оценили эту задачу в комментариях.

Увидимся! 😁