Jest kilka przypadków, w których ta funkcja ucieczki nie powiedzie się. Najbardziej oczywiste jest, gdy nie jest używany pojedynczy cytat:
string table= "\"" + table.Replace("'", "''") + "\""
string var= "`" + var.Replace("'", "''") + "`"
string index= " " + index.Replace("'", "''") + " "
string query = "select * from `"+table+"` where name=\""+var+"\" or id="+index
W takim przypadku możesz „wyłamać się” za pomocą podwójnego cudzysłowu, czyli back-tick. W ostatnim przypadku nie ma się z czego "wyłamywać", więc możesz po prostu napisać 1 union select password from users--
lub jakikolwiek inny ładunek sql, jakiego chce napastnik.
Następnym warunkiem, w którym ta funkcja ucieczki nie powiedzie się, jest pobranie podciągu po tym, jak ten ciąg zostanie zmieniony (i tak Znalazłem takie luki na wolności):
string userPassword= userPassword.Replace("'", "''")
string userName= userInput.Replace("'", "''")
userName = substr(userName,0,10)
string query = "select * from users where name='"+userName+"' and password='"+userPassword+"'";
W tym przypadku nazwa użytkownika abcdefgji'
zostanie zamieniony na abcdefgji''
przez funkcję escape, a następnie zamieniony z powrotem w abcdefgji'
biorąc podciąg. Można to wykorzystać, ustawiając wartość hasła na dowolną instrukcję sql, w tym przypadku or 1=1--
byłaby interpretowana jako sql, a nazwa użytkownika byłaby interpretowana jako abcdefgji'' and password=
. Wynikowe zapytanie jest następujące:
select * from users where name='abcdefgji'' and password=' or 1=1--
T-SQL i inne zaawansowane techniki wstrzykiwania sql zostały już wspomniane. Zaawansowane wstrzykiwanie SQL w aplikacjach SQL Server to świetny artykuł i powinieneś go przeczytać, jeśli jeszcze tego nie zrobiłeś.
Ostatnią kwestią są ataki Unicode. Ta klasa luk w zabezpieczeniach pojawia się, ponieważ funkcja ucieczki nie jest świadoma kodowania wielobajtowego, co może zostać wykorzystane przez atakującego do „skonsumowania” znaku ucieczki. Dodanie "N" do łańcucha nie pomoże, ponieważ nie ma to wpływu na wartość znaków wielobajtowych w dalszej części łańcucha. Jednak ten typ ataku jest bardzo rzadki, ponieważ baza danych musi być skonfigurowana do akceptowania ciągów znaków unicode GBK (i nie jestem pewien, czy MS-SQL może to zrobić).
Wstrzyknięcie kodu drugiego rzędu jest nadal możliwe, ten wzorzec ataku jest tworzony przez zaufanie do źródeł danych kontrolowanych przez atakującego. Escape służy do reprezentowania znaków sterujących jako ich literału znakowego. Jeśli programista zapomni uciec wartości uzyskanej z select
a następnie używa tej wartości w innym zapytaniu, a następnie bam atakujący będzie miał do swojej dyspozycji dosłowny pojedynczy znak cudzysłowu.
Przetestuj wszystko, niczego nie ufaj.