Pogledajte određenu poruku
Staro 17. 03. 2007.   #5
LiquidBrain
Milan Cvejic
Wrote a book
 
Avatar LiquidBrain
 
Datum učlanjenja: 05.09.2006
Lokacija: Beograd
Poruke: 1.241
Hvala: 32
73 "Hvala" u 56 poruka
LiquidBrain će postati "faca" uskoro
Pošaljite poruku preko Yahoo za LiquidBrain
Post Malo detaljnije...

==- Ubrizgavanje SQL koda -==

SQL injection se zasniva na neautorizovanom i uglavnom malicioznom menjanju samog sql querija
bez potrebe da sam napadac ima pristup izvornom kodu same aplikacije. Iako je nacinjena zashtita
od sql injection napada u samom autorizacionom delu aplikacije, ukoliko neki drugi parametar nije
sanitizovan, to znaci da ce napadac i dalje moci da nedozvoljeno menja podatke, i eventualno dobije
vece privilegije od onih koje trenutno ima na sistemu.

Posto uglavnom teoriju niko ne voli, prelazimo odmah na prakticni deo

Primer:
Dakle imamo tabelu korisnici, koja ima tri polja.
Kôd:
    +-----------+----------------------+-----------------+
    |     ID    |   uname              |        pass     |
    +-----------+----------------------+-----------------+
Imamo sledeci deo koda u php-u.

index.php
PHP kôd:
<?php

   $username 
$_GET['uname'];
   
$passwd $_GET['passwd'];
    

    
$query "select * from korisnici where uname = '$username' and pass = '$passwd'";
    
$result =mysql_query($query);
    .
    .
    .
?>
Ostatak koda smo zanemarili.

e sada ukoliko imamo sledeci zahtev na skriptu koju smo malo pre napravili
Kôd:
http://www.example.com/index.php?uname=admin&passwd=123456
nama ce se izvr****i sledeci query:
Kôd:
  select * from korisnici where uname='admin' and pass='123456'
Kao shto vidite ovo je ispravan query. Medjutim, ukoliko stavimo jedan apostrof ispred
bilo koje vrednosti na bilo kom parametru mi direktno menjamo query.
Kôd:
http://www.example.com/index.php?uname='admin&passwd=123456
I u ovo slucaju dobijamo greshku jer query izgleda ovako:
Kôd:
  select * from korisnici where uname= ''admin' and pass='123456'
Primetite dva znaka apostrofa ispred admin. Naravno, sql server ce vratiti gresku,
jer queru nije ispravan. Ali shta ce biti ukoliko prosledimo sledece parametre
nasoj skripti..

Kao username stavimo
Kôd:
     ' OR '1'='1
i isto to za passwd parametar. Dakle
dobijamo sledeci query.
Kôd:
   select * from korisnici where uname= '' OR '1'='1' and pass='' OR '1'='1'
Dakle ispravan query, i to query koji vraca sve redove iz tabele korisnici.
Uspeli smo da se logujemo na sistem bez ikakvih znanja o korisnickom imenu
i sifri. Uglavnom je prvi zapis u tabelama za autorizaciju korisnicko ime administratora,
dobijemo dakle administratorske privilegije.

Posto trenutno nemam vremena da opsirnije obradim ovu temu, shto se tice zashtite
pominjem samo to da treba proveravati svaku vrednost koju korisnik prosledi skripti,
koristeci neke predefinisane funkcije kao shto je mysql_safe_escape_string()
ili koristiti neka pravila (regularne izraze) da bi ste osigurali da korisnik unosi ispravne
podatke.


Off Topic: Posto uskoro registrujem firmu, koja ce se baviti sigurnoshcu, kada
zavrshim svu papirologiju, organizovacu neki brifing vezan za ovu temu.
U svakom slucaju vise detalja ce biti objavljeno kada sve bude pripremljeno.


Pozdrav.
__________________
http://weevify.com
LiquidBrain je offline   Odgovorite uz citat