SQLi: Atak iniekcyjny

Co to jest wstrzykiwanie SQL?
SQLi to rodzaj ataku w aplikacji internetowej, w którym osoba atakująca może uruchamiać złośliwe zapytania w bazie danych witryny. SQL to technika wstrzykiwania kodu używana do wykonywania złośliwych instrukcji SQL.
Na przykład, jeśli chcesz zalogować się na stronie internetowej i zapomniałeś nazwy użytkownika i hasła, za pomocą wstrzyknięcia SQLi możemy zalogować się lub uzyskać dostęp do strony internetowej bez znajomości hasła.
Jak działa iniekcja SQL?
Wstrzyknięcie SQL zawiera wstawienie lub wstrzyknięcie zapytania SQL poprzez dane wejściowe od klienta w aplikacji. Są one wstrzykiwane do płaszczyzny danych, które wpływają na predefiniowane polecenia SQL.
SQL injection atakuje docelowe luki w dynamicznych instrukcjach SQL. Pomyśl o dynamicznej instrukcji SQL jak o wielowymiarowej funkcji matematycznej, której parametry są stałe, a wynik jest określony przez wartości umieszczone w zmiennych niezależnych.
Podobnie dynamiczna instrukcja SQL również składa się z predefiniowanego zestawu parametrów (takich jak formularz internetowy), a pełna instrukcja jest generowana tylko wtedy, gdy użytkownik wprowadzi dane.
Zobacz poniższy przykład instrukcji SQL formularza logowania:
SELECT * FROM users WHERE username = '$username' AND password = bcrypt ('$password')
Jeśli w dynamicznej instrukcji SQL istnieje luka, osoba atakująca może wprowadzić złożony skrypt w formularzu, aby uszkodzić istniejące parametry i zmienić znaczenie całej instrukcji.
Rodzaje iniekcji SQL:

In-band SQLi: In-band SQL injection to rodzaj iniekcji SQL, w której osoba atakująca otrzymuje wynik jako bezpośrednią odpowiedź za pośrednictwem tego samego kanału komunikacyjnego. Na przykład, jeśli osoba atakująca ręcznie przeprowadzi atak za pośrednictwem swojej przeglądarki internetowej, wyniki ataku zostaną wyświetlone w tej samej przeglądarce internetowej. Wstrzykiwanie SQL w paśmie jest również znane jako tradycyjne wstrzykiwanie SQL.
Iniekcja SQL oparta na błędach — w tym przypadku atakujący wykonuje określone działania, które powodują, że baza danych generuje komunikat o błędzie. Możesz użyć komunikatu o błędzie, aby określić, która baza danych jest używana, jakiej wersji serwera używa moduł obsługi itp.
Union-Based SQL injection — instrukcja generowana przez bazę danych w celu uzyskania pojedynczej odpowiedzi HTTP. Możesz utworzyć zapytanie w adresie URL lub połączyć wiele instrukcji w polu wejściowym, aby spróbować wygenerować odpowiedź
Blind SQLi : Blind SQL injection to rodzaj wstrzyknięcia SQL, w którym osoba atakująca nie otrzymuje jawnej odpowiedzi z atakowanej bazy danych, ale zamiast tego obserwuje zachowanie serwera bazy danych i aplikacji w celu stopniowej rekonstrukcji struktury bazy danych. Ślepe wstrzyknięcie SQL jest również znane jako wnioskowane wstrzyknięcie SQL.
Boolean Based — w tym przypadku atakujący wysyła zapytanie SQL do bazy danych i prosi aplikację o zwrócenie różnych wyników w zależności od tego, czy zapytanie zwróci True, czy False.
Time Based — w tym ataku osoba atakująca przesyła zapytanie SQL do bazy danych i powoduje, że baza danych czeka przez określony czas przed udostępnieniem wyników. Czas odpowiedzi pomaga atakującemu określić, czy zapytanie jest prawdziwe, czy fałszywe.
Out-of-Band SQLi: Out-of-Band SQL Injection (OOB SQLi) to rodzaj iniekcji SQL, w której atakujący nie otrzymuje odpowiedzi od atakowanej aplikacji przez ten sam kanał komunikacyjny, ale może zostać oszukany do wysłania dane do zdalnego punktu końcowego kontrolowanego przez atakującego. Wstrzykiwanie kodu SQL poza pasmem jest możliwe tylko wtedy, gdy używany serwer ma polecenia wyzwalające żądania DNS lub HTTP. Dotyczy to jednak wszystkich popularnych serwerów SQL.
Przykład na SQLi

Pierwszy przykład jest bardzo prosty. Pokazuje, w jaki sposób atakujący może wykorzystać lukę w zabezpieczeniach SQL Injection, aby obejść zabezpieczenia aplikacji i uwierzytelnić się jako administrator.
Poniższy skrypt jest pseudokodem wykonywanym na serwerze WWW. Jest to prosty przykład uwierzytelniania za pomocą nazwy użytkownika i hasła. Przykładowa baza danych zawiera tabelę o nazwie users
z następującymi kolumnami: username
i password
.
# Define POST variables
uname = request.POST['username']
passwd = request.POST['password']
# SQL query vulnerable to SQLi
sql = “SELECT id FROM users WHERE username=’” + uname + “’ AND password=’” + passwd + “’”
# Execute the SQL statement
database.execute(sql)
password' OR 1=1
SELECT id FROM users WHERE username='username' AND password='password' OR 1=1'
-- MySQL, MSSQL, Oracle, PostgreSQL, SQLite
' OR '1'='1' --
' OR '1'='1' /*
-- MySQL
' OR '1'='1' #
-- Access (using null characters)
' OR '1'='1' %00
' OR '1'='1' %16

Organizacje mogą stosować następujące zasady w celu ochrony przed atakami polegającymi na iniekcji SQL.
- Nigdy nie ufaj wpisom użytkownika. Zawsze należy je oczyścić przed użyciem w dynamicznych instrukcjach SQL.
Procedury składowane — umożliwiają enkapsulację instrukcji SQL i traktowanie wszystkich danych wejściowych jako parametrów. - Przygotowane instrukcje — Gotowe instrukcje, które najpierw konstruują instrukcję SQL, a następnie przetwarzają przesłane dane użytkownika jako parametry. Nie ma to wpływu na składnię instrukcji SQL.
Wyrażenia regularne — mogą być używane do wykrywania potencjalnie złośliwego kodu i usuwania go przed wykonaniem instrukcji SQL. - Uprawnienia użytkownika połączenia z bazą danych — Konto używane do łączenia się z bazą danych powinno mieć przyznane tylko niezbędne uprawnienia. Pomaga to zmniejszyć wydajność instrukcji SQL na serwerze.
- Komunikaty o błędach — nie ujawniają poufnych informacji ani dokładnej lokalizacji błędu. „Przepraszamy, wystąpił błąd techniczny. Skontaktowałem się z zespołem technicznym. Spróbuj ponownie później” zamiast wyświetlać instrukcję SQL, która spowodowała błąd.
Dokładnie to robi zapora sieciowa (WAF). Analizuj wszystkie dane wprowadzane przez użytkowników do Twojej aplikacji internetowej pod kątem zgodności z podejrzanym kodem.
Mamy nadzieję, że zrozumiałeś porównanie i rozumiesz pojęcia.
Zostaw komentarz i podziel się swoimi przemyśleniami !!
Autorski:
Akash Shekhavat, Madhuri Shelke, Chetan Shinde, Swarali Sole
Bibliografia:
https://learn.microsoft.com/en-us/sql/relational-databases/security/sql-injection?view=sql-server-ver16
https://systemweakness.com/sql-injection-attacks-53e942aae1f8
https://qawerk.com/blog/what-is-sql-injection/
https://brightsec.com/blog/sql-injection-attack/