Практическая работа №3
==
# SQL-injection
## Login bypass
Посмотрим запрос:

При добавлении кавычки видим internal server error:

Добавим комментарий и аутентификация успешна:

Итого:


## Retrieving of hidden data
Добавили кавычку и internal error:

Поскольку цель - показать все товары из всех категорий, то нужно условие в "where" сделать всегда верным, для этого такой юзаем такой запрос:

Результат:

## Retrieving data from other tables
Здесь обычная union sqli, нам известны название таблицы и название полей, поэтому запрос формируем легко:

Результат:

Логинимся:

## Querying the database type and version
Сначала также с помощью кавычки понимаем, что запрос можно модифицировать. Поскольку понятно, что здесь union based sqli, то сначала поймем сколько столбцов возвращает оригинальный запрос.
Также после пары пробных запросов понимаем, что комметарий это #
Попробуем так:

Видим ошибку:

Так:

Вывод полноценный, значит 2 столбика
Теперь нам нужно убрать весь вывод первой части запроса и оставить только результат второй части (той, которую мы модифицируем):

Ошибки нет и вывода тоже - то, что нужно
Теперь пишем нужный запрос:

Результат:

# XSS
## Stored XSS into HTML
Заполняем форму:

Результат:

## DOM XSS in document.write
Видим, что поисковый запрос отображается на странице:

При этом теги не отображаются:

Попробуем еще нескольких неудачных запросов:


После этого в режиме разработчика просто ищем наш запрос и находим такое:

Тег img, у которого src зависит от нашего запроса
И без проблем находим код, который этот тег добавляет:

Дальше становится легко, формируем такой запрос:

Результат:

## Reflected XSS into a JavaScript
Запросим что-нибудь:

Посмотрим source page и ужаснемся - пользовательский ввод отправляется прямо в тег script:

Некоторые из спецсимволов кодируются через html - скобки тегов:

Попробуем вставить свой код с помощью доступных ' и ; :

Видим, что у нас остается лишняя кавычка:

Поменяем запрос на такой - избавимся от непарной кавычки с помощью переменной:

Результат:

Сгенерированный код:

## Reflected DOM
Поиск на сайте состоит из двух запросов к серверу. Первый выглядит так:

В ответе содержится вызов функции search():

Второй выглядит так, реализуется функцией search:

Найдем функцию search в файле /resources/js/searchResults.js:

Видим сначала AJAX запрос, потом отображение его результата. В запросе используется eval:

Переменная this.responseText это то, что возвращает запрос (второй):

Он возвращает такие вещи:

То есть через подделку searchTerm можно использовать XSS
Понимаем, что эта страница экранирует символы " / и не экранируются ' \
Таким образом обеспечим легитимное продолжение строки. Теперь мы хотим добавить выполнение алерта:

Теперь нужно как-то завершить строку, поскольку сейчас она некорректна по синтаксису. Просто закончим ее } и комментарием:

Результат:

# CSRF
## CSRF vulnerability with no defenses
Посмотрим запрос для смены мейла:

В exploit server пишем так:

Протестируем на себе, емейл сменился:

Отправляем такое же письмо админу, пройдено:

## CSRF with token validation
Запрос на смену адреса, тут есть CSRF токен:

В этом задании суть та же, поэтому полезная нагрузка такая же, кроме метода и поля csrf:

Попробовали на себе:

Потом на админе:

# SSRF
## Basic SSRF
Видим запрос проверки наличия:

Адрес там такой:

Запросим админку:

Видим там такую ссылку:

Вызываем метод delete с нужными параметрами:

Снова перейдем по localhost/admin и убедимся:

На главной:

## SSRF with filter bypass
Запрос проверки наличия:

Переход по ссылке next product:

Видно, что проходит переход по /product/nextProduct, потом на строне сервера запрашивается содержимое параметра path
Поэтому формируем такой запрос:

В ответе видим содержимое админки:

Меняем запрос на такой:

Результат:


# RCE
## simple OS command injection
Как сказано в задании - наличие товара проверяется shell скриптом.
Найдем этот запрос:

Попробуем поменять так - результата нет:

Так - результат есть:

Окончательный запрос:

# Path traversal
## Simple file path traversal
Немного осмотримся и найдем такой запрос картинки:

Поменяем параметр:

Такой запрос не сработал, значит там относительный путь:

Щедро сыпем ../ и получаем нужное:

## Traversal sequences blocked with absolute path bypass
Тот же запрос картинки:

Видим, что запросы с относительным путем блокируются:

Пробуем прямой - успех:

# Статистика
