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.
źródło
Odpowiedzi:
Łatwy:
A może tak właśnie będzie
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 ...
źródło
SET LOCK_TIMEOUT 0;
,SET LANGUAGE Malaysian;
,SET ANSI_NULLS OFF:
...SET
wpływa tylko na ustawienia sesji, to w jaki sposób zmieniane są ustawienia satabazy i serwera (ALTER DATABASE ...;
?) SpowodowałobyDROP DATABASE ..;
więcej obrażeń, gdyby się udało;)SHUTDOWN
Polecenie lubKILL
Command (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.źródło
Możesz utworzyć tabelę, którą wypełniasz do końca czasu lub miejsca na dysku zabraknie tego, co nastąpi wcześniej.
źródło
while 1=1 insert t values('')
ma 30 ...create table x(i int)
=>while 1=1 insert t select 0
ma 27x:insert t select 0 GOTO x
ma dokładnie 26 lat.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.
źródło
Wariacja oparta na odpowiedzi @ MikaelEriksson i odpowiedzi @ MartinSmith na mój pierwszy komentarz:
Początkowo próbowałem wykonać oświadczenie WHILE, ale najlepsze, co mogłem zrobić, to 27 znaków:
Ale Martin zwrócił uwagę na GOTO:
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:
źródło
set @S = 'x:insert t;select 0;GOTO x';
dla przyszłej zgodności twojego ataku iniekcyjnego;);
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.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?
źródło