Loading:

Mikołajkowa promocja 3za2 - w tym roku przygotuj większą skarpetę!

[PHP, MySQL] SQL Injection/Blind Sql Injection

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



Napisz Artykuł

Listing

niema


Ten wpis posiada swój wątek na forum

Wszystkie pytania prosimy kierować właśnie tam ponieważ komentarze to miejsce na poprawki do kodu lub alternatywne rozwiązania i pytania nie będą publikowane

http://forum.funkcje.net/forum/viewtopic.php?f=5&t=395

Dane do logowania na forum są takie same jak na funkcje.net



Dodano przez: Sapcik Ranga: Poziom 1 Punktów:
Komentarze użytkowników
    • Treść komentarza
      Kod do komentarza (opcjonalnie)
      PHP JavaScript MySQL Smarty SQL HTML CSS ActionScript
      Autor
      Token
      token

       

       








funkcje.net
Wszelkie prawa zastrzeżone©. | Funkcje.net 2008-17 v.1.5 | design: diviXdesign & rainbowcolors