Loading:


    [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




    Dodano przez: Sapcik Ranga: 0 Punktów: 0
    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-2025 v.1.5 | design: diviXdesign & rainbowcolors