Современные информационные технологии/ 3.
Программное обеспечение
к.т.н.,
Исмаилов А.О., магистрант Тютеев Б.
Костанайский
государственный университет им.А.Байтурсынова
Выявление наличия SQL
инъекции
SQL injection - уязвимость,
возникающая как следствие недостаточной проверки принятых от пользователя
значений, в скрипте или программе.
В большинстве случаев, о наличии SQL
инъекции могут сказать ошибки, указывающие на то, что скрипт уязвим, а так же о
наличии ошибки в SQL запросе можно узнать по другим признакам.
Для проверки полностью ли фильтруются
параметры или нет, передаем несколько измененные значения этого параметра.
Например, вместо http://site/test.php?id=12 передаем.
http://site/test.php?id=12'
http://site/test.php?id=-12
то получаем результат примерно
такого содержания:
You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax
Если нет ошибок, то смотрим
изменилась ли структура сайта, если изменилась, то возможно есть SQL-инъекция.
На сегодняшний день для эксплуатации данной уязвимости не нужно иметь какие-либо
навыки в области программирования или быть специалистом в области
информационной безопасности, все заменяется уже готовым программным обеспечением
(далее ПО). Все что нужно это указать - уязвимый скрипт, все остальное сделает
программа. И эта опасная тенденция, т.к. любой желающий или заинтересованный
человек может воспользоваться специалистом ПО для эксплуатации уязвимости и
кражи данных. Злоумышленнику будет достаточно найти уязвимость в интересующем
его сайте, что так же довольно не трудно сделать, ведь все что нужно есть в
сети. Для начала можно использовать всезнающий google, вводим запрос:
site:evilnet.kz intext:sql syntax, т.е. мы спросили если ли на сайте evilnet.kz
(пример автора) страницы где содержится текст «sql syntax», подобный текст
выводится на страницы сайта при наличии ошибок в запросах sql. И если ответ
положительный как в нашем случае, то можно смело проходить по ссылке и
переходить от этапа поиска к этапу эксплуатации, но в google это лишь маленькая
доля того как можно найти уязвимость на сайте. Чаще всего используется
специальное ПО, которое сканирует страницы сайта и производит тест на наличие
уязвимостей. Подобные ПО
распространяются как с открытым исходным кодом как, например w3af так и в
коммерческом как всем известный MaxPatrol (от Positive Technologies). Что из
них лучше трудно судить, т. к. возможности использовать коммерческое ПО не
было ввиду большой стоимости данного продукта. Но и свободно распространяющееся
ПО показывает отличные результаты по поиску уязвимостей. Есть конечно вариант
найти уязвимость вручную, но это довольно долгий и трудоемкий процесс, который
отнимает массу времени и сил. Более того не посвященному человеку что-то найти
почти нереально, ввиду отсутствия определенных знаний и навыков. Время, как
известно деньги, наверное по этому коммерческие продукты такие дорогие.
SQL-инъекции не излечимая болезнь в
интернете, с которой борются уже не один год всё интернет сообщество, но даже
самые крупные и авторитетные проекты подвергаются взлому используя, казалось бы
примитивные ошибки в коде. Даже сайт авторитетного проекта как MySQL.com,
которое выпускает одноименную базу данные mysql был взломан с помощью
SQL-инъекции, что говорит о критическом положении дел.
На данный момент программ для
эксплуатации SQL-инъекций множество, но очень мало поддерживающих большое
количество Баз Данных как sqlmap, sqlmap имеет в своем арсенале поддержку
oracle, postgresql, DB2 и mysql, что делает ее универсальной, и очень удобной
при тесте на уязвимость.
Использовать SQL-инъекцию не сложно,
если есть под рукой тот же самый sqlmap, проблема sql-инъекций в большей
степени не в ПО, а в некачественном написании кода самого сайта, очень сложно
уследить за всем, если проект довольно большой, и пишется не одним человеком.
Для предотвращения ошибок в коде, и
возможных проблем в случае их эксплуатации для взлома необходимо придерживаться
определенных правил:
1.
для целых и дробных величин, перед их использованием в запросе
достаточно привести величину к нужному типу.
2.
$id=(int)$id;
$total=(float)$total;
или
3.
$id = intval($id); $total = floatval($total);
4.
для
строковых параметров, которые не используются в like, regexp и т.д., экранируем
кавычки.
5.
$str=mysql_real_escape_string($str);
(В целях безопасности рекомендуется использовать функцию
mysql_real_escape_string() вместо
addslashes() и mysql_escape_string(). Функция
учитывает кодировку текущего соединения с базой данных, поэтому ей необходимо передавать
указатель соединения.
3.
в строках, которые предполагается использовать внутри like, regexp
и т.д., необходимо так же заэкранировать специальные символы, применяющиеся в
этих операторах, если это необходимо. В противном случае, можно
задокументировать использование этих символов.
Литература: