Взламываем сайт через SQL-injection
Разберем на практике, как можно достать с сайта логины, пароли, данные банковских карт, и прочие поля, которые заполняют на сайтах.
Всем салют, дорогие друзья!
В сегодняшней статье мы с вами разберемся, как выполнить атаку на базу данных сайта, которая и называется SQL-injection.
Мы не рекомендуем пытаться находить уязвимости на сайтах, которые вам не принадлежат, если вы не имеете разрешение на проведение подобных действий. Это уголовно наказуемо.
Что же такое SQL инъекция?
Говоря простым языком — это атака на базу данных, которая позволит выполнить некоторое действие, которое не планировалось создателем скрипта. Что бы было проще понять, вот вам пример из жизни:
- Отец, написал в записке маме, чтобы она дала Васе 100 рублей и положил её на стол. Переработав это в шуточный SQL язык, мы получим:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе
- Так-как отец плохо написал записку (Корявый почерк), и оставил её на столе, её увидел брат Васи — Петя. Петя, будучи хакер, дописал там «ИЛИ Пете» и получился такой запрос:
ДОСТАНЬ ИЗ кошелька 100 РУБЛЕЙ И ДАЙ ИХ Васе ИЛИ Пете
- Мама прочитав записку, решила, что Васе она давала деньги вчера и дала 100 рублей Пете. Вот простой пример SQL инъекции из жизни :) Не фильтруя данные (мама еле разобрала почерк), Петя добился профита.
За дело!
Итак, дабы не взламывать чужой сайт, мы развернули собственный тестовый стенд на котором запустим DVWA.
Damn Vulnerable Web Application (DVWA) — это веб-приложение (сайт) на PHP/MySQL, которое чертовски уязвимо. Его главная цель — помочь хакерам протестировать их навыки и инструменты в легальном окружении
- Теперь откроем браузер и перейдем по адресу, на котором у нас висит DWVA. Обычно это один из двух адресов: 127.0.0.1 или же 192.168.1.100.
- Мы увидим вот такое окно:
Теперь можно потренироваться с SQL-Injection
- В поле User ID мы вводим значения:
1
или2
или3
и тд - В результате наш сервис выводит нам данные о пользователе.
- Скорее всего, скрипт обработки на стороне сервера выглядит примерно так:
<?php .... <Лишнее скрыто> .... mysql_query("SELECT id, First, Surname FROM db where 'id' = '<наш запрос>'"); .... ?>
Подставляя цифры 1, 2 или 3, у нас получается: where 'id'='<наше число>'
В реальной жизни вместо этих цифр могут быть логины, пароли, данные банковских карт, и прочие поля, которые вы вводите на сайтах. Так преступник может получить Ваши данные, которые Вы доверили сайту.
Давайте разберемся, почему так случилось?
mysql_query("SELECT id, First, Surname FROM db where 'id' = '<наш запрос>'");
- Мы проходим по всей базе данных, забираем значения
id
,First
,Surname
из таблицы db, которые удовлетворяют части where. Напримерid = 1
- Но на стороне сервера отсутствует фильтрация входных данных!
- И наши записи из поля ввода попали сразу в скрипт. Получилось следующее:
SELECT id, First, Surname FROM db where 'id' = '' OR '1'='1'
Ложь или Истина = Истина (всегда!)
Поэтому, когда происходит запрос, из БД выбирают данные, удовлетворяющие условию, которое всегда истина. А поскольку условие всегда истина - выводятся ВСЕ значения из текущей таблицы. Магия, не иначе.
Итак, основная идея - сделать инъекцию SQL кода в код запроса, тем самым изменив его так, что бы он вывел данные, к которым мы не должны были иметь доступ.
Разумеется, этот пример "детский" и будет довольно редко встречаться в вашей реальной практике (хотя кто знает... на каждого из нас хватит плохого кода от разработчиков).
Мы рекомендуем вам узнать больше об инъекциях, найти еще примеры, узнать о таких штуках, как комментарии, научиться составлять сложные запросы, и, самое главное, тренироваться на этой машине. Постепенно поднимать уровень безопасности до high (там появится фильтрование входных данных, которое нужно обходить).
В реальной жизни эта ошибка очень распространена и входит в топ 10 уязвимостей. Именно ее простота и огромная отдача сделали ей такую популярность.