SQL-injection

tickhack

BANNED
Messages
66
Reputation
1
Reaction score
12
Points
8
Please note, if you want to make a deal with this user, that it is blocked.
Давай с тобой разберемся что это за тип атаки - SQL-injection. Этот тип атак
применяется хакерами всего мира для несанкционированного доступа (читай -
удаления, модификации и т.п.) к информации находящейся в базе данных бажного
сайта. В этой статье я постараюсь кратко тебе объяснить что собой представляет
SQL-ная база данных, как можно получить доступ к данным хранящимся в ней и как
можно защетить свое приложение от атак подобного рода.

SQL (Structured Query Language) - Структурируемый Язык Запросов. Применяется
для управления информацией хранящейся в базах данных. Существует несколько
стандартов этого языка, но в настоящий момент используются различные реализации
стандарта SQL-99. Я не буду тебе полностью описывать весь стандарт, лишь упомяну
основные функции которые есть во всех без исключения СУБД построеных на этом
стандарте (MySQL, MSSQL и т.п.).
image.png


Это лишь основные команды, на самом деле их занчительно больше, и применяться
они могут с различными параметрами и в различных вариаций. После каждой команды
на языке SQL ставится символ ";". благодоря этому символу, в одной строке можно
задать сразу несколько команд.

Наибольший интерес для нас представляют две функции: SELECT и UNION. Первая,
кроме всего прочего является "универсальным оператором вывода". Нарпимер если
задать запрос как SELECT 1+1 то в результате мы получим 2. Функция UNION
позволяет объеденить вывод двух и более результатов. например SELECT 1+1 UNION
SELECT 1+1, в ответе мы получим соответственно 2 и 2. У функции UNION есть пара
ограничений. Во-первых: она была внедрена далеко не во все версии СУБД, например
для MySQL она работает только начиная с 4-й версии. Во-вторых: у объединяемых
результатов, в запросах должно стоять одинаковое количество (и типы) данных.
Т.е. мы не сможем с ее помощью объединить как вывод в одном запросе текстовых,
а в другом численных данных, так и вывод в одном запросе двух данных, а в другом
одного.

Теперь давай рассмотрим в чем же состоит судь багов типа SQL-injection.
Давай представим себе таблицу users, в которой содержаться идентификационный
номер пользователя, его логин и мыло и пароль.Например таблица выглядит
так:

image.png


Чтобы посмотреть информацию о пользователе с id=1 нам достаточно сконструировать
следущий запрос:
Code:
SELECT name, mail FROM users;

Теперь посмотрим как этот запрос реализуется в таком скриптовом языке как PHP.
Допутсим, на каком-либо сайте есть бажный скрипт mail.php принимающий в качестве
параметра id пользователа, и возвращающий его имя и адрес.Скрипт могбы выглядеть
например так:

Code:
";
  //выводим имя и адрес пользователя.
 }
?>

Соответственно строка броузера для того чтобы посмотреть мыло Васи будет
выглядеть так:
Code:
http://site.ru/mail.php?user=1

Человек обладающий логическим складом ума обязательно предположит что данные
выбираются из таблицы на основе функции SELECT. Соответственно тут вполне
вероятно может сработать функция UNION, и ему достаточно сконструировать вторую
часть запроса чтобы получить доступ к данным хранящимся в бд.
Пытливый читатель может меня спросить:"Но как он узнает что содержится в первой
части запроса? Он же скорее всего не видел код скрипта, не знает ни названия
таблиц, ни названия столбцов в них!". Тут нам на выручку приходит старый добрый
брут. Для начала необходимо узнать из скольки столбцов таблицы выбирается
результат. Сделать это просто, достаточно добавить к url +UNION+SELECT+1. Если
в первой части запроса выдаются данные более чем одного столбца, то скрипт выдаст
ошибку. Тогда увеличим количество значений во второй части еще на еденицу:
Code:
http://site.ru/mail.php?user=1+UNION+SELECT+1,1
Теперь скрипт вернет нам информацию о пользователе с id=1 и 1 1. Т.е. данные из
первой и второй части запросов. Далее нам нужно узнать название таблицы из
которой мы читаем данные. Делается это тоже обычным подбором. Логически можно
предположить что таблица содержащая данные такого рода будет называться либо
users либо mail_adres либо еще что-то в этом роде. Осталось всего ничего,
перепробовать все варианты =) После упорных трудов мы наконец находим нужное
сочетание и можем теперь посмотреь что содержиться в поле пароль:
Code:
http://site.ru/mail.php?user=1+UNION+SELECT+name,pass+FROM+users
А теперь немного деструктива:
Code:
http://site.ru/mail.php?user=1;+DROP+TABLES+user  =)

Так что же привело к тому что мы смогли провести такую атаку? Програмер просто
поленился встроить проверку на вводимые данные. Достаточно было отсеять пробелы
и ; и у нас ни чего бы не вышло.

P.S:
Автор этой статьи не ставил себе целю сделать специалиста по SQL-injection из
читателя, по этому тут приведена далеко не вся информация, но основы будем
надеяться я тебе дал =). А если читатель все-таки решить "углубить" свои знания
в этом вопросе - google вам в помощь!.
 

CepbIu

RIPPER
Messages
61
Reputation
9
Reaction score
19
Points
8
Code:
http://site.ru/mail.php?user=1+UNION+SELECT+name,pass+FROM+users--
 

tickhack

BANNED
Messages
66
Reputation
1
Reaction score
12
Points
8
Please note, if you want to make a deal with this user, that it is blocked.

McGrath

Moderator
Messages
1,007
Reputation
135
Reaction score
189
Points
63
Снесите статью:
1.
А теперь немного деструктива:
Код:
http://site.ru/mail.php?user=1;+DROP+TABLES+user =)
Это вообще не работает в mysql. А он описывал MySQL, автор вообще не в теме что он пишет.
Такого рода запись сработает только в MSSQL, а это MySQL, это видно из конструкции:
После упорных трудов мы наконец находим нужное
сочетание и можем теперь посмотреь что содержиться в поле пароль:
Код:
http://site.ru/mail.php?user=1+UNION+SELECT+name,pass+FROM+users
А MSSQL имеет конструкцию вида:
Code:
5'+or+1=(select+top+1+cast(id+as+nvarchar)+from+Users)--

И вообще статья бред непонятный.
Пример нормальной статьи: https://rdot.org/forum/showthread.php?t=124
3 поста с максимальным количеством символов в vbulletin. И то не всё влезло.
 
Top