SQL Injection-da się wykryć?

0

Witam, słyszałem ostatnio o ataku za pomocą SQL Injection i chciałbym się zapytać, czy daną metodę można jakoś wykryć, gdy osoba X włamie się na moją stronę za pomocą tego narzędzia.

0

Nie za bardzo.

1

W teorii możesz logować zapytania i jak ktoś Ci się włamie, to będziesz mógł przejrzeć logi i będziesz wiedział, którędy weszła, ale łatwiej jest chyba używać prepared statement.

Możesz też jakoś monitorować bindowane parametry pod kątem jakiś dziwnych ciągów znaków w stylu -- komentarz, który jest często używany, żeby zignorować dalszą część zapytania lub 1 = 1, ale nie słyszałem o takich praktykach :P

3

Wykryjesz dopiero wtedy, jak ktoś Ci bazę cała usunie, albo wyciągnie hasła, albo będzie spamować adresy mailowe userow. Możliwości jest wiele, ale dopiero po fakcie. W sumie mógłbyś jakoś analizować logi i sprawdzać pod kątem dziwnej działalności, np błędnych zapytań.

0

Czyli jeżeli ktoś wyciągnie z bazy danych hasła, ale nie zmieni go, to będzie prawie anonimowy, tak?

0

To nie takie proste wyciągnąć hasła za pomocą SQL Injection. W zasadzie graniczy z cudem. O ile możesz wykonać dwa zapytania na raz, to już z wyświetleniem rezultatu gorzej. W językach takich jak PHP jeszcze może to przejść, o ile nie robisz nic z tablicą wynikową tylko po prostu plujesz nią na ekran, czy tam do xls, czy csv nie oczekując konkretnego formatu zwrotnego.

Wyobraź sobie, że robisz update i masz tam dziurę. To nie wyświetlasz nigdzie wyniku, więc jak atakujący mógłby zobaczyć wynik swojego selecta? Nawet, gdy robisz select, to oczekujesz, że w rezultacie będzie np. pojedynczy username i password, a już na 100% tego nie wyświetlasz na ekranie. Chyba, że można odprawić jakąś czarną magię, żeby SQL wysłał maila lub w inny sposób przekazał hasła atakującemu, ale na ten temat nic mi nie wiadomo, możliwe, że istnieją takie mechanizmy.

Doczytałem trochę i w teorii mógłby zdumpować rzeczy do pliku używając SQLa, a ten plik później odczytać wchodząc na url: twojasuperstrona.pl/hasla.csv. W każdym razie jest spora szansa, że byś się dowiedział ze sporym opóźnieniem, a namierzenie gościa też pewnie nie jest najłatwiejsze.

Ten atak mógłby wyglądać tak:

  1. Ktoś wpisuje w polu email: '; SELECT email, password FROM users INTO OUTFILE '/var/www/projekt/public/passwords.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n'; --
  2. Wykonuje się Twoje zapytanie SELECT * FROM users WHERE email = '' + zapytanie wyżej, a reszta Twojego pierwotnego zapytania jest ignorowana, bo kończy się to --.
  3. Hasła są zrzucone do /var/www/projekt/public/passwords.csv
  4. Wchodzisz na twojastrona.pl/passwords.csv i masz hasła.

Oczywiście musisz też wiedzieć, gdzie ktoś ma katalog z projektem na serwerze :D Swoją drogą to jest ciekawe, bo obstawiam, że mógłbyś też zdumpować kod PHP do pliku plik.php w katalogu public używając SQL'a i później go odpalić, a to już Ci daje możliwość wyciągnięcia haseł do bazy, do której się później zdalnie połączysz. Aż to zaraz przetestuję :D

5
supremeje napisał(a):

Czyli jeżeli ktoś wyciągnie z bazy danych hasła, ale nie zmieni go, to będzie prawie anonimowy, tak?

Jak ktos wyciagnie z db hasla to najlepiej przebranzowuj sie na spawacza. Metalu nie trzeba hashowac

0
stivens napisał(a):
supremeje napisał(a):

Czyli jeżeli ktoś wyciągnie z bazy danych hasła, ale nie zmieni go, to będzie prawie anonimowy, tak?

Jak ktos wyciagnie z db hasla to najlepiej przebranzowuj sie na spawacza. Metalu nie trzeba hashowac

:D

2

Tyle odpowiedzi... twardych, technicznych, próbujących rozwiązać postawiony problem..

Niestety nikt nie podejrzewał, że pytający, najprawdopodobniej nie stał się jeszcze ofiarą takiego ataku i można go w pierwszej kolejności nauczyć jak się bronić :D
Ktoś, kto nazywa SQL Injection narzędziem musi naprawdę nie wiedzieć o co chodzi.

Tutaj masz info jak się zabezpieczyć:
https://stackoverflow.com/a/60496/1639851

Nie używaj starego PHP, a jeśli używasz to wszystkie dane z formularzy (post/get) escape'uj funkcją mysql_real_escape_string.
W nowych używaj PDO albo MySQLi w odpowiedni sposób (jak pod linkiem ze stacka).

Generalnie chodzi o to, żeby nie pozwolić użytkownikowi na wykonywanie swojego kodu SQL przez Twój formularz na stronie.

0

Dlatego hasła najlepiej trzymać zawsze w formie zaszyfrowanej, nigdy nie surowego.

3
Desu napisał(a):

To nie takie proste wyciągnąć hasła za pomocą SQL Injection. W zasadzie graniczy z cudem.

Wszystko da radę zrobić.
Niedawno na Niebezpieczniku był link do CTF'a wykorzystującego Blind SQL Injection (skrypt napisano w Javie :) https://niebezpiecznik.pl/post/ciekawy-opis-ctf/

2

@Desu gadasz zupełne bzdury.

W zasadzie graniczy z cudem. O ile możesz wykonać dwa zapytania na raz, to już z wyświetleniem rezultatu gorzej.

Lekcja na dziś: blind sql injection. Zapewniam cię że nie graniczy wcale z cudem. Ba, jest często trywialne do wykonania. Zwykły timing attack (sleep/benchmark) albo error-based attack (zapytanie się wywala jeśli warunek jest spełniony) spokojnie pozwalają leakować dane nawet jeśli nie ma echa.

@pol90 następny któremu się wydaje że coś wie i pisze bzdury.

Dlatego hasła najlepiej trzymać zawsze w formie zaszyfrowanej, nigdy nie surowego.

Nie, nie trzyma się haseł zaszyfrowanych, bo co jest zaszyfrowane to można odszyfrować. Tak trzymasz tylko dane które są ci potrzebne w takiej formie. Zwykle hasła logowania do twojego systemu trzymasz zahashowane.

Ad samego problemu postawionego w wątku: nie jeśli nie masz żadnego monitorowania swojego serwera, to faktycznie nie dowiesz sie że ktos cię tak zaatakował. Niemniej normalni ludzie jednak mają logi a często też jakiegoś WAFa.

0

Zwykle hasła logowania do twojego systemu trzymasz zahashowane.

Mi chodziło włąsnie o zahashowane.

0

No to ciekawe, są nawet gotowce w PHP:
https://github.com/bs4creations/simpleSQLinjectionDetect

2

@drorat1 no taki bieda WAF, do obejścia w kilka minut ;) Np. blacklistuje select ze spacją na końcu (i inne słowa kluczowe tak samo), a da się napisać query bez żadnej spacji jak dasz odpowiednio dużo nawiasów ;]

0

Hm. A po co dawać użytkownikowi możliwość doklejenia czegokolwiek? Nie lepiej dać mu funkcje do wywoływania na bazie?

0

@farhorizon: w świecie idealnie okrągłych kwadratów byłoby to spoko rozwiązanie. Jednak w naszym świecie ma parę dość istotnych wad:

  • słaba kompozycja, przez co w pewnym momencie znów musisz pisać "zwykłe" zapytania
  • wersjonowanie oraz code tracking nie należy do najłatwiejszych
  • trudniejsze rollbacki
0

Zastrzegam, że nie mam za sobą mnóstwo praktyki ;D ale w tych dwóch aplikacjach na krzyż co napisałem wolę zrobić funkcje, które operują na bazie niż pozwalać użytkownikowi coś doklejać.

@Delor w czym piszesz? Ja raczej C, Java.

0

@farhorizon no ale co to znaczy funkcje które operują na bazie? Wyobraź sobie że twój soft ma pozwolić userowi wyświetlić tabelkę z danymi z jakiejś tabeli w bazie i user może wybrać które kolumny chce widzieć (bardzo popularna funkcjonalność w każdym sofcie raportownym). I robisz to oczywiście w stylu backend-as-a-service, więc backend dostaje request a dane wracają na front jakimś jsonem. Jak to zaimplementujesz? :) W jaki sposób przekażesz które kolumny chcesz odczytać z bazy i jak potem zbudujesz to zapytanie?
Podpowiem że wyciąganie wszystkiego a potem filtrowanie jest raczej słabe :)
Da się to zrobić "bezpiecznie" jakimiś enumami, o ile struktura tabeli jest stała i znana, ale idźmy level wyżej, to są dane w jakimś Mongo albo Elasticu i struktura dokumentów nie jest stała / jest ich kilka i nie da rady zrobić enuma z nazwami pól, co wtedy?

0

@Shalom: w takim wypadku zapytanie SQL byłoby opakowane w funkcję np. w Javie.

funkcja () {
wykonajzapytanie(przygotowane wcześniej zapytanie)
}

Fakt, że pisaniny jest przy tym więcej. Nie upieram się, że to nie jest bardziej żmudny sposób, bo każdy wybór kolumn należałoby w takim wypadku osobno oprogramować (a przynajminej w tym momencie nic lepszego nie przychodzi mi do głowy). Ponownie zaznaczę, że nie upieram się przy tym i że tak nam na studiach mówili ;D

0

No dobra ale co to niby zmienia? o_O Pokaż mi jak ta funkcja by miała wyglądać! Jak ma wyglądać to twoje "przygotowane wczesniej zapytanie"? Kolumn w bazie jest 100 a user może wybrać DOWOLNY ich podzbiór.

każdy wybór kolumn należałoby w takim wypadku osobno oprogramować

Policz teraz proszę ile takich funkcji potrzebujesz dla 100 kolumn i zastanów się jeszcze raz :)

0

"select a, b, c from table"
"select a, b from table"
"select a from table"
"select b from table"
"select c from table"
itp permutacje.
a nie np. "select "+cosCoWpisalUzytkownik+" from table"

0

No dobrze, a umiesz policzyć ile? :) 2^n, jeśli nie uważałeś na matematyce. Dla 100 daje nam to 2^100 czyli 1267650600228229401496703205376, zalecam zacząć już pisać bo możesz nie zdążyć przed końcem świata. Nawet dla trywialnej liczby 20 kolumn to już ponad milion możliwości, nawet głupie 10 kolumn to już 1024 takie funkcje :D

0

100 kolumn? Dobra, takich programów to nie pisałem :P To typowe?

0

Nie musi być 100, widzisz że już dla 20 masz milion. A w systemach raportowych taka liczba parametrów to nie jest nic szczególnego.

0

Spoko. Na zajęciach zmieściliśmy się w granicach 10 i chodziło o zwykłą aplikację z małą w porównaniu z tym ilością dostępnych funkcji.

0
farhorizon napisał(a):

"select a, b, c from table"
"select a, b from table"
"select a from table"
"select b from table"
"select c from table"
itp permutacje.
a nie np. "select "+cosCoWpisalUzytkownik+" from table"

farhorizon napisał(a):

Spoko. Na zajęciach zmieściliśmy się w granicach 10 i chodziło o zwykłą aplikację z małą w porównaniu z tym ilością dostępnych funkcji.

title

0

To pomysł prowadzących :P

0
Shalom napisał(a):

Nie musi być 100, widzisz że już dla 20 masz milion. A w systemach raportowych taka liczba parametrów to nie jest nic szczególnego.

Trzeba pamiętać jeszcze, że oprócz selecta mamy jeszcze np. inserty, delete, update. Co zwiększa już koledze ilość metod parę razy znowu. A i jeszcze trzeba pamiętać o nieskończonej liczbie kombinacji, gdy używamy where :P

farhorizon napisał(a):

To pomysł prowadzących :P

Zmień prowadzących. Ewentualnie zmień szkołę/studia xD

0

Eee tam, studia są spoko. Ale wiadomo, że nauczyciele też się mylą.
W ogóle nie jestem fanem formalnej edukacji xD
Ale nie zaśmiecajmy już tego tematu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1