Wstrzyknięcie SQL Server - ile szkód w 26 znakach?

21

Testuję odporność na ataki z zastrzyków na bazę danych SQL Server.

Wszystkie nazwy tabel w bazie danych są pisane małymi literami, a w sortowaniu rozróżniana jest wielkość liter , Latin1_General_CS_AS .

Ciąg, który mogę wysłać, jest wymuszony dużymi literami i może mieć maksymalnie 26 znaków. Nie mogę więc wysłać tabeli DROP, ponieważ nazwa tabeli byłaby zapisana wielkimi literami, a zatem instrukcja nie powiodła się z powodu sortowania.

Więc - jakie maksymalne obrażenia mógłbym zadać 26 postaciom?

EDYTOWAĆ

Wiem wszystko o sparametryzowanych zapytaniach i tak dalej - wyobraźmy sobie, że osoba, która opracowała interfejs, który buduje zapytanie do wysłania, nie użyła parametrów w tym przypadku.

Nie próbuję też robić nic złego, jest to system zbudowany przez kogoś innego w tej samej organizacji.

Alan B.
źródło
1
Czy wyobrażamy sobie, czy rzeczywiście przeprowadzasz testy za pomocą pióra i masz wymagania, które uniemożliwiają unikanie iniekcji? Szukasz sposobu na przełamanie jego braku bezpieczeństwa?
LowlyDBA
41
Dlaczego nawet istnieje możliwość pozostawienia otwartych drzwi? Wygląda na to, że zastanawiałeś się już nad tym dłużej, niż zamknięcie drzwi byłoby kosztowne. Uważam to za bezowocne ćwiczenie - jeśli wymyślisz 10 luk, powiedzą, usuniemy te 10 luk, a na pewno nie będzie 11. To tutaj doprowadziły nas ciągi „oczyszczające”. / facepalm
Aaron Bertrand
5
To szalenie niejasne i arbitralne pytanie, na które nawet teoretycznie nie można się odnieść. Istnieją inne natywne funkcje łagodzące SQL Injection (uprawnienia, piaskownica, zapory ogniowe itp.). Aby odpowiedzieć na to pytanie, musisz wziąć pod uwagę wszystkie te rzeczy.
Evan Carroll
2
Co egzekwuje limit 26 znaków? Aplikacja?
Jonathan Fite
7
Przestań. Po prostu przestań. Jeśli sparametryzowane zapytania są zdalnie opcją, skorzystaj z nich . Jeśli ktoś nie wie, jak z nich korzystać, znajdź porządny zasób i poproś go o przeczytanie. Jeśli nie słuchają, powiadom menedżera lub przełożonego, że produkują krytyczne luki w zabezpieczeniach (demo nieniszczące nie zaszkodzi.) I odmówią edukacji.
jpmc26

Odpowiedzi:

38

Łatwy:

GRANT EXECUTE TO LowlyDBA

A może tak właśnie będzie

grant execute to lowlydba 

Wybierz różne warianty tego.

Najprawdopodobniej możesz być w stanie przetestować to teraz na obecnym systemie, ale dowolna liczba drobnych zmian w bazie danych w czasie może unieważnić twoje testowanie. Ciąg znaków może się zmienić, ktoś może utworzyć procedurę składowaną małymi literami, która ma destrukcyjny potencjał - cokolwiek. Nigdy nie możesz powiedzieć ze 100% pewnością, że nie ma niszczycielskiego ataku 26 postaci, który ktoś mógłby wykonać.

Sugeruję, abyś znalazł sposób, aby programiści postępowali zgodnie z podstawowymi najlepszymi w branży najlepszymi praktykami bezpieczeństwa, choćby dla własnego dobra, ponieważ ktoś, kogo, jak sądzę, jest przynajmniej częściowo odpowiedzialny za naruszenia bezpieczeństwa.

Edytować:

A jeśli chodzi o złośliwość / zabawę, możesz spróbować włączyć każdą flagę śledzenia. To byłoby interesujące do zaobserwowania. Wygląda na to, że post na blogu Brent Ozar zrobiłby ...

DBCC TRACEON(xxxx, -1)
LowlyDBA
źródło
1
Oprócz umożliwienia flagi śledzenia: zmieniając różne losowe ustawienia: SET LOCK_TIMEOUT 0;, SET LANGUAGE Malaysian;, SET ANSI_NULLS OFF:...
ypercubeᵀᴹ
2
@ ypercubeᵀᴹ będą miały wpływ tylko na twoją sesję.
Martin Smith
2
@MartinSmith thnx. Jeśli SETwpływa tylko na ustawienia sesji, to w jaki sposób zmieniane są ustawienia satabazy i serwera ( ALTER DATABASE ...;?) Spowodowałoby DROP DATABASE ..;więcej obrażeń, gdyby się udało;)
ypercubeᵀᴹ
1
Zmień bazę danych i sp_configure głównie dla ustawień DB i poziomu serwera. Mimo to możesz przekroczyć limit 26 znaków. Te określone ustawienia na poziomie bazy danych są używane tylko wtedy, gdy połączenie klienta ich nie ustawia. I domyślnie większość lub wszyscy tak.
Martin Smith
7
Przypominam tę uwagę.
Brent Ozar
22

SHUTDOWNPolecenie lub KILLCommand (wybrać losową liczbę ponad 50) zarówno przyjąć znacznie mniej niż 26 znaków, choć rachunek wykonywania zapytań aplikacji oby nie ma wystarczających uprawnień do uruchamiania tych.

Martin Smith
źródło
Zwykle konto też nie potrzebuje drop table ...
Greg
3
@Greg tak. Chociaż można przypuszczać, że środowisko rozważające zezwolenie na wstrzyknięcie SQL, o ile jego długość jest krótka, nie jest zgodne z najlepszymi praktykami bezpieczeństwa, a konta mogą nie być skonfigurowane z minimalnymi uprawnieniami.
Martin Smith
14

Możesz utworzyć tabelę, którą wypełniasz do końca czasu lub miejsca na dysku zabraknie tego, co nastąpi wcześniej.

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
Mikael Eriksson
źródło
19
@AlanB Cóż, wtedy potrzebujesz czegoś, co uniemożliwi mi wykorzystanie słabości więcej niż raz.
Mikael Eriksson
1
tarnations ... while 1=1 insert t values('')ma 30 ... create table x(i int)=> while 1=1 insert t select 0ma 27
WernerCD
1
Czy możesz użyć tego do zbudowania dłuższego polecenia niż limit znaków, a następnie wykonać to?
Lawtonfogle,
1
@MartinSmith Myślałem, że po prostu tak odejdę, ale teraz muszę tylko spróbować :). Powiadomię cię, jeśli to rozgryzę.
Mikael Eriksson
7
@WernerCD x:insert t select 0 GOTO xma dokładnie 26 lat.
Martin Smith
4

W zależności od definicji szkody możesz uruchomić to: WAITFOR DELAY '23: 59 'Aby być naprawdę złym, możesz użyć narzędzia do testowania obciążenia, aby uruchomić to z 32 768 klientów.

użytkownik143642
źródło
1
Jeśli ciąg zostanie wstrzyknięty do partii ad-hoc, która zawiera zamki, może stanowić realną odmowę usługi jako pojedyncze wywołanie bez potrzeby powodowania głodu wątku.
David Spillett
3

Wariacja oparta na odpowiedzi @ MikaelEriksson i odpowiedzi @ MartinSmith na mój pierwszy komentarz:

declare @S char(26);

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

Początkowo próbowałem wykonać oświadczenie WHILE, ale najlepsze, co mogłem zrobić, to 27 znaków:

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

Ale Martin zwrócił uwagę na GOTO:

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

GOTO ... źródło wszelkiego zła i twórca instrukcji wstawiania w nieskończonej pętli w 26 znakach.

Mając to na uwadze ... może być korzystne trzymanie się CHAR (99) zamiast int, ponieważ to zajmowałoby więcej miejsca. Inne opcje albo używają dłuższych nazw i zmniejszają limit 26 znaków ... lub zużywają mniej miejsca na wiersz.

Pełny kod testowy:

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
źródło
1
set @S = 'x:insert t;select 0;GOTO x';dla przyszłej zgodności twojego ataku iniekcyjnego;)
ypercubeᵀᴹ
@ ypercubeᵀᴹ Dodałeś dwa ;s ... drugi jest w porządku - zastępuje spację i działa, jeśli nie jest potrzebny. Pierwszy przerywa zapytanie - oddziela instrukcję INSERT od instrukcji SELECT.
WernerCD
O tak. Tak się dzieje, gdy nie używa się separatorów! Nie wiemy, gdzie kończy się każde zapytanie i kiedy zaczyna się następne!
ypercubeᵀᴹ
1
@WarnerCD Wiem. To był raczej żart na temat amortyzacji w SQL Server. Wydaje się, że trwa to wiecznie. Mimo to dobrą praktyką jest stosowanie średników między instrukcjami, a nie tylko tam, gdzie jest to wymagane.
ypercubeᵀᴹ
2
@yper Wątpię, czy kiedykolwiek będzie egzekwowane. Prawdopodobnie istnieje mnóstwo starszego kodu, który wymagałby dodania brakujących średników bez żadnej szczególnej wartości biznesowej. I może być osadzony w aplikacjach trudnych lub niemożliwych do aktualizacji.
Martin Smith
0
XP_CMDSHELL 'SHUTDOWN -PF'

W zależności od tego, jak szkodliwe uważasz za wyłączenie. :-)

Wymaga to włączenia xp_cmdshell na serwerze, czego nie ma w przypadku kilku ostatnich wersji SQL Server. Wymaga również, aby konto usługi miało prawo do zamknięcia, które może mieć lub nie.

Włączenie xp_cmdshell prawdopodobnie przekracza limit 26 znaków. Czy pozwoliłbyś na wielokrotne zastrzyki?

SP_CONFIGURE 'SHOW ADV',1

RECONFIGURE

SP_CONFIGURE 'XP', 1

RECONFIGURE
Greenstone Walker
źródło
1
EXEC jest opcjonalny tylko wtedy, gdy jest to pierwsza instrukcja w partii. Co prawdopodobnie nie będzie miało miejsca w tym przypadku.
Martin Smith
@Martin Smith, dobry komentarz. EXEC dodaje 5 znaków do każdej linii wywołania procedury, co powoduje, że większość z nich przekracza 26 znaków. Zastanawiam się, czy STWÓRZ ALIAS pomógłby tutaj?
Greenstone Walker