Nie, żadna długość nie jest zbyt krótka, aby można ją było wykorzystać (przynajmniej w niektórych sytuacjach).
Filtr długości nie jest poprawnym zabezpieczeniem przed wstrzyknięciem SQL, a przygotowane instrukcje naprawdę są tylko właściwa obrona.
Filtr długości jest jednak dobrym środkiem ochrony w głębi (podobnie jak filtry liczb całkowitych, filtry alfanumowe itp.). Jest wiele sytuacji, w których np. prawidłowe dane wejściowe nigdy nie mogą być większe niż, powiedzmy, 30 znaków, ale tam, gdzie sensowne wykorzystanie wymaga więcej. Powinno (ale prawdopodobnie nie) być oczywiste, że jakiekolwiek filtrowanie jako obrona głęboka musi odbywać się po stronie serwera, ponieważ wszystko po stronie klienta można po prostu ominąć.
Obwodnica ograniczeń
Klauzule ograniczające (np. AND
/ OR
) można ominąć dwoma znakami, co może spowodować rzeczywistą szkodę, a nie tylko nieudane zapytanie. Najprostszym przykładem jest login (inne przykłady to nieautoryzowane usunięcie dodatkowych danych):
SELECT * FROM users WHERE userid = [id] AND password = [password]
Wtrysk:
id = 1 # hasło = złe_hasło
Ładunek: 2 znaki
DoS
Ataki DoS wymagają bardzo niewielu znaków. W przykładzie MySQL potrzeba 7 na rzeczywiste wywołanie + x przez dane sekundy + wszystko, co jest potrzebne, aby móc wywołać funkcję i naprawić zapytanie.
Przykład:
SELECT * FROM users WHERE userid = [id]
Injection (to jest prawidłowy zastrzyk, dłuższa forma to 1 AND sleep (99)
):
sleep (99)
Ładunek: 9 znaków
Odczytywanie danych
Jeśli dane jest wyświetlany, długość zależy głównie od nazwy tabeli i kolumny. Zakładam równą liczbę kolumn dla wszystkich tabel (może się to zdarzyć i oszczędza znaki).
Przykład :
SELECT * FROM comments WHERE commentid = [id]
Injection:
1 union select * from users
Payload: 27 znaków.
Edycja danych
Nieautoryzowane modyfikacje bazy danych można również osiągnąć przy użyciu kilku znaków.
Przykład:
UPDATE użytkowników SET password = '[hasło]' WHERE id = [id]
Wstrzyknięcie (do hasła):
', isadmin =' 1
Ładunek: 12 znaków
Obejście ograniczenia również zadziała (w rezultacie wszystkie hasła są teraz puste *):
'#
Ładunek: 2 znaki
* Przykładowe hasło służy do uproszczenia; hasła powinny być zaszyfrowane, aby przykład był niemożliwy. Przykład nadal ma zastosowanie we wszystkich podobnych sytuacjach (aktualizacja nazwy użytkownika, aktualizacja uprawnień itp.)