Aplikacje internetowe, podobnie jak wiele innych programów, mogą mieć problemy z przetwarzaniem nietypowych danych pojawiających się na wejściu. Przykładowo kiedy taka aplikacja pobiera informacje z bazy w oparciu o dane podawane przez użytkownika w formularzu na stronie internetowej, zazwyczaj oczekuje, że użytkownik wprowadzi dane określonego typu. Jeżeh zamiast tego nasz użytkownik wprowadzi w formularzu nietypowy ciąg znaków, zawierający na przykład specjalnie spreparowane zapytanie SQL, może być w stanie odczytywać z bazy danych dodatkowe informacje, uniknąć konieczności uwierzytelniania czy nawet wykonywać polecenia w systemie hosta bazy danych.


Wiele aplikacji internetowych przechowuje dane w bazach danych SQL.

 

Zazwyczaj z poziomu testowanych aplikacji internetowych nie ma możliwości bezpośredniego wykonywania zapytań SQL na serwerze wewnętrznej bazy danych (ang. backend database). Czasami zdarza się jednak, że ze względu na błędy w procedurach weryfikacji danych wprowadzanych w formularzach aplikacji udaje się przeprowadzić atak polegający na wstrzykiwaniu kodu SQL (ang. SQL injection attack), pozwalający na modyfikację zapytań przesyłanych przez aplikację do bazy danych. Pomyślnie przeprowadzone ataki z wstrzykiwa­niem kodu SQL mogą pozwolić na odczytywanie danych z bazy, modyfikowanie rekordów danych, zamknięcie, uszkodzenie bądź zniszczenie bazy danych, a w nie­których przypadkach nawet na wykonywanie poleceń na poziomie systemu ope­racyjnego serwera bazy danych (co może być szczególnie groźne, ponieważ serwery bazy danych zazwyczaj działają na prawach uprzywilejowanych użytkowników).

 

Jednym z najbardziej oczywistych miejsc, w których można upatrywać poten­cjałach szans na przeprowadzenie ataku z wstrzykiwaniem kodu SQL, są strony logowania się użytkowników.

 

Jeżeli projektanci aplikacji internetowej nie dołożyli starań do zaimplementowania odpowiednich procedur weryfikacji danych wpro­wadzanych przez użytkownika, istnieje możliwość przeprowadzenia ataku na bazę danych za pomocą zapytania SQL.

 

Poniżej przykład takiego zapytania:

 

SELECT username FROM users WHERE username='' or '1' ='1' AND password='' or '1' = '1'

 

Ponieważ wyrażenie OR '1' = 1' będzie zawsze prawdziwe, przedstawione powyżej zapytanie SELECT zwróci pierwszą nazwę konta użytkownika, niezależnie od tego, jak będzie ona brzmiała i jakie będzie hasło.

 

Zazwyczaj pierwszym testem mającym na celu sprawdzenie, czy dana aplikacja jest podatna na wstrzykiwanie kodu SQL, jest zamknięcie zapytania SQL za pomocą apostrofu.

 

Jeżeli aplikacja jest podatna na taki atak, dodanie apostrofu na końcu zapytania powinno spowodować wygenerowanie błędu, ponieważ taki dodatkowy znak powoduje, że składnia całego zapytania staje się niepoprawna.

 

W przypadku gdy aplikacja jest podatna na ataki z wykorzystaniem SQL Injection można uruchomić dodatkowe zapytania tj.:

 

http://przykladowastrona/product.aspx?id=2 or 1 in (SELECT DB_NAME(0))--

 

Wykonanie takiego zapytania or 1 in (SELECT DB_NAME(0))--  (dopisując po numerze id) powoduje wygenerowanie błędu Conversion failed when converting the nvarchar value BookApp' to data type int („Podczas konwersji typu nvarchar na typ int wystąpił błąd"), który w nieco przewrotny sposób informuje nas, o nazwie bazy danych.

 

SQLMAP

 

Jednym z potężniejszych narzędzi do wykorzystania ataków SQL Injection jest SQLMAP, który możemy pobrać ze strony projektu: http://sqlmap.org/

W przypadku użycia tego narzędzia, musimy jedynie znaleźć miejsce w aplikacji internetowej, które jest podatne na wstrzykiwanie kodu, a zautoma­tyzowane narzędzie zrobi za nas całą resztę. SQLMap jest wbudowany system do testów penetracyjnych - Kali Linux, obecnie w wydany w wersjii 2.0 Uruchomienie programu sprowadza się do wspiania terminalu następującego polecenia: 

 

root@kali:~# sqlmap -u "http://adres_atakowanej_strony/product?id=2" -dump

 

W poleceniu tym po parametrze -u podajemy adres atakowanej strony, zaś polecenie -dump służy do zrzutu bazy danych.

 

W jaki sposób działa to narzędzie? W bardzo prosty automatyzuje za nas cały proces wpisywania/wstrzykiwania zapytań SQL.

 

Ponadto program SQLMap możemy również użyć do uzyskania dostępu do powłoki systemu operacyjnego serwera bazy danych. Bazy danych MS SQL posiadają wbu­dowaną procedurę o nazwie xp_cmdshel, która daje dostęp do powłoki systemu. Sęk w tym, że uruchamianie wspomnianej procedury często bywa zablokowane. Na szczęście za pomocą programu SQLMap możemy spróbować odblokować moż­liwość jej uruchomienia, poprzez polecenie:

 

root@kali:~# -u "http://adres_atakowanej_strony/product?id=2" -os-shell 

 

Oczywiście przedstawione tu polecenia, są tylko jedną setną procenta, przedstawionych możliwości sqlmap. Dzięki temu narzędziu możemy pobrać zarowno całą bazę danych jak i pojedyńcze tabele. Do szerszej lektury i zapoznania się ze składnią poleceń tego narzędzia zapraszam pod adres: https://github.com/sqlmapproject/sqlmap/wiki/Usage ,bądź zapoznania się z poleceniami bezpośrednio po wpisaniu sqlmap -h 

Na podanym poniżej filmiku można obejrzeć atak przy wykorzystaniu SQLInjection z użyciem SQLMap

 

 

Jak chronić się przed wstrzknięciem złośliwego kodu na naszej stronie?

 

Przy skryptach pisanych w języku php warto pamiętać o zabepieczaniu danych wysyłanych do bazy danych z użyciem: mysql_real_escape_string . Funkcja ta wywołuje funkcję biblioteki MySQL mysql_real_escape_string, która dodaje lewe ukośniki (backslash) do następujących znaków: \x00\n\r\'" and \x1a.

 

Przykład użycia mysql_real_escape_string()

 

<?php
// Connect
$link = mysql_connect('host', 'uzytkownik', 'haslo')
    OR die(mysql_error());

// Zapytanie
$query = sprintf("SELECT * FROM uzytkownicy WHERE uzytkownik='%s' AND haslo='%s'",
            mysql_real_escape_string($uzytkownik),
            mysql_real_escape_string($haslo));
?>

 

Przykład ataku SQL Injection bez użycia mysql_real_escape_string()

 

<?php
// Nie sprawdziliśmy zmiennej $_POST['password'], która może zawierać wszystko czego chciał użytkownik! Na przykład:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// Zapytanie pobierające pasujących użytkowników
$query = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($query);

// Oznacza to, że zapytanie ma postać:
echo $query;
?>

 

Zapytanie wysłane do bazy danych:

 

SELECT * FROM users WHERE user='aidan' AND password='' OR ''=''

 

Zapytanie to pozwala zalogować się każdemu bez znajomości poprawnego hasła. Czyli to o czym mowilismy wcześniej.

 

Inne funkcje php, ktorych warto uzywać w skryptach php to:

stripslashes() - Usuwa znak '\' z ciągu znaków

addslashes() - dodaje znak ucieczki przed znakami niebezpiecznymi np ' 

 

FiNiSh


2016-07-20 23:00:00 Presented by Martin S