Функция GROUP_CONCAT() позволяет объединить в одну строку несколько записей из таблицы, при этом можно задавать свой собственный символ разделения, а также воспользоваться операторами DISTINCT, ORDER BY, ASC/DESC. Впервые функция появилась в MySQL версии 4.1. Полный синтаксис и примеры использования можно посмотреть в официальной документации MySQL.
В SQL-инъекции GROUP_CONCAT() может пригодиться при получении списка баз данных, таблиц и их колонок из information_schema (разумеется, при MySQL 5.*).
- SELECT GROUP_CONCAT(SCHEMA_NAME SEPARATOR 0x0a) FROM information_schema.SCHEMATA
список баз данных в одном поле - SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR 0x0a) FROM information_schema.TABLES
список всех таблиц из текущей базы данных - SELECT GROUP_CONCAT(TABLE_NAME SEPARATOR 0x0a) FROM information_schema.TABLES WHERE TABLE_SCHEMA=0x73697465
список всех таблиц из базы данных site - SELECT GROUP_CONCAT(COLUMN_NAME SEPARATOR 0x0a) FROM information_schema.COLUMNS WHERE TABLE_NAME=0x7573657273
список колонок таблицы users
Главной проблемой данной функции является то, что объем возвращаемых ей данных ограничен системной переменной group_concat_max_len, по умолчанию значение которой равняется 1024 байтам. Изменить это значение, внедрив конструкцию SET GLOBAL group_concat_max_len=val в SQL-инъекцию естественно не получится, так как MySQL не поддерживает выполнение нескольких запросов, разделенных точкой с запятой. Конечно можно было бы смириться с таким ограничением, если бы GROUP_CONCAT() наряду с ORDER BY и DESC/ASC поддерживал бы LIMIT, но этого не дано. Таким образом, использовать данную функцию удобно лишь при получении заведомо небольших объемов данных.
Leave a Reply