Внедрение SQL Server - какой урон наносится в 26 символов?

21

Я тестирую на устойчивость к внедрению атак на базу данных SQL Server.

Все имена таблиц в БД строчные, а в сопоставлении учитывается регистр символов Latin1_General_CS_AS .

Строка, которую я могу отправить, указывается в верхнем регистре и может содержать не более 26 символов. Поэтому я не могу отправить DROP TABLE, потому что имя таблицы будет в верхнем регистре, и, следовательно, оператор потерпит неудачу из-за сортировки.

Итак, какой максимальный урон я могу нанести за 26 символов?

РЕДАКТИРОВАТЬ

Я знаю все о параметризованных запросах и так далее - давайте представим, что человек, который разработал интерфейс, который создает запрос для отправки, в этом случае не использовал params.

Я также не пытаюсь сделать что-то гнусное, это система, созданная кем-то еще в той же организации.

Алан Б
источник
1
Мы воображаем или вы действительно тестируете ручку, и у вас есть требования, которые не позволяют вам избегать инъекций? Вы ищете способ сломать его отсутствие безопасности?
LowlyDBA
41
Почему даже можно оставить дверь открытой? Кажется, вы уже потратили больше времени на обдумывание этого, чем стоило бы закрыть дверь. Я воспринимаю это как бесполезное упражнение - если вы придумаете 10 уязвимостей, они скажут, что мы подключим эти 10 уязвимостей, и, конечно, не будет 11-й. Это то место, где нас "чистили" струны. / facepalm
Аарон Бертран
5
Это безумно расплывчатый и произвольный вопрос, и он даже теоретически не может быть решен. Есть и другие встроенные функции SQL Injection (разрешения, песочница, брандмауэры и т. Д.), И вам придется учитывать все эти вещи, чтобы ответить на этот вопрос.
Эван Кэрролл
2
Что обеспечивает ограничение в 26 символов? Приложение?
Джонатан Файт
7
Останови это. Просто прекрати это. Если параметризованные запросы доступны удаленно , используйте их . Если кто-то еще не знает, как их использовать, найдите достойный ресурс и попросите его прочитать. Если они не слушают, уведомите менеджера или руководителя, что они создают критические уязвимости безопасности (неразрушающее демо не повредит.) И откажитесь от обучения.
jpmc26

Ответы:

38

Легко:

GRANT EXECUTE TO LowlyDBA

Или, я думаю, в этом случае это будет

grant execute to lowlydba 

Выберите свой вариант по этому вопросу.

По всей вероятности, вы можете проверить это сейчас на вашей текущей системе, но любое количество небольших изменений в базе данных с течением времени может сделать ваше тестирование недействительным. Строка символов может измениться, кто-то может создать строчную хранимую процедуру, которая имеет разрушительный потенциал - что угодно. Вы никогда не можете сказать со 100% уверенностью, что нет разрушительной атаки на 26 персонажей, которую кто-либо мог бы построить.

Я предлагаю вам найти способ заставить разработчика следовать базовым отраслевым стандартам и наилучшим методам безопасности, хотя бы ради вас самих, поскольку, как я полагаю, кто-то, по крайней мере, частично несет ответственность в случае нарушений безопасности.

Редактировать:

А для злобности / веселья вы можете попробовать включить каждый флаг трассировки. Это было бы интересно наблюдать. Похоже на сообщение в блоге Брент Озар сделает ...

DBCC TRACEON(xxxx, -1)
LowlyDBA
источник
1
Кроме того , позволяет флаги трассировки: изменение различных случайных параметров: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ все они влияют только на вашу сессию.
Мартин Смит
2
@MartinSmith thnx. Если SETвлияет только на настройки сеанса, то как изменяются настройки базы данных и сервера ( ALTER DATABASE ...;?) DROP DATABASE ..;, Если это удастся нанести больше урона, чем тогда;)
ypercubeᵀᴹ
1
Изменяйте базу данных и sp_configure главным образом для настроек уровня БД и Сервера. Хотя вы можете достичь предела в 26 символов. Также эти специфические настройки на уровне базы данных используются, только если клиентское соединение не устанавливает их. И по умолчанию большинство или все делают.
Мартин Смит
7
Я напоминаю это замечание.
Брент Озар
22

Команда SHUTDOWNили KILLКоманда (выберите случайное число свыше 50) могут занимать значительно меньше 26 символов, хотя, надеюсь, учетная запись, выполняющая запросы приложения, не имеет достаточных разрешений для их выполнения.

Мартин Смит
источник
Обычно аккаунту тоже не нужно было бы сбрасывать таблицу ...
Грег
3
@ Грег да. Хотя можно предположить, что среда, которая рассматривает возможность внедрения SQL-кода, пока его длина мала, не соответствует рекомендациям по безопасности, и учетные записи могут не быть настроены с минимальными разрешениями.
Мартин Смит
14

Вы можете создать таблицу, которую вы будете заполнять, пока не закончится время или не закончится место на диске, в зависимости от того, что наступит раньше.

declare @S char(26);

set @S = 'create table t(c char(99))';
exec (@S);

set @S = 'insert t values('''')'
exec (@S);

set @S = 'insert t select c from t'
exec (@S);
exec (@S);
exec (@S);
exec (@S);
-- etc
Микаэль Эрикссон
источник
19
@AlanB Ну, тогда тебе понадобится что-то, что не позволит мне использовать слабость более одного раза.
Микаэль Эрикссон
1
tarnations ... while 1=1 insert t values('')это 30 ... create table x(i int)=> while 1=1 insert t select 0это 27
WernerCD
1
Можете ли вы использовать это, чтобы создать более длинную команду, чем ограничение на число символов, и затем выполнить это?
Lawtonfogle
1
@MartinSmith Я думал, что просто уйду так, но теперь мне просто нужно попробовать :). Даст вам знать, если я это выясню.
Микаэль Эрикссон
7
@WernerCD x:insert t select 0 GOTO xровно 26, хотя.
Мартин Смит
4

В зависимости от вашего определения ущерба вы можете выполнить следующее: WAITFOR DELAY '23: 59 'Чтобы быть по-настоящему злым, вы можете использовать инструмент нагрузочного тестирования, чтобы запустить его с 32 768 клиентов.

user143642
источник
1
Если строка введена в специальный пакет, который содержит блокировки, это может обеспечить жизнеспособный отказ в обслуживании в виде одного вызова без необходимости вызывать истощение потока.
Дэвид Спиллетт
3

Вариация, основанная на ответе @ MikaelEriksson и ответе @ MartinSmith на мой первоначальный комментарий:

declare @S char(26);

set @S = 'create table x(i int)';
exec (@S);

Сначала я пытался сделать оператор WHILE, но лучшее, что я мог сделать, это 27 символов:

set @S = 'while 1=1 insert t select 0'; -- fails at 27 characters
exec (@S);

Но Мартин указал GOTO:

set @S = 'x:insert t select 0 GOTO x';
exec (@S);

GOTO ... корень зла и создатель оператора вставки в бесконечный цикл из 26 символов.

С учетом сказанного ... может быть полезно придерживаться CHAR (99) вместо int, поскольку это будет занимать больше места. Другие опции либо используют более длинные имена и будут разбивать ограничение в 26 символов ..., либо используют меньше места для хранения в строке.

Полный код теста:

declare @S char(26);
set @S = 'drop table t;';
exec (@S);
GO

declare @S char(26);

set @S = 'create table t(c CHAR(99))';
exec (@S);

set @S = 'x:insert t select 0 GOTO x';
exec (@S);
GO
WernerCD
источник
1
set @S = 'x:insert t;select 0;GOTO x';для будущей совместимости вашей инъекционной атаки;)
ypercubeᵀᴹ
@ ypercubeᵀᴹ Вы добавили два ;s ... второй - отлично - заменяет пробел и работает, если не нужен. Первый прерывает запрос - отделяет оператор INSERT от оператора SELECT.
WernerCD
О да. Вот что происходит, когда никто не использует разделители! Мы не знаем, где заканчивается каждый запрос и когда начинается следующий!
ypercubeᵀᴹ
1
@WarnerCD Я знаю. Это была скорее шутка об устаревшей процедуре в SQL Server. Кажется, взять навсегда. Тем не менее, рекомендуется использовать точки с запятой между утверждениями, а не только там, где это требуется.
ypercubeᵀᴹ
2
@ yper Я сомневаюсь, что это когда-либо будет выполнено. Вероятно, существует тонна унаследованного кода, который будет нуждаться в добавлении пропущенных точек с запятой без особой коммерческой выгоды. И это может быть встроено в приложения, которые трудно или невозможно обновить.
Мартин Смит
0
XP_CMDSHELL 'SHUTDOWN -PF'

В зависимости от того, насколько разрушительным вы считаете отключение питания. :-)

Для этого требуется, чтобы на сервере был включен xp_cmdshell, чего нельзя сказать о последних нескольких версиях SQL Server. Также требуется, чтобы учетная запись службы имела право на отключение, которое может иметь или не иметь.

Включение xp_cmdshell, вероятно, выходит за пределы вашего ограничения в 26 символов. Вы позволите несколько инъекций?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE
Гринстоун Уолкер
источник
1
EXEC является необязательным, только если это первый оператор в пакете. Что, вероятно, не будет иметь место здесь.
Мартин Смит
@ Мартин Смит, хороший комментарий. EXEC добавляет 5 символов в каждую строку вызова процедуры, что увеличивает большинство из них более чем на 26 символов. Интересно, CREATE ALIAS поможет здесь?
Гринстоун Уолкер