SQL-инъекция - допустимые подзапросы в T-SQL IN
Я пытаюсь изучить SQL-инъекцию и хотел спросить, можно ли выполнить какой-либо другой запрос, кроме select, в операторе SQL IN.
Нормальный синтаксис оператора IN это
select * from tableX where ID IN (select userId from tableY where colX='Y')
Я хотел бы передать в sql stmt через строку запроса, чтобы удалить всех пользователей в таблице.
Это возможно сделать, если этот внедренный sql выполняется внутри оператора IN.
Это то, чего я хочу достичь
select * from tableX where ID IN (delete tableY)
или же
select * from tableX where ID IN (update tableX set ID=100 where 1=1)
или же
select * from tableX where ID IN (exec(N'delete tableY'))
Я продолжаю получать странные синтаксические ошибки. Может быть, это не так, как в спецификации SQL. Но если кто-то знает о действующих подзапросах, которые могут помочь мне достичь цели, пожалуйста, напишите.
Изменить: должен был также добавить это.
Система уже имеет пару защит.
- Это значение передается SP как параметризованное значение.
Но у одного целого есть одна слабость
Единственное слабое место, которое я вижу, которое я пытаюсь использовать, - это создание строки SQL в SP с использованием переданного значения.
set @where = @where + 'ID IN (' + @htmlEncodedParametrizedParam + ')
Поэтому все, что мне нужно, чтобы нарушить этот код, это отправить только чистую строку sql (нет или), которую можно использовать в операторе IN.
Edit2: закодирован, чтобы проверить ответ @Dan. Безрезультатно
Create procedure HackTest
@qsVal nvarchar(200) = ''
As
Begin
declare @sql as nvarchar(1000)
set @sql = 'select * from AdventureWorks2008.Person.Person' + 'where PersontType IN (' + @qsVal + ')'
exec sp_executesql @sql
end
Ниже приведен запрос и какой профилировщик сервера MS Sql перехвачен для этих запросов
--http://localhost:11727/SampleSite/Default.aspx?a=NULL);delete%20tableY;--
exec hackTest @qsVal='NULL);delete tableY;--'
--http://localhost:11727/SampleSite/Default.aspx?a=NULL);update%20tableX%20set%20ID=100;--
exec hackTest @qsVal='NULL);update tableX set ID=100;--'
3 ответа
Нет, IN
Оператор разрешает только подзапрос или список выражений:
test_expression [ NOT ] IN ( subquery | expression [ ,...n ] )
Так что вы не можете использовать DELETE
или UPDATE
заявление там, но только SELECT
заявление.
Тем не менее, поскольку SQL Server поддерживает пакеты, вы можете просто добавить свой собственный оператор после SELECT
заявление:
SELECT … ; DELETE …
Вы можете смоделировать несколько запросов, например, это ваш запрос, параметр будет позже заменен вашей программой:
SELECT * FROM tableX WHERE ID IN (<somestring>)
если вы должны были заменить этот текст:
1); DROP TABLE tableY;--
вы получите такой исполняемый запрос:
SELECT * FROM tableX WHERE ID IN (1); DROP TABLE tableY;--)
Если приложение создает оператор SQL с конкатенацией строк, например:
selectQuery = "select * from tableX where ID IN (" + queryString + ")";
Эту конкретную уязвимость SQL-инъекции можно использовать, добавив "NULL);" затем вводится оператор SQL, а затем маркер комментария. Пример значения строки запроса:
NULL);delete tableY;--
NULL);update tableX set ID=100;--
Конечно, никогда не следует передавать оператор SQL через строку запроса. Лучшая защита от внедрения SQL - это просто использовать параметризованные запросы, а не создавать операторы с конкатенацией строк из ненадежных источников.