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

Можно ли сделать инъекцию в mssql 2008+ на любое изменение данных, если запрос строится по такому принципу:
exec('select ' + @fields + ' from ' + @table)
30 янв 14, 14:21    [15494683]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
Glory
Member

Откуда:
Сообщений: 104760
Можно
30 янв 14, 14:22    [15494688]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
igr_ok
Member

Откуда:
Сообщений: 170
SQLInjection
Здравствуйте.

Можно ли сделать инъекцию в mssql 2008+ на любое изменение данных, если запрос строится по такому принципу:
exec('select ' + @fields + ' from ' + @table)
Зависит от того, каким образом инфа попадает в переменную. Если ее вводит пользователь, то можно
30 янв 14, 14:44    [15494837]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQL Injection
Guest
а то
declare 
	@fields varchar(max) = '1
declare @db_name sysname = db_name()
exec (''alter database '' +  @db_name + '' set single_user with rollback immediate'')
exec sp_MSforeachtable ''truncate table ?''
select 1
'
, @table varchar(max) = '(select 1 as a) a'
	
	
exec('select ' + @fields + ' from ' + @table)
30 янв 14, 15:43    [15495366]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQLInjection
Guest
SQL Injection,

Спасибо, наглядно.

igr_ok
Если ее вводит пользователь
А то, иначе бы я об этом не задумался.

Значения в переменные попадают из xml-шаблона примерно такого вида:
<select fields="*" from="table" /> 
В шаблон они попадают вручную, но значения атрибутов можно ограничить в xsd регуляркой. Исходя из предоставленного выше примера, достаточно ли будет проверки на переносы строк?
30 янв 14, 18:07    [15496364]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
Glory
Member

Откуда:
Сообщений: 104760
SQLInjection
Исходя из предоставленного выше примера, достаточно ли будет проверки на переносы строк?
предложенный скрипт можно записать и в одну строку
30 янв 14, 18:09    [15496378]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
SQLInjection
Исходя из предоставленного выше примера, достаточно ли будет проверки на переносы строк?

Нет. Можно весь код в одну строку заструячить. Лучше использовать хранимые процедуры и параметризованные запросы.
30 янв 14, 18:11    [15496386]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
SQLInjection
Исходя из предоставленного выше примера, достаточно ли будет проверки на переносы строк?
Можно поменять запрос:
exec('select [' + @fields + '] from [' + @table + ']')

И делать проверку на наличие [ ] и одинарной кавычки
30 янв 14, 18:20    [15496423]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
alexeyvg
SQLInjection
Исходя из предоставленного выше примера, достаточно ли будет проверки на переносы строк?
Можно поменять запрос:
exec('select [' + @fields + '] from [' + @table + ']')


И делать проверку на наличие [ ] и одинарной кавычки
А, у вас же @fields может содержать много полей... Тогда сложнее...
30 янв 14, 18:20    [15496428]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
o-o
Guest
alexeyvg
SQLInjection
Исходя из предоставленного выше примера, достаточно ли будет проверки на переносы строк?
Можно поменять запрос:
exec('select [' + @fields + '] from [' + @table + ']')

И делать проверку на наличие [ ] и одинарной кавычки

так @fields же во множественном числе.
если он список передает, то на [' + @fields + '] будет syntax error
30 янв 14, 18:24    [15496445]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
o-o
Guest
+
чтоб не проверять наличие кв.скобок,
можно заюзать quotename,
он аккуратно все завернет

declare @name varchar(100) = 'kaka][bjaka';

declare @sql varchar(300) = 'create table ' +
                            (select quotename(@name) + ' (id int)'

print @sql
exec(@sql)
--------------------
create table [kaka]][bjaka] (id int)
30 янв 14, 18:35    [15496500]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
EvAlex
Member

Откуда: Israel
Сообщений: 1001
alexeyvg
SQLInjection
Исходя из предоставленного выше примера, достаточно ли будет проверки на переносы строк?
Можно поменять запрос:
exec('select [' + @fields + '] from [' + @table + ']')

И делать проверку на наличие [ ] и одинарной кавычки


не поможет.
CHAR(91) никто не отменял или CAST(0xB5 AS CHAR(1))
30 янв 14, 18:36    [15496510]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
o-o
Guest
EvAlex
alexeyvg
пропущено...
Можно поменять запрос:
exec('select [' + @fields + '] from [' + @table + ']')

И делать проверку на наличие [ ] и одинарной кавычки


не поможет.
CHAR(91) никто не отменял или CAST(0xB5 AS CHAR(1))


а мы и его quotename-ом добьем!

declare @name varchar(100) = 'kaka[]bjaka' + CHAR(91);

declare @sql varchar(300) = 'create table ' +
                            (select quotename(@name)) + ' (id int)'

print @sql
exec(@sql)
------------------------
create table [kaka[]]bjaka[] (id int)
30 янв 14, 18:41    [15496536]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQLInjection
Guest
предложенный скрипт можно записать и в одну строку

SQL2008
Нет. Можно весь код в одну строку заструячить. Лучше использовать хранимые процедуры и параметризованные запросы.
Жаль. У меня язык разметки данных, на одних хранимках и параметризованных запросах далеко не уедешь. table должно принимать название таблицы, вьюшки, хп или табличной функции, а fields, соответственно, всё, что может быть между select и from. Регулярка обезопасит table, но fields ей не по зубам. Достаточно одного fields, чтобы скомпрометировать запрос, а ведь есть еще и where и group и having и order...

Видимо, остается уповать лишь на то, что пользователи не сами себе злобные буратины.
30 янв 14, 18:42    [15496542]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
Тогда вам придется идти по пути "изнурительного программирования".
Вырезать из поля @fields все подозрительные слова, как-то
declare
drop 
truncate
update
exec

и т.п.
30 янв 14, 18:52    [15496587]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
Впрочем и простой select при грамотном подходе может много пакости принести.
30 янв 14, 18:54    [15496597]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
SQLInjection
Видимо, остается уповать лишь на то, что пользователи не сами себе злобные буратины.

Упование на порядочность/компетентность пользователя есть первый шаг к краху системы!
30 янв 14, 18:56    [15496609]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
o-o
Guest
SQL2008
Тогда вам придется идти по пути "изнурительного программирования".
Вырезать из поля @fields все подозрительные слова, как-то
declare
drop 
truncate
update
exec

и т.п.

но ведь товарищ EvAlex показал: любой текст можно CHAR-ами зафигачить.

список полей надо передавать не строкой, а таблицей.
и при формировании списка select каждую строку таблицы в свой quotename завернуть
30 янв 14, 19:04    [15496651]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4270
o-o, и CHAR тоже в общий список!
30 янв 14, 19:08    [15496669]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
EvAlex
alexeyvg
И делать проверку на наличие [ ] и одинарной кавычки


не поможет.
CHAR(91) никто не отменял или CAST(0xB5 AS CHAR(1))
Не прокатит без одинароной кавычки, ну будет имя у столбца - CAST(0xB5 AS CHAR(1)). Всё учтено :-)
30 янв 14, 19:10    [15496680]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQLInjection
Guest
SQL2008
SQLInjection
Видимо, остается уповать лишь на то, что пользователи не сами себе злобные буратины.

Упование на порядочность/компетентность пользователя есть первый шаг к краху системы!
Ну, "пользователь" он чисто для меня, по факту это человек, обладающий знаниями xml/xsl/tsql и разрабатывающий отчеты, и привести систему к краху он может примерно с тем же успехом, что быдлокодер любого другого звена. Эта проблема защиты кагбэ принципиальная, а не насущная :)
30 янв 14, 19:27    [15496747]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
o-o
Guest
а товарищ, запускающий код через ваше приложение,
с какими правами на сервер попадает?
может, у вас его виндовый логин передается, и ему только какие-то выборочные селекты грантованы,
а мы тут паримся :)

это к тому, что может достаточно не выдавать лишние права
30 янв 14, 19:44    [15496807]     Ответить | Цитировать Сообщить модератору
 Re: sql-инъекция  [new]
SQLInjection
Guest
o-o
это к тому, что может достаточно не выдавать лишние права
Само собой достаточно, но это же возня с правами. А я хотел "защиту от дурака" на уровне фильтра ввода, то есть уменьшить количество возни, а не увеличить.

В конце-концов, я делаю инструмент, а стучать им себя по голове или использовать по назначению, решает мастер.
30 янв 14, 20:16    [15496923]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить