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


         

Навязывание запроса или SQL-injecting


Типичный сценарий взаимодействия с базой данных выглядит так: пользователь вводит некоторую информацию в поля запроса. Оттуда ее извлекает специальный скрипт и преобразует в строку запроса к базе данных, передавая серверу ее на выполнение:

$result = mysql_db_query("database", "select * from userTable

                     where login = '$userLogin' and password = '$userPassword' ");

Листинг 3 типичная схема формирования запроса к БД

Здесь: $userlogin – переменная, содержащая имя пользователя, а $userPassword – его пароль. Обратите внимание, что обе переменные размещены внутри текстовой строки, окаймленной кавычками. Это необычно для Си, но типично для интерпретируемых языков наподобие Perl'a и PHP. Подобный механизм называется интерполяцией строк и позволяет автоматически подставлять вместо переменной ее фактическое значение.

Допустим, пользователь введет KPNC/passwd, тогда строка запроса будет выглядеть так: "select * from userTable where login = 'KPNC' and password = 'passwd'". (пользовательский ввод выделен полужирным шрифтом). Если такой логиг/пароль действительно присутствуют в базе, функция сообщает идентификатор результата, в противном случае возвращается FALSE.

Хотите войти в систему под именем другого пользователя, зная его логин, но не зная пароль? Воспользуется тем, что механизм интерполяции позволяет атакующему воздействовать на строку запроса, видоизменяя ее по своему усмотрению. Посмотрим, что произойдет, если вместо пароля ввести последовательность "fuck' or '1'= '1" (естественно без кавычек): "select * from userTable where login = 'KPNC' and password = 'fuck' or '1' = '1'". Смотрите, кавычка, стоящая после fuck'a, замкнула пользовательский пароль, а весь последующий ввод попал в логическое выражение, навязанное базе данных атакующим.


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