- Chmura Azure. Praktyczne wprowadzenie dla administratora. Implementacj...Cena: 43.55 zł
- Kali Linux. Testy bezpieczeństwa, testy penetracyjne i etyczne hakowa...Cena: 43.55 zł
- Bezpieczny system w praktyce. Wyższa szkoła hackingu i testy penetra...Cena: 64.35 zł
- Odliczając do dnia zero. Stuxnet, czyli prawdziwa historia cyfrowej b...Cena: 25.93 zł
1. Wstep
2. SQL Injection
3. Przyklady SQL Injection/ Rozwiazanie problemu
4. Zakonczenie
1. Wstep
Przed przystapieniem do czytania tego tekstu upewnij sie czy w pliku konfiguracyjnym PHP opcja magic_quotes_gpc jest ustawiona na `Off`
Coraz wiecej mlodych programistow PHP/MySQL postanawia tworzyc witryny internetowe oparte na PHP/MySQL nie zdajac sobie sprawy z niebezpieczensta, gdy robi sie to bez zastanowienia, oraz 'na slepo'. Mam na mysli robienie stron typu 'o juz wiem jak pobrac dane i jak zrobic system logowania'. Super, ze juz to potrafisz ale pomyslales ze piszac pierwsza aplikacje
powinienes ja zabezpieczyc ?
2. SQL Injection
SQL Injection (z ang., dosłownie zastrzyk SQL) - Jest to luka/blad powstaly podczas pisania skryptu PHP czy tez innych jezykow typu [ASP,JSP]. Z reguly takie bledy/luki powstaja przez brak doswiadczenia[czyt. wyobrazni] programistow.
Mowa tutaj o tak waznej filtracji danych pobieranych z formularzy, i np. wysylanych do bazy danych.
Dla przykladu, mamy sobie tabele uzytkownicy skad pobieramy potrzebne dane do zalogowania uzytkownika:
<?php
$name = $_POST['name'];
$a = mysql_query("SELECT * FROM uzytkownicy WHERE name = '$name'");
// Dalsza czesc kodu
?>
Taki oto kod, zwroci nam wszystkie dane (dzieki uzyciu * w zapytaniu) z tabeli 'uzytkownicy'. A teraz pomyslmy, jesli by tak odpowiednio spreparowac takie zapytanie, mozna by dostac wiele ciekawsze rezultaty, niz tylko
uzytkownik. Gdyby tak zamiast 'janek' w formularzu wpisac troszke przerobiona nazwe uzytkownika typu hackier' OR '1'='1' , wtedy otrzymamy wszystkie rekordy zamiast jednego wybranego.
Idac dalej, kolejnym powodem aby dobrze zabezpieczac zmienne jest mozliwosc wykonania oto takiego zapytania:
hackier'; DROP TABLE uzytkownicy; Zapewne domyslacie sie juz, ze spowodowalo by to usuniecie tabeli uzytkownicy, przez co moglibyscie stracic wiele cennych danych !
3. Przyklady SQL Injection / Rozwiazanie problemu
Zacznijmy od podstaw, czyli stworzymy baze danych, wgramy przykladowe dane i wykonamy skrypt rejestrujacy/logujacy sie do niej.
/* zapytanie Sql do stworzenia tabeli dla przykladu */
create table uzytkownicy (id int auto_increment primary key,
login varchar(15),haslo varchar(25), poziom varchar(5));
insert into uzytkownicy values (null,'wojtus','superhaslo','admin');
insert into uzytkownicy values (null,'arturek','jeszczelepszehaslo','admin');
insert into uzytkownicy values (null,'ktos','komp','user');
/* plik config.php */
<?php
$connect=mysql_connect('localhost','user','password') or die('Awaria bazy danych...');
mysql_select_db('przyklad');
?>
/* Plik index.php */
<h1>Witaj unknown user!</h1>
<a href="rejestruj.php">Zarejestruj sie!</a><br />
<a href="loguj.php">Zaloguj sie!</a><br />
/* Plik rejestruj.php */
<?php
include('config.php');
if (isset($_POST['login'])){
$query=mysql_query('
insert into uzytkownicy values
(null,''.$_POST['login'].'',''.$_POST['haslo'].'','user')')
or die('Bledne zapytanie!');
}
?>
<h1>Zarejestruj sie!</h1>
<form method="post">
Login:<br>
<input type="text" name="login"><br>
Proponowane haslo:<br>
<input type="text" name="haslo"><br>
<input type="submit" value="Zarejestruj!">
</form>
/* Plik loguj.php */
<?php
include('config.php');
if (isset($_POST['login'])){
$query=mysql_query('
select poziom from uzytkownicy
where login=''.$_POST['login'].''
and haslo=''.$_POST['haslo'].'' limit 1')
or die('Bledne zapytanie!');
$sql=mysql_fetch_assoc($query);
if (!isset($sql['poziom']))
echo('Bledny login lub haslo!
');
elseif ($sql['poziom']=='admin')
echo('Hello My Master ;-) ');
else echo('Hello Normal User ;-( ');
}
?>
<h1>Zaloguj sie!</h1>
<form method="post">
Login:<br>
<input type="text" name="login"><br>
Proponowane haslo:<br>
<input type="text" name="haslo"><br>
<input type="submit" value="Zaloguj!">
</form>
Ok, teraz przejdzmy do dzialania.
Wiec, najpierw zaloguj sie jako:
user: wojtus
haslo: superhaslo
Pojawi Ci sie mily komunikat: "Hello My Master ;-)";
Teraz zaloguj sie jako:
user: ktos
haslo: komp
Teraz pojawi sie komunikat: "Hello Normal User ;-(";
Jednak nie to jest celem tego artykulu, przejdzmy do sedna. Czyli jak teraz nadac naszemu uzytkownikowi range administratora ? Majac baze postaraj sie sam na to wpasc, jesli jednak nie potrafisz ponizej przedstawiam sposob ;-)
Tak wyglada zapytanie do bazy danych MySQL:
insert into uzytkownicy values(null,'login','haslo','user')
A powinno wygladac o tak:
insert into uzytkownicy values(null,'login','haslo','admin')
Patrzac na te zapytania do bazy danych, musimy zmienic ostatnia a zarazem najwazniejsza rzecz, czyli range jaka chcemy miec ;)
Robimy to w oto taki sposob:
1.Zarejestruj sie jako:
login: Twoj login [w moim przypadku bedzie to 'hakier']
Haslo musi byc odpowiednio spreparowane, czyli:
Haslo: haslo', 'admin')/*
2.Logujemy sie:
Login: hakier [ czy Wasz jaki podaliscie podczas rejestracji ;) ]
Haslo: haslo [ czy Wasze haslo jakie podaliscie podczas rejestracji ;) ]
3. Oto wynik!
Ku Twoim oczom ukazuje sie magiczny tekst: "Hello My Master ;-)".
To dla osob ktore odkryly luke w Twoim systemie bedzie chwila bardzo szczesliwa i radosna, ale dla Ciebie ?
Zapewne zadajesz sobie pytanie, jak sie przed tym teraz zabezpieczyc... i tu przychodza z pomoca:
- addslashes();
- stripslashes();
- htmlentities();
- strip_tags();
- htmlspecialchars();
- mysql_escape_string();
Musimy przefiltrowac dane pobierane z formularza dzieki funkcji addslashes, co spowoduje sie dodanie znakow '' przed danymi pobieranymi z formularzy, co spowoduje zatrzymanie wlasnie tego ataku ;-)
Zapewne zadawales sobie pytanie do czego sluzy magic_quotes_gpc czyz nie ?
Funkcja magic_quotes_gpc odpowiada za dodawanie/usuwanie znakow '' pobieranych z formularzy. Polecam sprawdzic na Waszym serwerze [domyslnie juz funkcja magic_quotes_gpc jest wlaczona] czy wlasnie ta funkcja jest zalaczona, nim ktos sie dobierze do Waszych skryptow :).
4. Zakonczenie
To bedzie na koniec w tym tekscie, i pamietajcie ze SQL Incjection to nie jedyny blad popelniany przez mlodych programistow. Mam nadzieje ze wykorzystacie moj artykul jako przestroge, i zaczniecie zwracac uwage na wieksze bezpieczenstwo aplikacji internetowych :).
Greetz: Blackhat, elwin013, Meal, and others ;)
Contact:
>sapcik[at]webhat[dot]pl
>http://webhat.pl
Listing