Современные информационные технологии/ 3. Программное обеспечение

 

к.т.н., Исмаилов А.О., магистрант Тютеев Б.

Костанайский государственный университет им.А.Байтурсынова

Выявление наличия SQL инъекции

 

SQL injection - уязвимость, возникающая как следствие недостаточной проверки принятых от пользователя значений, в скрипте или программе.

В большинстве случаев, о наличии SQL инъекции могут сказать ошибки, указывающие на то, что скрипт уязвим, а так же о наличии ошибки в SQL запросе можно узнать по другим признакам.

Для проверки полностью ли фильтруются параметры или нет, передаем несколько измененные значения этого параметра. Например, вместо http://site/test.php?id=12 передаем.

http://site/test.php?id=12'

http://site/test.php?id=-12

http://site/test.php?id=13-1

то получаем результат примерно такого содержания:

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 и т.д., необходимо так же заэкранировать специальные символы, применяющиеся в этих операторах, если это необходимо. В противном случае, можно задокументировать использование этих символов.

 

Литература:

http://securitylab.ru

http://ptsecurity.ru