Natychmiastowa pomoc przy ataku hakerskim

Zarządzanie incydentami cyberbezpieczeństwa z natychmiastową reakcją.

Dowiedz się więcej

Co to jest SQL injection?

SQL Injection (SQLI) czyli po polsku wstrzyknięcia SQL, to wprowadzenie złośliwego polecenia w aplikacji webowej, najczęściej do formularzy internetowych, takich jak pole wyszukiwania, pole logowania lub adres URL w niezabezpieczonych witrynach internetowych, aby manipulować danymi na serwerze. Celem jest zwykle kradzież tych danych, zniszczenie lub użycie ich w celu oszustwa.

Aby dobrze zrozumieć, czym jest SQL injection warto wiedzieć, co to jest w ogóle SQL? Structured Query Language to opracowany na początku lat 70 w firmie IBM strukturalny język zapytań. Jest jednym z najstarszych języków tego typu, który nadal używany jest do zarządzania bazami danych online. Te bazy danych, zapisane na serwerach, zawierają wszelkie informacje, jakie wykorzystywane są przez daną aplikację webową (np. stronę internetową); mogą to być ceny, poziomy zapasów w sklepie internetowym, konta użytkowników itd. SQL służy do uzyskiwania dostępu do tych danych i prezentowania ich użytkownikom.

Atak SQL injection

Ataki typu SQL Injection wykorzystują dynamicznie tworzone zapytania SQL w źle zaprojektowanych witrynach internetowych (źle zaprojektowana aplikacja internetowa może przyjąć w polu wejściowym dowolny typ zapytania SQL, kiedy pierwotnie to pole przeznaczone było jedynie do przyjęcia określonego typu danych albo informacji w określonym formacie (np. adres email). Dzięki temu atakujący osadzając specjalnie spreparowane polecenia SQL mogą pośrednio manipulować zapytaniem wysyłanym do bazy danych przez aplikację internetową i w ten sposób określić podatność na ataki, a także przeglądać, modyfikować lub usuwać dane aplikacji. Złośliwe wstrzyknięcia SQL są proste do zrozumienia, a  umożliwiają dostęp do wrażliwych, a nawet krytycznych danych aplikacji, co czyni je atrakcyjnymi dla wielu hakerów.

Jak działa SQL injection w praktyce

W przypadku baz danych SQL, które umożliwiają natychmiastowe wykonanie poleceń SQL oddzielonych średnikami, możliwe jest wykonanie zapytań zawierających dowolne polecenia SQL.

Tak więc, po przeprowadzonej analizie, zadaniu kilku poleceń w formularzu, haker przypuszcza, że aplikacja internetowa używa następującego zapytania SQL w celu pobrania szczegółów konta:

Jeśli accntNumber jest danymi wprowadzonymi przez użytkownika w żądaniu HTTP, osoba atakująca może wpisać np. to:

a wynikowe zapytanie będzie brzmiało:

Ponieważ powyższe zapytanie zawsze ma wartość TRUE (prawda), każdy wiersz bazy danych jest zgodny („a” = „a” ma zawsze wartość TRUE),  wynikowe zapytanie zwraca wszystkie wpisy dotyczące zapisanych szczegółów kont z bazy danych.

Dzięki zastosowaniu tego warunku logicznego, atakujący sprytnie ,,przemyca” poprzedzającą taki warunek dodatkową część zapytania, która służy celom jakie chce zrealizować cyberprzestępca.

Opisany wyżej SQLI, nazywany często SQL injection 1=1, opiera się na fakcie, że polecenia SQL składają się zarówno z danych używanych w ramach polecenia jak i komend kontrolujących sposób wykonywania polecenia SQL, co umożliwia atakującemu poprzez odpowiednio spreparowane polecenie, zmianę struktury wykonywanej instrukcji. To natomiast tylko jeden z prostych przykładów „złośliwych wstrzyknięć”, których metod i rodzajów jest znacznie więcej. Przykładowe ataki SQLi mogą dotyczyć wszystkich baz danych wykorzystujących SQL: m.in. Oracle, MySQL, Microsoft SQL Server itd.

Rodzaje SQL injection

Typy SQL injection można podzielić ze względu na sposób w jaki atakujący nawiązuje interakcję z poleceniami SQL w aplikacji webowej.

In-band SQLi: jeden z najbardziej popularnych ataków, w którym osoba atakująca może zarówno przeprowadzić atak, jak i zebrać wyniki za pośrednictwem tego samego kanału komunikacji. Metoda dzieli się na dwa podtypy.

  • Error-based SQLi: wykorzystuje komunikaty o błędach generowane przez serwer bazy danych w celu poznania struktury bazy danych. Mając te informacje, atakujący może skorzystać z innych metod SQLi i tak skonstruować kolejne zapytania, by osiągnąć zamierzony cel.
  • Union-based SQLi: służy do łączenia wyników dwóch lub więcej zapytań w jedno, przy braku odpowiednich zabezpieczeń umożliwia pozyskanie z bazy danych właściwie wszystkich przechowywanych informacji.

Inferential SQLi: rodzaj ataku znany również jako Blind SQLi w którym haker nie widzi wyników wprowadzanych poleceń, może jednak analizować zachowanie aplikacji i na tej podstawie próbować odtworzyć strukturę bazy danych. Tu również wyróżniamy dwa typy:

  • Boolean-based blind SQLi: znany również jako content-based SQLi, wysyła zapytania SQL do bazy danych, które aplikacja interpretuje i zwraca jako wynik prawdziwy lub fałszywy, co może dać atakującemu informację m.in. na temat tego czy dana aplikacja ma jakieś podatności.
  • Time-based blind SQLi: zazwyczaj używany do przeprowadzania testów, gdy nie ma już innego sposobu na pobranie informacji z serwera bazy danych. Ten rodzaj ataku polega na wstrzyknięciu segmentu SQL zawierającego określoną funkcję DBMS (funkcje wbudowane w silniki bazodanowe, niektóre z nich pozwalają nawet na wykonywanie poleceń systemu operacyjnego takich jak ping czy telnet) lub ciężkie zapytanie, które generuje opóźnienie czasowe. W zależności od czasu potrzebnego na uzyskanie odpowiedzi serwera, możliwe jest odgadnięcie niektórych informacji.

Out-of-band SQLi: w tym rodzaju ataku  ‘poza pasmem’ osoba atakująca manipuluje docelową aplikacją w celu wysłania danych do zdalnego punktu końcowego, znajdującego się pod jego kontrolą. Najczęściej atakujący próbuje zmusić system do wygenerowania zapytania DNS, które powędruje do serwera DNS kontrolowanego przez niego. Wtedy atakujący wie, że jego zapytania działają a ponadto może on próbować eks-filtrować dane.

Znane ataki typu SQLi  (przykłady SQL injection)

Wstrzyknięcie kodu SQL został po raz pierwszy udokumentowane w 1998 roku przez badacza cyberbezpieczeństwa i hakera Jeffa Forristala, który wyjaśnił, w jaki sposób osoba posiadająca podstawowe umiejętności kodowania może przenieść nieautoryzowane polecenia SQL na legalne polecenia SQL i wyciągnąć w ten sposób wrażliwe informacje z bazy danych niezabezpieczonej witryny internetowej. Informacja ta została opublikowana w branżowych mediach, jednak w tym czasie nikt, nawet bezpośrednio powiadomiony Microsoft, tym się nie przejął i odkrycie Forristala zostało zbagatelizowane. Do czasu pierwszego poważnego ataku SQLI.

  • W 2007 roku ofiarą ataku SQLI padła największa sieć sklepów wielobranżowych w Stanach Zjednoczonych – 7-Eleven. Rosyjscy hakerzy wykorzystali wstrzyknięcie SQL, aby włamać się na stronę internetową 7-Eleven i do jej bazy danych kart debetowych klientów sklepu ogólnospożywczego. Umożliwiło to hakerom wypłatę gotówki w Rosji na sumę dwóch milionów dolarów!
  • Nie wszystkie ataki SQLI są motywowane jednak chciwością. Godnym uwagi przykładem z 2007 roku jest atak w którym cyberprzestępcy wykorzystali SQLI do przejęcia kontroli administracyjnej nad dwiema stronami internetowymi związanymi z armią amerykańską i przekierowali ruch odwiedzających na strony internetowe zawierające propagandę antyamerykańską i antyizraelską.
  • Naruszenie danych MySpace w 2008 r. jest jednym z największych ataków na witrynę internetową dla konsumentów. Cyberprzestępcy ukradli e-maile, nazwiska i częściowe hasła z prawie 360 milionów kont (dlatego nie należy używać ponownie haseł z jednej witryny w innych – dowiedz się więcej o dobrych praktykach przechowywania haseł).
  • Atak SQLI z 2015 r. na producenta zabawek Vtech, który doprowadził do naruszenia bezpieczeństwa prawie pięciu milionów rodziców i 200 000 dzieci. W rozmowie z Motherboard, odpowiedzialny haker stwierdził, że nie ma planów dotyczących danych i nie opublikował ich nigdzie w Internecie. Z drugiej strony haker wyjaśnił również, że dane można bardzo łatwo ukraść i ktoś inny mógł zdobyć je wcześniej jako pierwszy.

W dzisiejszym świecie cyberzgrożeń, ataki SQLI są nadal aktualne. Co trzy lata Open Web Application Security Project (OWASP) umieszcza na liście 10 najbardziej krytycznych zagrożeń bezpieczeństwa aplikacji internetowych. W edycji z 2021 r. atak SQLI znalazł się na pierwszym miejscu.

SQL injection jak zapobiegać

Wiedząc już na czym polega SQL injection i znając przykładowe ataki SQLi warto pochylić się nad tym jak zabezpieczyć się przed SQL injection. A istnieje wiele sposobów mogących ograniczać zdolność hakerów do bezpośredniej kradzieży lub uszkodzenia danych w wyniku tego rodzaju ataku. Oto niektóre z nich:

  • Sanityzacja: powszechną ochroną jest oczyszczanie wszystkich danych dostarczanych przez użytkownika. Należy je oczyścić w celu usunięcia ciągów znaków, które mogłyby zostać wykonane przez interpreter jako polecenia SQL lub przekazane bezpośrednio do bazy danych SQL. Oczyszczanie zazwyczaj polega na zastąpieniu wykonywalnych poleceń (znajdujących się w danych użytkownika) alternatywnymi, niewykonywalnymi znakami.
  • Filtrowanie i walidacja: wszystkie dane dostarczone przez użytkownika powinny zostać sprawdzone i ograniczenie poprzez format, długość i inne atrybuty dozwolonych danych wejściowych. Należy filtrować wystąpienia poleceń SQL.
  • Zabezpieczenia URL: należy unikać używania argumentów adresu URL, takich jak w obiektowym modelu relacyjnym (ORM), które wyzwalają operacje na bazie danych. Zamiast tego powinno się używać bezpiecznego interfejsu API dla całego dostępu do bazy danych.
  • Ograniczanie zakresu poleceń SQL: użycie poleceń LIMIT w operacjach SQL, aby zminimalizować ujawnienie danych w przypadku, gdy wstrzyknięcie SQL dotrze do bazy danych.

Chociaż wymienione wyżej techniki kodowania, są ważne, to niestety nie gwarantują pełnej ochrony przed wstrzykiwaniem złośliwego kodu. Biblioteki oprogramowania innych firm, późniejsze zmiany kodu przez innych programistów i wciąż nowo odkrywane techniki ataków mogą zagrozić nawet dobrze napisanym aplikacjom. Dlatego w  ASCO Cyber uważamy, że aby spać spokojnie należy dodać zautomatyzowaną warstwę ochrony dla stron internetowych za pomocą firewalla aplikacji internetowych.

SQL injection jak się chronić

Ochrona przed SQL injection jest możliwa poprzez zastosowania rozwiązań typu WAF. Z uwagi na stosunek ceny do funkcjonalności polecamy Barracuda Web Application Firewall, który może chronić aplikacje i dane przed wszystkimi typami ataków SQLI. Pozwala identyfikować i blokować zarówno tradycyjne, jak i zaciemnione ataki oparte na zapytaniach do baz danych, zapewniając, że akceptowane są tylko dozwolone dane wejściowe w danym polu.