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



 
  
				

 
                             
 


 
                        
 
		 
	