- Amazon Web Services w akcji. Wydanie IICena: 64.35 zł
- Odliczając do dnia zero. Stuxnet, czyli prawdziwa historia cyfrowej b...Cena: 25.93 zł
- Firewall nie powstrzyma prawdziwego smoka, czyli jak zadbać o cyberbe...Cena: 31.85 zł
- Bezpieczeństwo systemów informatycznych. Zasady i praktyka. Wydanie ...Cena: 64.35 zł
1. Wstep
2. SQL Injection - part.2 [union select . . .]
3. Zakonczenie
1 . Wstep
Przed przystapieniem do czytania tego tekstu upewnij sie czy w pliku konfiguracyjnym PHP opcja magic_quotes_gpc jest ustawiona na `Off`
Jest to juz drugi artykul z serii poświęconej bezpieczeństwu aplikacji webowych i baz danych.
W tym artykule przedstawie wykorzystanie kolejnych metod SQL Injection oraz sposoby zabezpieczenia sie przed nimi!
Mam nadzieje, ze przeczytales 1 artykul z tej serii, jesli tak nie bede owijal w bawelne i zaczne, a jesli nie to odsylam do pierwszej czesci moich artykulow.
2. SQL Injection - part.2 [union select . . .]
Jesli przeczytales mój wcześniejszy artykuł , to zapewne wiesz co to SQL Injection. W dzisiejszym artykule zademonstruje kolejne ataki/zabezpieczenia, tym razem z wykorzystaniem union select || is_numeric();
Zapewne nie raz widziales strone internetowa z takim oto linkiem:
www.jakas.strona.pl/news.php?id=124
Dlaczego podkreslilem id=124 ? Poniewaz wlasnie na tym sie dzis skupimy, wlasnie ta czesc URL'a bedzie naszym dzisiejszym celem! W jaki sposob? Juz pokazuje ;)
Zabierzmy sie do napisania prostej aplikacji!
Wykonaj ponizszy kod SQL:
create table news (
id int auto_increment primary key,
news text;
);
insert into news values (null,'Jakis tam tekst1');
insert into news values (null,'Jakis tam tekst2');
create table user (
login varchar(10) primary key,
haslo text;
);
insert into user values ('sapcik', 'tajne');
insert into user values ('artur', 'sekret');
/* Plik config.php */
<?php
$connect=mysql_connect('localhost','user','password')
or die ('Awaria bazy danych...');
mysql_select_db('przyklad');
?>
/* Plik index.php */
<?php
include('config.php');
if ((!isset($id)) || ($id==NULL)) {
$pokaz = mysql_query('select id, news from news');
while ($cos = mysql_fetch_assoc($pokaz)) {
echo '<a href="index.php?id='.$cos['id']
.'">ID Newsa: '.$cos['id'].'<br /> '.$id;;
}
mysql_free_result($pokaz);
} else {
$id = $_GET['id'];
echo 'Tak wyglada zapytanie: <b>select id, news from news
where id=''.$id.'' limit 1;</b><br /><br />';
$pokaz = mysql_query('select id, news from news where id=''.$id.'' limit1');
while ($cos = mysql_fetch_assoc($pokaz)) {
echo 'ID Newsa: '.$cos['id'].'<br>Tekst: '.$cos['news']
.'<br /><br />';
}
mysql_free_result($pokaz);
}
?>
Mam nadzieje, ze nie musze tlumaczyc powyzszego kodu, tylko przejde do rzeczy, czyli jak teraz 'zapanowac nad swiatem' [czyt. wykonac dowolne zapytanie SQL]. Wiec bierzemy sie do dziela!
Nasze obecne zapytanie wyglada nastepujaco: select id, news from news where id=$id , a [dla przykladu] mozemy zrobic ze bedzie wygladac o tak:
select id, news from news where id='2' and 1=0 union select * from user /*'' limit 1;
Zastanawiacie sie, co takie zapytanie spowoduje, otoz pobierze wszystkie dane z tabeli i je wyswietli
W naszym przypadku pokaze sie:
Tak wyglada zapytanie: select id, news from news where id='2'
and 1=0 union select * from user /*'' limit 1;
ID Newsa: sapcik
Tekst: tajne
ID Newsa: artur
Tekst: sekret
Metoda `union select` jest najbardziej znana, a pomimo tego nadal wiele stron jest na nia podatna!
Na wlasnym skrypcie udowodnilem w jak latwy sposob mozna wydostac z bazy danych nazwy uzytkownikow badz hasla!
Pomyslcie, jakby to byla dosc spora strona, z danymi kontaktowymi [imie, nazwisko, adres, e-mail itp], ile cennych informacji by wycieklo! A ile taki `hakier` moglby na tym zarobic?! :))
Teraz trzeba sie przed tym zabezpieczyc, z reguly robi to magic_quotes_gpc jednak w naszym wypadku jest on wylaczony, wiec jak to zrobic ? Mozna by uzyc addslashes(), jednak my zrobimy to jeszcze inaczej!
Kazdy news ma swoj unikalny numer id, ktory jest typu integer, takze jest liczba!
W PHP jest taka `czarodziejska funkcja` is_numeric(); dziala ona na zasadzie:
$a = 5;
if(!is_numeric($a)) {
echo '$a nie jest liczba!';
} else {
echo '$a jest liczba!';
}
Teraz zastanow sie jak zabezpieczyc nasz skrypt przed `hakierami` uzywajac funkcji is_numeric();
Oto ostateczny kod zrodlowy:
<?php
include('config.php');
if ((!isset($id)) || ($id==NULL)) {
$pokaz = mysql_query('select id, news from news');
while ($cos = mysql_fetch_assoc($pokaz)) {
echo '<a href="index.php?id='.$cos['id'].'">ID Newsa: '
.$cos['id'].'<br /> '.$id;;
}
mysql_free_result($pokaz);
} else {
$id = $_GET['id'];
if(!is_numeric($id)) {
echo 'News o : '.$id.' nie istnieje, badz podany jest zly id!';
} else {
echo 'Tak wyglada zapytanie: <b>select id, news from news
where id=''.$id.'' limit 1;</b><br /><br />';
$pokaz = mysql_query('select id, news from news where id=''.$id.'' limit1');
while ($cos = mysql_fetch_assoc($pokaz)) {
echo 'ID Newsa: '.$cos['id'].'<br>Tekst: '
.$cos['news'].'<br /><br />';
}
}
}
?>
3. 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