Главная
 

Как бороться с SQL-инъекциями

Дата публикации: 
Сбт, 2011-09-17 23:34

О чем собственно речь
Как известно - базы данных и программы обмениваются между собой данными посредством SQL запросов. SQL - язык запросов, применяемый для управления, создания, изменения, а так же получения данных из БД.

Базы данных - мощный инструмент для работы с данными, позволяющий значительно ускорить работу программы (в сравнении с аналогичной программой, работающей с файлами, особенно если они зашифрованы).

Но со всей той пользой, БД имеет некоторые недостатки, которые связаны не столько с самой БД, сколько с возможными ошибками программистов, которые могут привести к непоправимым последствиям.

Ближе к делу
Существует вид атак на программы и вэб-приложения, использующие базу данных, называемый SQL-инъекциями. Эта атака заключается в подстановке в SQL запрос таких данных, которые полностью или частично меняют логику запроса. Уязвимость, позволяющая провести данный вид атак, находится непосредственно в коде скрипта или программы и заключается во вставке в текст запроса неконтролируемых данных.

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

$user = $_REQUEST['user'];
$query = mysql_query("SELECT * FROM `users` WHERE `username` = $user");

Ожидает следующих данных:

"http://test.ru/index.php?user=Ivan"

Скрипту передаются данные user=Ivan, и скрипт в ответ на них выдает какие-либо данные, которые должны быть доступны только пользователю Ivan.
Но если пользователь подправит запрос следующим образом, то в ответ получит все данные всех пользователей, что недопустимо:

"http://test.ru/index.php?user=Ivan+OR+1=1"

Так же данная уязвимость может быть использована посредством POST запросов, путем передачи скрипту непредусмотренных данных.
Данные могут вводиться в неявном виде, например на сайтах использующих BBcode:

|url=http://site.ru|Сайт|/url|

Обычно такие выражения в коде обрабатываются при помощи регулярных выражений. Из данного выражения в скриптом извлекается 2 переменных:
Значение первой будет адресом http://site.ru
Значение второй - анкором: Сайт

Оба этих значения требуют проверки, так как могут быть использованы злоумышленниками для атаки, если будут вноситься в БД в явном виде. Ярким примером служит такие форумные движки, как phpBB и SMF. В некоторых версиях этих движков были подобные уязвимости в BBcode. Разумеется, они были сразу же закрыты, после их обнаружения, но это показывает, что даже опытные программисты могут делать грубые ошибки.

Как искать данную уязвимость?
Найти уязвимость достаточно просто: вводить поочередно символы ' и " во все поля ввода сайта или программы, пытаться заменить все данные которые возможно, входящие в скрипт на эти символы.

Какие выводы можно сделать из всего этого?
1) Любые данные, поступающие в скрипт извне - должны быть обработаны, перед тем как передаться в запрос. В php есть функция, позволяющая проводить такую обработку:

$varible = mysql_real_escape_string($varible);

Данные, в случае если они по своей логике имеют небольшую длину - могут быть ограничены по длине.
Даныне могут быть явно переведены в тип данных, которому они должны соответствовать:

$number = (int) $number;

2) Если вы используете CMS – необходимо своевременно устанавливать все патчи и обновления безопасности. Либо если данное обновление еще не вышло, но вы обнаружили такую уязвимость - сообщить о ней в службу техподдержки. Так же можно попробовать самостоятельно изменить код CMS(если это разрешено лицензией производителя), но делать это нужно с большой осторожностью, так как вы можете открыть другие уязвимость закрыв эту или нарушить работу кода.

Связаться с нами