Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Экранирование параметров  [new]
edyaN
Member

Откуда:
Сообщений: 185
Сегодня была очередная попытка взлома сайта. Если раньше все это блокировалось на уровне веб сервера (приложения), то на этот раз им удалось дойти до запроса в базу к таблице с пользователями. При этом им удалось вызвать ошибку синтаксиса при выполнении sql запроса. Приложение написано на php. Все запросы идут через sp_executesql с параметрами. Все параметры экранируются, а именно все одиночные и двойные кавычки удваиваются.
Глазами ошибку в запросе не нашел, выполняется запрос в студии без ошибки. Думаю, что в данных был непечатаемый символ, который в логи не записался(хотя это очень странно).
Скажите пожалуйста, какие символы ещё надо экранировать кроме кавычек?
вот эта строка:
Модератор: Удалено по просьбе автора


Сообщение было отредактировано: 17 мар 16, 00:41
16 мар 16, 14:39    [18938313]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
https://technet.microsoft.com/en-us/library/ms161953(v=sql.105).aspx
16 мар 16, 14:42    [18938342]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51300
edyaN
Все запросы идут через sp_executesql с параметрами. Все параметры экранируются, а именно все одиночные и двойные кавычки удваиваются.

Вообще-то это взаимоисключающие вещи. При использовании параметров значения не надо экранировать. Раз они экранируются, значит параметры не используются.
16 мар 16, 15:05    [18938504]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
edyaN
Member

Откуда:
Сообщений: 185
Dimitry Sibiryakov
edyaN
Все запросы идут через sp_executesql с параметрами. Все параметры экранируются, а именно все одиночные и двойные кавычки удваиваются.

Вообще-то это взаимоисключающие вещи. При использовании параметров значения не надо экранировать. Раз они экранируются, значит параметры не используются.

Вы описали случай, когда параметры экранируются драйвером, мы этого не видим, да и не хотим. В моем случае параметризирование драйвером не используется в силу многих факторов, обсуждение которых выходит за рамки обсуждаемой темы. В приложении формируется строка
execute sp_executesql "<sql query>", N'<param definition>', @p0= '<param values>' ...

при этом та часть, которая содержит данные (param values) проходит, через функцию, удваивающую все кавычки.
Вопрос в том, достаточно ли удваивания кавычек для исключения sql injection? Если да, то как можно объяснить ситуацию, описанную в первом сообщении.
16 мар 16, 17:19    [18939486]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
edyaN
Member

Откуда:
Сообщений: 185
для истории: разобрался и смог воспроизвести. Это баг в нативном драйвере для линукса. Воспроизводится, есть послать строку содержащую нулевой байт.
17 мар 16, 17:34    [18944682]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
Glory
Member

Откуда:
Сообщений: 104760
edyaN
Это баг в нативном драйвере для линукса. Воспроизводится, есть послать строку содержащую нулевой байт.

Воспроизводится на сервере в студии ?
17 мар 16, 17:41    [18944725]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
edyaN
Member

Откуда:
Сообщений: 185
Glory,

нет, в студии не воспроизводится. Только в скрипте и только с нативным драйвером для линукса.
17 мар 16, 17:58    [18944807]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
edyaN
для истории: разобрался и смог воспроизвести. Это баг в нативном драйвере для линукса. Воспроизводится, есть послать строку содержащую нулевой байт.
А на сервере то что происходит если в линуксе нулевой байт послать?
17 мар 16, 18:57    [18945053]     Ответить | Цитировать Сообщить модератору
 Re: Экранирование параметров  [new]
edyaN
Member

Откуда:
Сообщений: 185
Mind,

профайлер показывает, что пришел запрос который оканчивается нулевым символом, а все, что стоит после этого на сервер не отправляется. Отсюда и ошибка о незакрытой кавычке. Ну строго говоря это и правильно, поскольку строки должны заканчиваться нулевым байтом.

например
select * from table where field = ?

в приложении это трансформируется в
exec dbo.sp_executesql N'select * from table where field = @p1', '@p1 varchar(10)', @p='some text'

но если вместо 'some text' использовать chr(0) + 'some text', то отправляется
exec dbo.sp_executesql N'select * from table where field = @p1', '@p1 varchar(10)', @p='

т.е. в конце не хватает остатка строки.
Это полностью проблема приложения, так как нормальные запросы не должны содержать нулевой байт
17 мар 16, 21:36    [18945530]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить