PROCEDURE ANALYSE() – это процедура MySQL, которая исследует запрос и предлагает оптимальные типы данных для каждой колонки, участвующей в запросе. Процедура работает во всех версиях MySQL, начиная с третьей.
Синтаксис:
SELECT … FROM … WHERE … PROCEDURE ANALYSE([max_elements,[max_memory]])
При вызове процедуры, весь результат запроса переписывается и возвращаются следующие данные:
mysql> SELECT user_login, user_pass FROM wp_users WHERE ID=1 PROCEDURE ANALYSE(); +------------------------+------------------------------------+------------------------------------+------------+------------+------------------+-------+-------------------------+------+-----------------------------------------------------+ | Field_name | Min_value | Max_value | Min_length | Max_length | Empties_or_zeros | Nulls | Avg_value_or_avg_length | Std | Optimal_fieldtype | +------------------------+------------------------------------+------------------------------------+------------+------------+------------------+-------+-------------------------+------+-----------------------------------------------------+ | wp.wp_users.user_login | admin | admin | 5 | 5 | 0 | 0 | 5.0000 | NULL | ENUM('admin') NOT NULL | | wp.wp_users.user_pass | $P$BRxeOjv1sgBVgV82vO524AqG/5EdDD0 | $P$BRxeOjv1sgBVgV82vO524AqG/5EdDD0 | 34 | 34 | 0 | 0 | 34.0000 | NULL | ENUM('$P$BRxeOjv1sgBVgV82vO524AqG/5EdDD0') NOT NULL | +------------------------+------------------------------------+------------------------------------+------------+------------+------------------+-------+-------------------------+------+-----------------------------------------------------+ 2 rows in set (0.00 sec)
Ни один из аргументов PROCEDURE ANALYSE() не позволяет использовать подзапросы внутри них, однако процедуру можно использовать в SQL-инъекциях для получения имен колонок, которые участвуют в выборке, таблицы и текущей базы данных. Особенно это актуально для MySQL версии 4, где нет системной базы данных information_schema, хранящей информацию о всех БД, таблицах и их колонках. К сожалению, имеется ряд ограничений:
- процедура позволяет узнать имя только той таблицы, ее колонок и базы данных, которые непосредственно участвуют в запросе
- эти данные находятся в первом столбце (Field_name), и в такой ситуации многое зависит от конкретного веб-приложения – от того, как оно выводит данные, возвращаемые базой данных
Для перебора записей с необходимыми данными возможно использование оператора LIMIT:
SELECT user_login, user_pass FROM wp_users WHERE ID=1 PROCEDURE ANALYSE() — вернет первую запись при условии, что веб-приложение допускает получение нескольких записей, но выводит только первую
SELECT user_login, user_pass FROM wp_users WHERE ID=1 LIMIT 1,1 PROCEDURE ANALYSE() — вернет вторую запись (wp.wp_users.user_pass)
Кроме столбца Field_name интерес представляют Min_value, Max_value и Optimal_fieldtype, которые выводят содержание соответствующих столбцов. Эту возможность можно использовать в такой ситуации:
- имеется уязвимое веб-приложение, отображающее профили зарегистрированных пользователей;
- параметр ID не фильтруется;
- запрос для получения данных из БД имеет вид:
SELECT * FROM users WHERE id=1
в таблице users имеются столбцы login и status, последний отвечает за уровень привилегий пользователя;
Таким образом, используя PROCEDURE ANALYSE() и LIMIT, становится возможным подобрать запись пользователя с привилегиями администратора, и выявить содержание недоступных столбцов, в частности с паролями и другой конфиденциальной информацией пользователей. Правда, как уже говорилось, успех зависит от того, как веб-приложение обрабатывает и выводит данные из БД.
Читайте форум sla.ckers.org, там еще много чего интересного 😉
Leave a Reply