База данных под прицелом


         

Поскольку один всегда равен одному,


Поскольку один всегда равен одному, запрос будет считаться выполненным при любом введенном пароле и SQL-сервер возвратит все-все-все записи из таблицы (в том числе и не относящиеся к логину KPNC)!

Рассмотрим другой пример: "SELECT * FROM userTable WHERE msg='$msg' AND ID=669". Здесь: msg – номер сообщения, извлекаемого из базы, а ID – идентификатор пользователя, автоматически подставляемый скриптом в строку запроса и непосредственно не связанный с пользовательским вводом (константная переменная использована по соображениям наглядности, в конечном скрипте будет скорее всего использована конструкция типа: ID='$userID'). Чтобы получить доступ к остальным полям базы (а не только тем, чей ID равен 669) необходимо отсечь последнее логическое условие. Это можно сделать внедрив в строку пользовательского ввода символов комментария ("--" и "/*" для MS SQL и MySQL соответственно). Текст, расположенный левее символов комментария, игнорируется. Если вместо номера сообщения ввести "1' AND ID=666 --", строка запроса примет следующий вид: "SELECT * FROM userTable WHERE msg='1' and ID= 666 --' AND ID=669" (блеклым цветом выделен текст комментария). Как следствие, атакующий получит возможность самостоятельно формировать ID, читая сообщения, предназначенные совсем для других пользователей.

Причем, одним лишь видоизменением полей SELECT'а дело не огранивается и существует угроза прорыва за его пределы. Некоторые SQL-сервера поддерживают возможность задания нескольких команд в одной строке, разделяя их из знаком ";", что позволяет атакующему выполнить любые SQL-команды, какие ему только заблагорассудится. Например, последовательность " '; DROP TABLE 'userTable' --", введенная в качестве имени пользователя или пароля, удаляет всю userTable на хрен!

Еще атакующий может сохранять часть таблицы в файл, подсовывая базе данных запрос типа "SELECT * FROM userTable INTO OUTFILE 'FileName'".

Содержание  Назад  Вперед