Что такое SQL-инъекция второго порядка
В SQL-инъекции второго порядка приложение сохраняет предоставленную пользователем информацию до ее выполнения. Пользователь не получит никакой ошибки (или указания SQLi) в ответе этой страницы (на которой ввод вводится). Позже, когда пользователь получает доступ к другой странице или функциональности, где сохраненная информация будет использоваться для создания нового запроса SQL, который будет выполнять введенную ранее полезную нагрузку, это называется инъекцией SQL второго порядка.
Дополнительная информация:
Это звучит немного запутанно, верно? Давайте сделаем это просто на примере внедрения SQL второго порядка в Joomla! рамки [CVE-2018-6376]
подробности
Пострадавшие Joomla! Версия: <= 3.8.3 и> = 3.7.0
Среда для эксплуатации: пользователь с более низкими привилегиями (пользовательская роль «
Обнаружение впрыска
Теперь мы создали Joomla! Фреймворк, необходимый для тестирования описанного выше сценария. Здесь мы создали уязвимую Joomla! экземпляр (версия 3.8.3), как показано на рисунке ниже:
Joomla! версия 3.8.3
Мы создали пользователя 'amish' с привилегиями 'Super Users' и другого пользователя 'savan' с привилегиями 'Manager', как показано ниже:
Создать пользователя уровня менеджера
Наша цель - повысить привилегию с роли «Менеджер» до роли «Супер Администратор». Итак, давайте войдем в систему под именем пользователя «savan». Ниже на рисунке показана панель мониторинга для пользователя 'savan', а также показано, что пользователь 'Super User' также вошел в систему одновременно:
Пользователь Savan вошел в систему наряду с суперпользователем
Как объясняется в ссылочном блоге, уязвимый экземпляр находится на странице обновления профиля. Ниже на рисунке показана страница обновления профиля для пользователя 'savan':
Страница обновления профиля
Перехватим запрос на обновление профиля в инструменте HTTP-прокси
Http: // <IP / домен> /joomla/administrator/index.php?option=com_admin&view=profile&layout=edit&id=645
Запрос перехвачен в BurpSuite
Уязвимый параметр - ' forms [params] [admin_style] ', и это выделено на рисунке ниже. Давайте вставим следующую полезную нагрузку (выделено красным шрифтом) в соответствующий параметр, как показано на рисунке ниже:
ЗАГРУЗИТЬ: '(одинарная кавычка)
Тест SQLi с использованием одинарных кавычек
При успешной отправке этого запроса на странице обновления профиля отображается информационное сообщение «Товар сохранен», как показано на рисунке ниже:
Предметы Сохраненные сообщения
Это не раскрывает никаких сообщений об ошибках, так как эта страница не использует введенную полезную нагрузку для структурирования SQL-запроса и его выполнения. Давайте перейдем к следующему URL-адресу, по которому SQL-запрос создается с введенной полезной нагрузкой и выполняется, как показано на рисунке ниже:
Http: // <IP / домен> /joomla/administrator/index.php
Ошибка SQL на другой странице
Давайте подтвердим из исходного кода, что точка вставки полезной нагрузки не уязвима для внедрения SQL. Ниже на рисунке показан фрагмент кода файла '~ / administrator / components / com_admin / controllers / profile.php', в котором указан маршрут для функции «Редактировать профиль»:
Редактировать функцию профиля
Когда пользователь обновляет данные профиля, приложение извлекает все параметры и возвращает объект JForm, как показано на рисунке ниже:
Получить данные из формы
На рисунке ниже показано, что приложение сохраняет полученную информацию о пользователях в базе данных:
Сохранить данные
Поскольку мы подтвердили, что пользовательские вводы не используются для создания SQL-запроса и, следовательно, экземпляр вставки полезной нагрузки не уязвим, давайте попробуем использовать его на уязвимой странице. Как показано на рисунке ниже, давайте вставим следующую строку в качестве полезной нагрузки, чтобы проверить, как наша полезная нагрузка используется для построения SQL-запроса:
PAYLOAD: тест
Вставить тестовую полезную нагрузку
Теперь давайте проверим сообщение об ошибке на соответствующей странице панели инструментов. Как показано на рисунке ниже, мы получили только первый символ полезной нагрузки в сообщении об ошибке.
Ошибка SQL
Чтобы попробовать дальше, мы добавили еще одну полезную нагрузку ' AND sleep (5); - " и обновили страницу панели инструментов. Как показано на рисунке ниже, в сообщении об ошибке снова отображается только первый символ «A»:
Sleep Payload
Если мы проверим базу данных, чтобы убедиться, что вводимые пользователем данные хранятся в базе данных. Как показано на рисунке ниже, база данных имеет всю полезную нагрузку, которую мы внедрили:
Полная полезная нагрузка присутствует в базе данных
Поскольку мы подтвердили, что полезная нагрузка сохранена правильно, давайте проверим уязвимый код, чтобы проверить, как он создает запрос SQL. Уязвимый экземпляр находится в файле « administrator / templates / hathor / postinstall / hathormessage.php» . Как показано на рисунке , приведенном ниже, код в номер пользователя сороковых линии магазинов при условии , значение от « admin_style» параметр « adminstyle» переменной. Теперь код в 47-й строке использует пользовательский ввод непосредственно для построения SQL-запроса. Но подождите, здесь это значение рассматривается как массив. Таким образом, индекс 0 сохраненного значения будет использован для построения запроса. Здесь мы получили ответ, почему отражается только первый символ полезной нагрузки.
Уязвимый код
Теперь мы знаем, что полезная нагрузка обрабатывается как массив, а индекс 0 будет использоваться в запросе SQL. Итак, давайте попробуем предоставить массив ' [“test1 ″,” test2 ″, ”test3”]' в качестве полезной нагрузки. Затем мы ожидали, что 0-й индекс массива, т. Е. (« Test1» ) будет использован для структурирования SQL-запроса. Но, как показано на рисунке ниже, приложение отразило « [» в сообщении об ошибке, что означает, что вся полезная нагрузка снова была обработана как строка.
Массив также рассматривается как строка
К сожалению. Так, что дальше? Разве это не эксплуатируемый экземпляр SQL-инъекции?
Нет. Мы предложили изменить имя параметра и предоставить 0-й индекс массива admin_style. Как показано на рисунке ниже, мы изменили имя параметра на « jform [params] [admin_style] [0] » и внедрили ту же полезную нагрузку в 0-й индекс «admin_style»:
ЗАГРУЗИТЬ: И спать (5); -
Отправлено первый параметр массива
Теперь приложение отражает нашу полную полезную нагрузку. Однако полезная нагрузка не сработала.
Полная полезная нагрузка отражена
Мы снова добавили следующую полезную нагрузку для извлечения имени базы данных, и приложение ответило именем базы данных 'joomla', как показано на рисунке ниже:
Полезная нагрузка: extractvalue (0x0a, concat (0x0a, (выберите базу данных ())))
Имя базы данных извлечено
Ура!!! Мы успешно использовали это. Теперь давайте выполним нашу цель - получить доступ к приложению с привилегиями Super Administrator. Следующая полезная нагрузка даст нам идентификатор сеанса пользователя «Супер-Администратор» amish , как показано на рисунке ниже:
Полезная нагрузка: extractvalue (0x0a, concat (0x0a, (выберите * из joomla_session, где username = 'amish')))
Извлечение SessionId пользователя Super Admin
Да…. Теперь мы можем использовать этот идентификатор сеанса для олицетворения пользователя Super Administrator.
Автоматизация эксплуатации
Теперь, когда дело доходит до настоящего теста на проникновение, нам также необходимо извлекать информацию. Если мы попытаемся сделать это вручную, это убьет столько времени. Так как же это автоматизировать?
Для этого есть решение. Инструмент
Примечание / Ограничение: Поскольку это SQL-инъекция второго порядка, мы не можем автоматизировать несколько потоков для проверки вывода каждого запроса.
Если мы напрямую предоставим этот экземпляр инструменту SQLMap, это может не сработать. Для работы этого процесса нам нужно создать запрос, в котором Sqlmap может внедрить свою полезную нагрузку и может беспрепятственно извлекать данные. Мы создали следующую полезную нагрузку для предоставления в качестве значения параметра ' jform [params] [admin_style] [0] ' в запросе и проанализировали этот запрос с помощью переключателя инструментов SQLMap ' -r ', как показано на рисунке ниже;
PAYLOAD: извлечь значение (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 *)))
Подготовка запроса для SQLMap
Здесь '*' в полезной нагрузке будет работать как маркер для инструмента SQLMap для внедрения полезных нагрузок, таких как:
sqlmap -r 1.txt –dbms MySQL - второй порядок «http: // <IP / domain> /joomla/administrator/index.php» -D «joomla» –dbs
Извлечение данных через SQLMap
Используя инструмент Sqlmap, мы теперь можем легко извлекать дополнительные данные.
Санация
Чтобы смягчить эту атаку SQL-инъекций, обновите Joomla! Framework до версии 3.8.5 (последняя версия доступна на момент написания этого блога). Мы заметили, что Joomla! исправил этот экземпляр с помощью фрагмента кода, как показано на рисунке ниже:
Официальное исправление ошибки
Если у вас есть какие-либо вопросы, пожалуйста, напишите ниже. Мы сделаем все возможное, чтобы ответить на них.
Источник:
В SQL-инъекции второго порядка приложение сохраняет предоставленную пользователем информацию до ее выполнения. Пользователь не получит никакой ошибки (или указания SQLi) в ответе этой страницы (на которой ввод вводится). Позже, когда пользователь получает доступ к другой странице или функциональности, где сохраненная информация будет использоваться для создания нового запроса SQL, который будет выполнять введенную ранее полезную нагрузку, это называется инъекцией SQL второго порядка.
Дополнительная информация:
Ссылка скрыта от гостей
Это звучит немного запутанно, верно? Давайте сделаем это просто на примере внедрения SQL второго порядка в Joomla! рамки [CVE-2018-6376]
подробности
Пострадавшие Joomla! Версия: <= 3.8.3 и> = 3.7.0
Среда для эксплуатации: пользователь с более низкими привилегиями (пользовательская роль «
Ссылка скрыта от гостей
») может повысить свою привилегию до более высокой пользовательской роли (пользовательская роль «
Ссылка скрыта от гостей
» или «
Ссылка скрыта от гостей
»).Обнаружение впрыска
Теперь мы создали Joomla! Фреймворк, необходимый для тестирования описанного выше сценария. Здесь мы создали уязвимую Joomla! экземпляр (версия 3.8.3), как показано на рисунке ниже:
Joomla! версия 3.8.3
Мы создали пользователя 'amish' с привилегиями 'Super Users' и другого пользователя 'savan' с привилегиями 'Manager', как показано ниже:
Создать пользователя уровня менеджера
Наша цель - повысить привилегию с роли «Менеджер» до роли «Супер Администратор». Итак, давайте войдем в систему под именем пользователя «savan». Ниже на рисунке показана панель мониторинга для пользователя 'savan', а также показано, что пользователь 'Super User' также вошел в систему одновременно:
Пользователь Savan вошел в систему наряду с суперпользователем
Как объясняется в ссылочном блоге, уязвимый экземпляр находится на странице обновления профиля. Ниже на рисунке показана страница обновления профиля для пользователя 'savan':
Страница обновления профиля
Перехватим запрос на обновление профиля в инструменте HTTP-прокси
Ссылка скрыта от гостей
. Как показано на рисунке ниже, запрос POST с данными из нескольких частей отправляется на следующий ресурс:Http: // <IP / домен> /joomla/administrator/index.php?option=com_admin&view=profile&layout=edit&id=645
Запрос перехвачен в BurpSuite
Уязвимый параметр - ' forms [params] [admin_style] ', и это выделено на рисунке ниже. Давайте вставим следующую полезную нагрузку (выделено красным шрифтом) в соответствующий параметр, как показано на рисунке ниже:
ЗАГРУЗИТЬ: '(одинарная кавычка)
Тест SQLi с использованием одинарных кавычек
При успешной отправке этого запроса на странице обновления профиля отображается информационное сообщение «Товар сохранен», как показано на рисунке ниже:
Предметы Сохраненные сообщения
Это не раскрывает никаких сообщений об ошибках, так как эта страница не использует введенную полезную нагрузку для структурирования SQL-запроса и его выполнения. Давайте перейдем к следующему URL-адресу, по которому SQL-запрос создается с введенной полезной нагрузкой и выполняется, как показано на рисунке ниже:
Http: // <IP / домен> /joomla/administrator/index.php
Ошибка SQL на другой странице
Давайте подтвердим из исходного кода, что точка вставки полезной нагрузки не уязвима для внедрения SQL. Ниже на рисунке показан фрагмент кода файла '~ / administrator / components / com_admin / controllers / profile.php', в котором указан маршрут для функции «Редактировать профиль»:
Редактировать функцию профиля
Когда пользователь обновляет данные профиля, приложение извлекает все параметры и возвращает объект JForm, как показано на рисунке ниже:
Получить данные из формы
На рисунке ниже показано, что приложение сохраняет полученную информацию о пользователях в базе данных:
Сохранить данные
Поскольку мы подтвердили, что пользовательские вводы не используются для создания SQL-запроса и, следовательно, экземпляр вставки полезной нагрузки не уязвим, давайте попробуем использовать его на уязвимой странице. Как показано на рисунке ниже, давайте вставим следующую строку в качестве полезной нагрузки, чтобы проверить, как наша полезная нагрузка используется для построения SQL-запроса:
PAYLOAD: тест
Вставить тестовую полезную нагрузку
Теперь давайте проверим сообщение об ошибке на соответствующей странице панели инструментов. Как показано на рисунке ниже, мы получили только первый символ полезной нагрузки в сообщении об ошибке.
Ошибка SQL
Чтобы попробовать дальше, мы добавили еще одну полезную нагрузку ' AND sleep (5); - " и обновили страницу панели инструментов. Как показано на рисунке ниже, в сообщении об ошибке снова отображается только первый символ «A»:
Sleep Payload
Если мы проверим базу данных, чтобы убедиться, что вводимые пользователем данные хранятся в базе данных. Как показано на рисунке ниже, база данных имеет всю полезную нагрузку, которую мы внедрили:
Полная полезная нагрузка присутствует в базе данных
Поскольку мы подтвердили, что полезная нагрузка сохранена правильно, давайте проверим уязвимый код, чтобы проверить, как он создает запрос SQL. Уязвимый экземпляр находится в файле « administrator / templates / hathor / postinstall / hathormessage.php» . Как показано на рисунке , приведенном ниже, код в номер пользователя сороковых линии магазинов при условии , значение от « admin_style» параметр « adminstyle» переменной. Теперь код в 47-й строке использует пользовательский ввод непосредственно для построения SQL-запроса. Но подождите, здесь это значение рассматривается как массив. Таким образом, индекс 0 сохраненного значения будет использован для построения запроса. Здесь мы получили ответ, почему отражается только первый символ полезной нагрузки.
Уязвимый код
Теперь мы знаем, что полезная нагрузка обрабатывается как массив, а индекс 0 будет использоваться в запросе SQL. Итак, давайте попробуем предоставить массив ' [“test1 ″,” test2 ″, ”test3”]' в качестве полезной нагрузки. Затем мы ожидали, что 0-й индекс массива, т. Е. (« Test1» ) будет использован для структурирования SQL-запроса. Но, как показано на рисунке ниже, приложение отразило « [» в сообщении об ошибке, что означает, что вся полезная нагрузка снова была обработана как строка.
Массив также рассматривается как строка
К сожалению. Так, что дальше? Разве это не эксплуатируемый экземпляр SQL-инъекции?
Нет. Мы предложили изменить имя параметра и предоставить 0-й индекс массива admin_style. Как показано на рисунке ниже, мы изменили имя параметра на « jform [params] [admin_style] [0] » и внедрили ту же полезную нагрузку в 0-й индекс «admin_style»:
ЗАГРУЗИТЬ: И спать (5); -
Отправлено первый параметр массива
Теперь приложение отражает нашу полную полезную нагрузку. Однако полезная нагрузка не сработала.
Полная полезная нагрузка отражена
Мы снова добавили следующую полезную нагрузку для извлечения имени базы данных, и приложение ответило именем базы данных 'joomla', как показано на рисунке ниже:
Полезная нагрузка: extractvalue (0x0a, concat (0x0a, (выберите базу данных ())))
Имя базы данных извлечено
Ура!!! Мы успешно использовали это. Теперь давайте выполним нашу цель - получить доступ к приложению с привилегиями Super Administrator. Следующая полезная нагрузка даст нам идентификатор сеанса пользователя «Супер-Администратор» amish , как показано на рисунке ниже:
Полезная нагрузка: extractvalue (0x0a, concat (0x0a, (выберите * из joomla_session, где username = 'amish')))
Извлечение SessionId пользователя Super Admin
Да…. Теперь мы можем использовать этот идентификатор сеанса для олицетворения пользователя Super Administrator.
Автоматизация эксплуатации
Теперь, когда дело доходит до настоящего теста на проникновение, нам также необходимо извлекать информацию. Если мы попытаемся сделать это вручную, это убьет столько времени. Так как же это автоматизировать?
Для этого есть решение. Инструмент
Ссылка скрыта от гостей
предоставляет переключатель ' –second-order ', который требует URL-адрес отражения полезной нагрузки в качестве входных данных, и он будет работать.Примечание / Ограничение: Поскольку это SQL-инъекция второго порядка, мы не можем автоматизировать несколько потоков для проверки вывода каждого запроса.
Если мы напрямую предоставим этот экземпляр инструменту SQLMap, это может не сработать. Для работы этого процесса нам нужно создать запрос, в котором Sqlmap может внедрить свою полезную нагрузку и может беспрепятственно извлекать данные. Мы создали следующую полезную нагрузку для предоставления в качестве значения параметра ' jform [params] [admin_style] [0] ' в запросе и проанализировали этот запрос с помощью переключателя инструментов SQLMap ' -r ', как показано на рисунке ниже;
PAYLOAD: извлечь значение (0x0a, concat (0x0a, (выберите @@ версию, где 1 = 1 *)))
Подготовка запроса для 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 -r 1.txt –dbms MySQL - второй порядок «http: // <IP / domain> /joomla/administrator/index.php» -D «joomla» –dbs
Извлечение данных через SQLMap
Используя инструмент Sqlmap, мы теперь можем легко извлекать дополнительные данные.
Санация
Чтобы смягчить эту атаку SQL-инъекций, обновите Joomla! Framework до версии 3.8.5 (последняя версия доступна на момент написания этого блога). Мы заметили, что Joomla! исправил этот экземпляр с помощью фрагмента кода, как показано на рисунке ниже:
Официальное исправление ошибки
Если у вас есть какие-либо вопросы, пожалуйста, напишите ниже. Мы сделаем все возможное, чтобы ответить на них.
Источник:
Ссылка скрыта от гостей