Страница 5 из 10 INSERT & UPDATEОднако не только SELECT-ы являются уязвимым местом SQL. Не менее уязвимыми могут оказаться INSERT и UPDATE.
Допустим, на сайте есть возможность регистрации пользователей. Запрос, который добавляет нового пользователя: INSERT INTO `users` (`login`, `password`,`admin`) VALUES ('юзер', 'пароль',0);Уязвимость одного из полей позволяет модифицировать запрос с необходимыми данными.
В поле login добавляем юзер', 'пароль', 1)#тем самым добавив пользователя с правами админа. INSERT INTO `users` (`login`, `password`,`admin`) VALUES ('юзер', 'пароль', 1)# ,'пароль',0);Допустим, что поле `admin` находится перед полем `login`, соответственно трюк с заменой данных, которые идут после поля `login` не проходит. Вспоминаем, что синтаксис команды INSERT позволяет добавлять не только одну строчку, а несколько.
Пример уязвимости в поле login: $login= юзер', 'пароль'),(1,'хакер', 'пароль')# INSERT INTO `users` (`admin`,`login`, `password`) VALUES (0,'юзер', 'пароль'),(1,'хакер', 'пароль')#','пароль');
Таким образом создается 2 записи, одна с правами простого пользователя, другая с желаемыми правами админа.
Подобная ситуация и с UPDATE
Добавление дополнительных полей для изменения: $login=', `password`='', `admin`='1 Тогда подобный запрос UPDATE `users` SET `login`='чайник' WHERE `id`=2; Модифицируется следующим образом: UPDATE `users` SET `login`='', `password`='', `admin`='1' WHERE `id`=2; Что произойдет? Пользователь с ID 2 изменит логин и пароль на пустые значения и получит права админа.
Или в случае
$login = ', `password`='' WHERE `id` =1#
Логин и пароль админа станут пустыми. |