Впорскування SQL Server - скільки шкоди за 26 символів?


21

Я тестую на стійкість до ін'єкційних атак на базу даних SQL Server.

Усі назви таблиць у db мають малі регістри , а зіставлення залежить від регістру, Latin1_General_CS_AS .

Рядок, який я можу надсилати, примусовий до великої літери, і може мати максимум 26 символів. Тому я не можу надсилати таблицю DROP, оскільки ім'я таблиці буде великим, і, таким чином, операція не працює через зіставлення.

Отже - який максимальний збиток я міг завдати 26 символам?

EDIT

Я знаю все про параметризовані запити тощо - давайте уявимо, що особа, яка розробила передню частину, яка будує запит для надсилання, не використовувала парами в цьому випадку.

Я також не намагаюся робити щось гнусне, це система, побудована кимось ще в одній організації.


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)

1
Крім того , дозволяє прапори трасування: зміна різних випадкових параметрів: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ

2
@ ypercubeᵀᴹ, вони впливали б лише на ваш власний сеанс.
Мартін Сміт

2
@MartinSmith thnx. Якщо це SETстосується лише налаштувань сеансу, то як зміни satabase та налаштування сервера ( ALTER DATABASE ...;?) Нанесуть DROP DATABASE ..;більше шкоди, якщо це вдасться;)
ypercubeᵀᴹ

1
Змінюйте базу даних та налаштування sp_configure переважно для налаштувань рівня DB та Server. Хоча ви можете досягти межі 26 символів за допомогою цих. Також ці конкретні налаштування на рівні бази даних використовуються лише в тому випадку, якщо клієнтське з'єднання їх не встановлює. І за замовчуванням більшість чи всі.
Мартін Сміт

7
Я нагадую це зауваження.
Брент Озар

22

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


Зазвичай для цього облікового запису також не знадобиться таблиця "
Грег,

3
@Greg так. Хоча ви можете припустити, що середовище, яка розглядає можливість введення 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('')is 30 ... create table x(i int)=> while 1=1 insert t select 0is 27
WernerCD

1
Чи можете ви скористатися цією командою для створення більш тривалої команди, ніж обмеження символів, а потім виконати це?
Lawtonfogle

1
@MartinSmith Я думав, що просто поїду так, але тепер мені просто спробувати :). Повідомлю вас, якщо я це зрозумію.
Мікаель Ерікссон

7
@WernerCD x:insert t select 0 GOTO x- це рівно 26.
Мартін Сміт

4

Залежно від вашого визначення шкоди, ви можете запустити це: ЗАСТОСУВАННЯ ВАЙТФОР '23: 59' Щоб бути справді злим, ви можете скористатися інструментом тестування навантаження, щоб запустити це від 32 768 клієнтів.



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

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 є необов'язковим лише в тому випадку, якщо це перше твердження в партії. Що, мабуть, тут не буде.
Мартін Сміт

@Martin Smith, хороший коментар. EXEC додає 5 символів до кожної лінії виклику процедури, що надає більшість з них понад 26 символів. Цікаво, чи допоможе CREATE ALIAS тут?
Greenstone Walker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.