[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SQL-инъекция
Leningrad00
Запрос:
INSERT INTO `banner_table`(`name`, `html`, `url`) VALUES ('Name', 'HTML', 'URL')

Все три значения вставляются из php-переменных, проходя всевозможные фильтры, кроме последней переменной: фильтр на обратный слэш отсутствует. То есть, если отправить в качестве последней переменной text text\, то этот слэш экранирует закрывающую одинарную кавычку и выполнение запроса завершается ошибкой.
Возникла дискуссия на тему опасности подобной, по сути, уязвимости. По моему скромному мнению, сделать из этого SQL-инъекцию невозможно, потому что где-то придется закрывать кавычку, которую экранирует слэш. А так как после обсуждаемого участка запроса больше пользовательских данных не имеется, то и преобразовать запрос в инъекцию не получится.
Таки можно ли из подобного запроса соорудить инъекцию?



Спустя 33 минуты, 42 секунды (24.01.2012 - 02:02) caballero написал(а):
чтобы избежать инекции не нужно всевозможных фильтров
достаточно проверять переменные целого типа, например c помощью is_integer[glow=][/glow]

Спустя 41 минута (24.01.2012 - 02:43) Leningrad00 написал(а):
Обсуждаемая переменная — текстовая достаточно произвольного содержания. При чем здесь переменные целого типа?
Первоначальный вопрос актуален.
Чтобы стало наглядней, представляю пример результирующего запроса с описанным экраном:
INSERT INTO `banner_table`(`name`, `html`, `url`) VALUES ('Баннер', 'Код баннера', 'www.ru\')

Спустя 4 часа, 29 минут, 19 секунд (24.01.2012 - 07:12) XCross написал(а):
Поставь себе на localhost какую-нибудь связку(Apache+PHP+MySQL) и ломай себя сколько хочешь.

Спустя 4 часа, 53 минуты, 30 секунд (24.01.2012 - 12:06) Guest написал(а):
@Leningrad00, какая к чертовой бабушке уязвимость, если все строковые переменные при вставке их в запросы нужно обрабатывать функцией mysql_real_escape_string (mysqli_real_escape_string).

Спустя 6 минут, 29 секунд (24.01.2012 - 12:12) neadekvat написал(а):
Я вот тоже не понял, что мешает применять mysql_real_escape_string для последней переменной, как это делается (я надеюсь) и для первой.

Спустя 12 минут, 49 секунд (24.01.2012 - 12:25) alex12060 написал(а):
Если не обрабатывать, то можно соорудить такую инекцию:


# ?t='); select * from `users` where `id` = ('1



INSERT INTO `banner_table`(`name`, `html`, `url`) VALUES ('Баннер', 'Код баннера', ''); select * from `users` where `id` = ('1')


Собственно, для недопущения таких фишек, следует использовать филтрацию функцией, которая была названа выше.

P.S. neadekvat - привет блудный сын! :)

Спустя 40 минут, 8 секунд (24.01.2012 - 13:05) neadekvat написал(а):
Свернутый текст
Цитата (alex12060 @ 24.01.2012 - 13:25)
neadekvat - привет блудный сын! smile.gif

Думаю, я тебе скорее в отцы гожусь smile.gif

Спустя 27 секунд (24.01.2012 - 13:05) Leningrad00 написал(а):
Уважаемые все, вопрос не стоит в том, как защититься от инъекции. Спасибо за советы, но прошу внимательно читать мой первый пост.
Вопрос исключительно академического характера: можно ли из поставленной задачи соорудить инъекцию?

alex12060, кавычка экранируется, посему предложенный вариант ?t=' превратится в ?t=\'. mysqli не используется, поэтому два запроса не прокатят.

Спустя 1 час, 38 минут, 51 секунда (24.01.2012 - 14:44) inpost написал(а):
То есть фильтры, то нет фильтров. Что-то вы темните.
Надо писать: переменная такая, обрабатывается функциями такими.
Тогда и можно будет "академически", то есть по глупому разобраться в проблеме.

Спустя 1 минута, 44 секунды (24.01.2012 - 14:46) inpost написал(а):
Слеш не экранируется, кавычка экранируется слешем. Слеш, экранирующий кавычку экранируется слешем, который не экранируется - вуаля, SQL-inj.
Всё доходчиво объяснил? smile.gif

Спустя 40 минут, 49 секунд (24.01.2012 - 15:27) Leningrad00 написал(а):
Доходчиво. Именно этот случай предусмотрели при написании скрипта и \' ничем более не экранируется :) Как и все остальные управляющие последовательности.

«Все три значения вставляются из php-переменных, проходя всевозможные фильтры, кроме последней переменной: фильтр на обратный слэш отсутствует». Доходчиво описано в первом посте?

Итак, кроме этого решения ничего другого предложить никто не может?

Спустя 3 минуты, 15 секунд (24.01.2012 - 15:30) inpost написал(а):
Leningrad00
А другие и не надо. Нашли уязвимость и хватит.
А если волнует безопасность, то выше рассказали, как обезопасить. Смысл из пустого в порожнее крутить тему ни о чём?

Спустя 8 минут, 44 секунды (24.01.2012 - 15:39) Leningrad00 написал(а):
Смысл в том, чтобы дать ответ на вопрос: можно ли из этого сделать SQL-инъекцию, то есть уязвимость.
Наш программист уверяет, что нельзя. Я сомневаюсь, но реализовать не сумел. Посему решил обратиться за помощью к массам на форум, на котором в свое время обитали вполне адекватные люди, которые на вопрос «как настроить перенаправление в Apache» не советовали юзать IIS, мол, там проще.

Спустя 4 минуты, 11 секунд (24.01.2012 - 15:43) inpost написал(а):
Leningrad00
Ну так я дал тебе ответ уже, что можно.
Ставь \' , или \\' и потом SQL-inj.
Если абсолютно всё так, как ты сказал - уже поломали. Если добавлены ДРУГИЕ ЗАЩИТЫ, то надо смотреть на код, а не фантазировать.
Тут нужен либо код, либо сайт. Но никак не пустые фантазии:
Цитата
- Я так,
- а так у нас уже защищено где-то там!
- Ок, тогда так?
- и так тоже защищено...
- а может так?
- ой-ой-ой, и так мы тоже защитились, какие мы умнички

Спустя 8 минут, 6 секунд (24.01.2012 - 15:51) Leningrad00 написал(а):
Всем спасибо.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.