Loading:


    [PHP, MySQL] SQL Injection w praktyce

    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



    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