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


         

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


Соответствующий ему URL уязвимого скрипта может выглядеть например так: www.victim.com/admin.php?op=login&pwd=123&aid=Admin'%20INTO%20OUTFILE%20'/path_to_file/pwd.txt, где path_to_file – путь к файлу pwd.txt, в который будет записан админивский пароль. Удобное средство для похищения данных, не так ли? Главное – размесить файл в таком месте откуда его потом будет можно беспрепятственно утянуть, например, в одном из публичных WWW-каталогах. Тогда полный путь к файлу должен выглядеть приблизительно так: "../../../../WWW/myfile.txt". (точная форма запроса зависит от конфигурации сервера). Но это еще только цветочки! Возможность создания файлов на сервере, позволяет засылать на атакуемую машину собственные скрипты (например, скрипт, дающий удаленный shell – "<? passthru($cmd) ?>"). Естественно, максимальный размер скрипта ограничен предельно допустимой длиной формы пользовательского ввода, но это ограничение зачастую удается обойти ручным формированием запроса в URL, или использованием SQL-команды INSERT INTO, добавляющей новые записи в таблицу.

Скорректированный URL-запрос может выглядеть например так: http://www.victim.com/index.php?id=12' или так: http://www.victim.com/index.php?id=12+union+select+null,null,null+from+table1 /*. Последний запрос работает только на MySQL версии 4.х и выше, поддерживающий union (объединение нескольких запросов в одной строке). Здесь table1 – имя таблицы, содержимое которой необходимо вывести на экран.

Атаки подобного типа называются SQL-инъекциями (SQL-injection) и являются частным случаем более общих атак, основанных на ошибках фильтрации и интерполяции строк. Мы словно "впрыскиваем" в форму запроса к базе данных собственную команду, прокалывая хакерской иглой тело уязвимого скрипта (отсюда и "инъекции" ). Это не ошибка SQL-сервера (как часто принято считать). Это – ошибка разработчиков скрипта. Грамотно спроектированный скрпит должен проверять пользовательский ввод на предмет присутствия потенциально опасных символов (как-то: одиночная кавычка, точка с запятой, двойное тире, а для MySQL еще и символ звездочки), включая и их шестнадцатеричные эквиваленты, задаваемые через префикс "%", а именно: %27, %2A и %3B. (Код символа двойного тире фильтровать не нужно, т. к.


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