Zastrzyk prosto w serce

Przykład 2

Modyfikacja danych

Przykład 1 ilustrował możliwość wykonania arbitralnego zapytania SQL. To tylko próbka możliwości tej metody ataku. Przy zachowaniu pewnych warunków, technika SQL injection może służyć do modyfikowania danych. Dla zilustrowania takiej sytuacji weźmy pod uwagę fragment kodu pochodzący z prawdziwej aplikacji WWW, służącej do uwierzytelniania użytkowników. Przykład wykorzystuje skrypty PHP i bazę PostgreSQL. Oto kod źródłowy:

LoginPage.php

<HTML>

<BODY>

<FORM ACTION=LoginPage2.php>

Użytkownik: <INPUT NAME="username"><BR>

Hasło: <INPUT NAME="password"><BR>

<INPUT TYPE="submit" VALUE="Zaloguj">

</FORM>

Formularz pobiera od użytkownika parametry "username" i "password", a następnie wywołuje skrypt LoginPage2.php, którego rola polega na sprawdzeniu zgodności podanych przez użytkownika identyfikatorów z tymi przechowywanymi w bazie danych. Poniższy listing przedstawia kluczową część tego skryptu - funkcję przeszukującą bazę danych.

LoginPage2.php

...

// funkcja do autoryzacji

function MyAuth( $conn,$username,$password) {

$query = "SELECT id FROM users WHERE";

$query .= " username = '" . $username . "' AND ";

$query .= " password = '" . $password . "'";

$res = pg_query( $query);

if (pg_num_rows( $res) == 1) {

$row = pg_fetch_array( $res);

$id = $row['id'];

} else {

$id = 0;

}

Krytycznym fragmentem powyższego kodu jest zapytanie:

"SELECT id FROM users WHERE username = '" . $username . "' AND password = '" . $password ."'";

Podobnie jak w poprzednim przykładzie, zapytanie jest konstruowane przez sklejenie zaszytych w programie części stałych z elementami wprowadzonymi przez użytkownika za pośrednictwem formularza WWW . Operatorem konkatenacji w języku PHP jest znak kropki. Cudzysłowy ograniczają poszczególne ciągi znaków (string), a znaki apostrofu (') otaczają fragmenty danych wprowadzane przez użytkownika.

Na czym polega atak? Jeżeli użytkownik do formularza LoginPage.php wprowadzi następujące dane:

Użytkownik: '; delete from users--

Hasło:

To kluczowy fragment kodu PHP, po wstawieniu wprowadzonych danych będzie wyglądał następująco:

"SELECT id FROM users WHERE username = '" . '; delete from users" . "' AND password = '" . . "'";

Oto wyjaśnienie oznaczeń:

' zakończenie pojedynczego cudzysłowu, w który są ujmowane dane wprowadzane z wewnątrz;

; Zakończenie zapytania i rozpoczęcie nowego;

-- Początek komentarza - w ten sposób usuwa się dalszą część kodu, która nie jest intruzowi potrzebna, a może wywołać błąd składniowy i uniemożliwić wykonanie ataku.

Po przetworzeniu kodu i zinterpretowaniu powyższych znaków, otrzymujemy dwa zapytania:

SELECT id FROM users WHERE username = ''; delete from users

W rezultacie zawartość tablicy users zostanie usunięta, uniemożliwiając innym użytkownikom dostęp do systemu. W podobny sposób można doklejać dowolne zapytania, o ile pozwala na to API i składnia bazy danych.


TOP 200