Szukaj…
Wprowadzenie
Wstrzykiwanie SQL to próba dostępu do tabel bazy danych witryny poprzez wstrzyknięcie SQL w pole formularza. Jeśli serwer WWW nie chroni przed atakami iniekcji SQL, haker może oszukać bazę danych w celu uruchomienia dodatkowego kodu SQL. Wykonując własny kod SQL, hakerzy mogą ulepszyć dostęp do swojego konta, przeglądać prywatne informacje innych osób lub dokonywać innych modyfikacji bazy danych.
Próbka wtrysku SQL
Zakładając, że połączenie do modułu obsługi logowania do aplikacji internetowej wygląda następująco:
https://somepage.com/ajax/login.ashx?username=admin&password=123
Teraz w login.ashx czytasz te wartości:
strUserName = getHttpsRequestParameterString("username");
strPassword = getHttpsRequestParameterString("password");
i zapytaj bazę danych, aby ustalić, czy istnieje użytkownik z tym hasłem.
Więc konstruujesz ciąg zapytania SQL:
txtSQL = "SELECT * FROM Users WHERE username = '" + strUserName + "' AND password = '"+ strPassword +"'";
Działa to, jeśli nazwa użytkownika i hasło nie zawierają oferty.
Jeśli jednak jeden z parametrów zawiera cytat, kod SQL wysyłany do bazy danych będzie wyglądał następująco:
-- strUserName = "d'Alambert";
txtSQL = "SELECT * FROM Users WHERE username = 'd'Alambert' AND password = '123'";
Spowoduje to błąd składniowy, ponieważ cytat po d
w d'Alambert
kończy ciąg SQL.
Możesz to poprawić, usuwając cudzysłowy w nazwie użytkownika i haśle, np .:
strUserName = strUserName.Replace("'", "''");
strPassword = strPassword.Replace("'", "''");
Jednak bardziej odpowiednie jest użycie parametrów:
cmd.CommandText = "SELECT * FROM Users WHERE username = @username AND password = @password";
cmd.Parameters.Add("@username", strUserName);
cmd.Parameters.Add("@password", strPassword);
Jeśli nie użyjesz parametrów i zapomnisz zastąpić cudzysłowu nawet jedną z wartości, złośliwy użytkownik (aka hacker) może to wykorzystać do wykonania poleceń SQL w bazie danych.
Na przykład, jeśli atakujący jest zły, ustawia hasło na
lol'; DROP DATABASE master; --
i wtedy SQL będzie wyglądał następująco:
"SELECT * FROM Users WHERE username = 'somebody' AND password = 'lol'; DROP DATABASE master; --'";
Niestety, jest to poprawny SQL, a DB to wykona!
Ten rodzaj exploita nazywa się iniekcją SQL.
Szkodliwy użytkownik może zrobić wiele innych rzeczy, takich jak kradzież adresu e-mail każdego użytkownika, kradzież hasła każdego użytkownika, kradzież numerów kart kredytowych, kradzież dowolnej ilości danych w bazie danych itp.
Dlatego zawsze musisz uciec od swoich sznurków.
A fakt, że zawsze zapomnisz to zrobić wcześniej czy później, właśnie dlatego powinieneś używać parametrów. Ponieważ jeśli użyjesz parametrów, wówczas środowisko języka programowania wykona dla ciebie wszelkie niezbędne zmiany znaczenia.
prosta próbka do iniekcji
Jeśli instrukcja SQL jest zbudowana w następujący sposób:
SQL = "SELECT * FROM Users WHERE username = '" + user + "' AND password ='" + pw + "'";
db.execute(SQL);
Następnie haker może odzyskać dane, podając hasło takie jak pw' or '1'='1
; wynikowa instrukcja SQL będzie:
SELECT * FROM Users WHERE username = 'somebody' AND password ='pw' or '1'='1'
Ten przejdzie sprawdzanie hasła dla wszystkich wierszy w tabeli Users
ponieważ '1'='1'
jest zawsze prawdziwe.
Aby temu zapobiec, użyj parametrów SQL:
SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";
db.execute(SQL, [user, pw]);