Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki 1 do 10 z 11

Temat: [sql injection] zabezpieczenie

  1. #1
    Avatar Ormi
    Ormi jest offline %x-%x-%x-%n
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie [sql injection] zabezpieczenie

    Mam taki skrypt:
    Kod:
    <?php
    if(!isset($_GET['id']) || !isset($_GET['cat'])) {
    die("Musisz podać id artykułu! :)<br />") ;
    }
    
    else {
    $connect = mysql_connect("mysql.cba.pl", "cos", "cos") or die("Cannot connect to MySQL") ;
    mysql_select_db("ormi_c0_pl") ;
    $id = $_GET['id'] ;
    $cat = $_GET['cat'] ;
    $idq = "SELECT id FROM " . $cat ;
    $resultid = mysql_query($idq) or die(mysql_error()) ;
    $ida = mysql_fetch_array($resultid) ;
    // $ida['id'] ;
    $query = "SELECT gdzie,priv,title FROM " . $cat . " WHERE id=" . $id['id'] ;
    $result = mysql_query($query) or die(mysql_error()) ;
    while($what = mysql_fetch_array($result)) {
    extract($what) ;
    }
    $file = fopen($gdzie, 'r') ;
    $tresc = fread($file, filesize($gdzie)) ;
    fclose($file) ;
    $tresc = nl2br($tresc) ;
    $html =<<<EOD
    
    <jakis html>
    
    $tresc 
    
    EOD;
    echo $html ;
    } 
    ?>
    Jak widać jest to podatne na SQL Injection w paramatrach id i cat. Tu pojawia się moje pytanko - jak się przed zabezpieczyć?
    Myślę, że najlepiej filtrować te parametry i nie pozwalać na wpisanie takich wyrażeń jak np. "union"
    Tylko, że nie przechodzi mi nic ciekawego do głowy, jak to filtrować. Można prosić o radę?
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  2. #2
    Avatar rafal44
    rafal44 jest offline logout
    Zarejestrowany
    Dec 2007
    Postów
    291

    Domyślnie

    Zmienne filtrujesz funkcją addslashes:
    Kod:
    $cat=addslashes($_GET['cat']);
    Wtedy przed apostrofem zostanie dodany backslash.
    Nie wiem czy da się to obejść ale widziałem skrypty, które dalej filtrowały zmienną.
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  3. #3
    Avatar Ormi
    Ormi jest offline %x-%x-%x-%n
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    Slashe on wstawia automatycznie. Ustawienia serwera
    Ale to raczej nie wystarczy. Większość ataków SQL Injection, które JA przeprowadziłem była taka, że addslashes by nic nie dało, bo nie używałem znaków specjalnych Wolę więc na tej funkcji nie polegać...
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  4. #4
    Zarejestrowany
    Aug 2008
    Postów
    36

    Domyślnie

    Cytat Napisał Ormi Zobacz post
    Slashe on wstawia automatycznie. Ustawienia serwera
    Ale to raczej nie wystarczy. Większość ataków SQL Injection, które JA przeprowadziłem była taka, że addslashes by nic nie dało, bo nie używałem znaków specjalnych Wolę więc na tej funkcji nie polegać...
    Czyli dopisywaleś się w miejscach gdzie wpisuje się np. numery a programista nie używał, do dopisywania numeru do bazy danych, apostrofów?

    Bo jak nie to w jaki sposób zamykałeś ciąg znaków, który zostanie wstawiony w bazę jako jakiś tam rekord?
    "Czasem człowiek sądzi, że ujrzał już dno studni ludzkiej głupoty,
    ale spotyka kogoś, dzięki komu dowiaduje się,
    że ta studnia jednak nie ma dna."
    - Stephen King

  5. #5
    Avatar Ormi
    Ormi jest offline %x-%x-%x-%n
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    Dokładnie tak jak mówisz Nie trzeba było nic zamykać
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  6. #6
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Ja bym zwrocil uwage na blad w samych zalozeniach jakie podajesz...

    Jesli masz podac ID i CAT (pisze wielkimi literami celowo akurat) i Ty projektujesz ten system to sprawa jest prosta - wiesz jakie wartosci moze przyjmowac parametr, prawda?

    Glowny blad jaki probujesz popelnic, to filtrowac z parametrow rzeczy takie jak UNION, JOIN, WHERE oraz inne takie, filtrowac znaki zapisane jako 'URLEncoded' itd... Po co? Chyba po to aby dac sie zlapac na cos, o czym Ty nie pomyslales, nie dodales do filtra... a ktos pomyslal i juz Twoja strona nie jest Twoja. Po prostu nie ma mocnych abys obronil sie w ten sposob przed atakami ktorych nie znasz.

    Propozycja rozwiazania
    ID powiedzmy ze masz numeryczne (numer artykulu), CAT to nazwa kategorii (np. news, download, linux, security, itd. - po prostu wyraz). W tym wypadku filtrowanie zrobilbym nastepujaco:
    1. Pobierasz parametry przekazane w $_GET... w sumie php pobiera je za Ciebie ale ja nie skupiam sie tylko na PHP
    2. Pobierasz z bazy liste dostepnych kategorii (przeciez artykuly sa w bazie do czego podpiete... maja ID i kategorie do ktorej naleza) - wiesz na 100% jakie kategorie sa poprawne
    3. Sprawdzasz czy ID zawiera tylko cyfry (jesli nie-cyfry to ID nie jest poprawne i juz)
    4. Sprawdzasz czy wartosc zapisana w $_GET['cat'] wystepuje wsrod wartosci ktore zwrocila baza. Wartosc musi byc == lub eq czyli zmienne musza byc sobie rowne - inaczej blad...

    Jesli wystapi blad to nie mowisz co sie stalo, wyswietlasz strone glowna a blad logujesz na serwerze. Jesli martwisz sie ze ktos moze wpisac duze/male litery gdzies w nazwie kategorii to mozesz przed porownaniem obie zmienne sprowadzic do malych/duzych liter i masz problem z glowy - jak sie 2 napisy nie zgadzaja to znaczy ze ktos chce wejsc do kategorii ktora nie istnieje.

    Czy potrzeba wiec siedziec i kombinowac jak odfiltrowac parametry itd? Moze zamiast robic liste niechcianych elementow (blacklist) wystaczy usiasc chwilke, pomyslec i zrobic whiltelist tego co dozwolone?

    Jesli to Twoj kod to mozesz go zrobic jak chcesz i w tej sytuacji odfiltrowywanie jakichkolwiek smieci nie ma sensu - ja bym takie podejscie okreslil jako broken by design.
    Odfiltrowywanie niechcianych elementow MA SENS tylko wtedy, gdy kod nie jest Twojego autorstwa, nie mozesz go zmienic lub nie chcesz... wtedy filtrowanie wejscia na zasadzie blacklist'y ma jakis sens - lepsze to niz nie robic filtracji w ogole.

    To takie moje 2gr
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  7. #7
    Avatar Ormi
    Ormi jest offline %x-%x-%x-%n
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    Dzięki za radę TQM Wprowadziłem takie "filtrowanie" :
    Kod:
    $id = $_GET['id'] ;
    if(eregi("[a-z]", $id))
    {
    die("Hax00r :D") ;
    }
    $cat = $_GET['cat'] ;
    function check($zmienna) {
    $secq = "SELECT name FROM categories" ;
    $secresult = mysql_query($secq) ;
    while($sec = mysql_fetch_array($secresult))  {
    	if($sec["name"] === $zmienna) {
    		return 1 ;
    	}
    
    }
    return 0 ; 
    }
    $checkr = check($cat) ;
    if($checkr == 0) {
    die("Hax00r :D") ;
    }
    Czy teraz lepiej? Jeszcze dorzucę za chwilę do tego logowanie prób sql injection.
    Ostatnio edytowane przez Ormi : 10-31-2008 - 17:54
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  8. #8
    Zarejestrowany
    Jun 2006
    Skąd
    rand(.eu)
    Postów
    8,748

    Domyślnie

    Funkcjonalnie jest minej wiecej to o czym napisalem - duzo lepiej niz proponowales na poczatku... ale i tak u mnie ten kod by na serwery produkcyjne nie poszedl bo nadal mozna to zrobic lepiej moim zdaiem - widze ze nadal robisz filtrowanie przez blackliste...

    1. $_GET['id'] ma zawierac tylko cyfry? Nie rozumiem wiec dlaczego zglaszasz blad gdy zawiera litery? Co ze znakami bialymi, znakami specjalnymi itd?
    2. W razie gdy filtr wykryje cos czego byc nie powinno, zglasza blad do przegladarki - dokladnie robisz to czego lepiej unikac...

    Nie podam Ci kodu gotowego... zmieniaj dalej to co masz, idziesz w odpowiednim kierunku - chodzi mi o to abys sam doszedl do tego o czym mowie i sam doszedl do wniosku ze to ma sens i ze prawdopodobnie tak chcialbys napisac swoj kod. Pamietaj jednak, ze jest to tylko moja propozycja - mozesz napisac inaczej, zmodyfikowac, poprawic - ja bym jednak na poczatek zrobil tak jak opisalem wczesniej.
    ctrl-alt-del.cc - soft reset site for IT admins and other staff :-)

  9. #9
    Zarejestrowany
    Jul 2008
    Skąd
    PL
    Postów
    135

    Domyślnie

    Nie podam Ci kodu gotowego... zmieniaj dalej to co masz, idziesz w odpowiednim kierunku - chodzi mi o to abys sam doszedl do tego o czym mowie i sam doszedl do wniosku ze to ma sens i ze prawdopodobnie tak chcialbys napisac swoj kod.
    Nie będę podważał kompetencji @TQM-a i też nie podam Ci gotowych rozwiązań, ale dorzucę swoje 3 bity, z racji tego, że też zawodowo zajmuję się php-em

    @Ormi - rozwiązanie powyżej jest ok, ale ja mam dla Ciebie inną wskazówkę. Skoncentruj się na zmiennych otrzymywanych z GET-a. Jeśli odpowiednio je potraktujesz, zanim przekażesz do zapytań, nic nie będziesz musiał zmieniać w pierwotnym skrypcie. Po prostu, zastanów się nad drogą, jaką przechodzi np. $_GET['id] w Twoim skrypcie i pomyśl, co zrobić, by do zapytania dotarła ta zmienna tylko jako liczba całkowita bez znaku
    "...i stało się! Linie telefoniczne otworzyły mi bramę do świata
    upajającego jak heroina pulsująca w żyłach ćpuna! Elektronicznym
    sygnałem przekraczam wrota szukając ucieczki od codzienności,
    głupoty i niesprawiedliwości... i znajduję podobnych sobie."

  10. #10
    Avatar Ormi
    Ormi jest offline %x-%x-%x-%n
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    @TQM:
    Ad. 1
    Zrobiłem tak:
    if(!is_numeric($id)) {
    <blabla>
    }
    Ad. 2
    Zamiast zgłaszać błąd zrobiłem tak:
    header("Location:index.php") ;
    <loguje błąd>
    die() ;
    --------------------------------------
    A co do tej blacklisty - chyba nie do końca rozumiem co masz na myśli mówiąc, że dalej jej używam Przecież nie filtruję konkretnych słów, tylko znaki, które nie są numeryczne, więc jak na mój gust blacklista to nie jest

    @blooregard: To rozwiązanie na razie sobie odpuszczę, bo dopiero się uczę php i nie wiem za bardzo jak to zrealizować, a nie chce mi się teraz z tym męczyć
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

Strona 1 z 2 12 OstatniOstatni

Podobne wątki

  1. Sql Injection
    By xbitdesigns in forum Inne metody
    Odpowiedzi: 2
    Autor: 01-03-2015, 10:06
  2. Pomoc ze SQL Injection
    By I_Own_You in forum Newbie - dla początkujących!
    Odpowiedzi: 15
    Autor: 07-23-2008, 17:54
  3. SQL injection
    By Quers in forum Newbie - dla początkujących!
    Odpowiedzi: 4
    Autor: 06-30-2008, 06:22
  4. sql injection
    By h3x in forum Hacking
    Odpowiedzi: 4
    Autor: 05-15-2008, 18:48
  5. sql injection
    By ble34 in forum Security
    Odpowiedzi: 7
    Autor: 06-13-2007, 16:45

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj