[ MalGanis @ 07.06.2009. 10:25 ] @
Znam da je bilo dosta reči o ovoj temi, ali nikako do sada nisam uspeo da na nekom primeru primenim SQL Injection.
Naime, potreban mi je prost primer kako preko Login forme na Web sajtu koji radi pod localhostom da primenim MySQL Injection?
Neka tabela admin u bazi ima 3 polja :

+-----------+----------------------+
| ID | username | password |
+-----------+----------------------+



Code:

<?php
    include "common.inc";
    $db_link = db_connect();
                
    $query = "SELECT * FROM admin WHERE username = '$username' AND password = '$password' ";
    $result = mysql_query($query, $db_link);
    $row = mysql_fetch_row($result);
    if ($row != null)
    
        header("Location:AdminHome.php");
    else 
    
        header("Location:NeuspelaPrijava.php");
?>    



Na strani gde je Login forma za prijavu administratora, u polju za username kucam ' OR '1'='1 i isto to za password parametar. Međutim, neuspeo Injection jer me uvek vrati na NeuspelaPrijava.php

Relativno sam nov u PHP-u i MySQL-u, unapred hvala.
[ Nikola Poša @ 07.06.2009. 13:28 ] @
Probaj ove vrednosti za username i password:
Code:
$username = "a' OR '1'='1";
$password = "a' OR '1'='1";

Za tu vrstu SQL injection-a se obično podrazumeva da znaš username nekog člana, pa onda samo za password staviš tako nešto: a' OR '1'='1...

Mada u tabelama sa tim podacima o korisnicima, password je (obično) u enkriptvanom formatu, pa sad ne znam kako bi neki injection "zaobišao" ovakav upit:
Code:
SELECT * FROM users WHERE username = '$username' AND password = SHA1('$password');
[ misk0 @ 07.06.2009. 13:37 ] @
Citat:
Nikola Poša:
Mada u tabelama sa tim podacima o korisnicima, password je (obično) u enkriptvanom formatu, pa sad ne znam kako bi neki injection "zaobišao" ovakav upit:
Code:
SELECT * FROM users WHERE username = '$username' AND password = SHA1('$password');


Pa ako znas da tako izgleda query mozes napisati reicmo
$password= ') OR '1'=('1

[ MalGanis @ 07.06.2009. 15:30 ] @
Code:
<?php
    include "common.inc";
    $db_link = db_connect();
                
    $query = "SELECT * FROM admin WHERE username = '$username' AND password = '$password' ";
    $result = mysql_query($query, $db_link);
    $row = mysql_fetch_row($result);
    if ($row != null)
    
        header("Location:AdminHome.php");
    else 
    
        header("Location:NeuspelaPrijava.php");
?>  


Čudi me da ovako jednostavan php skript za proveru identiteta korisnika koji ne sadrži niti jednu od funkcija za kriptovanje (sha i md5) ne može da se "odradi" pomoću sql injectiona, tačnije znam da može, ali meni nikako ne uspeva.

Inace, pokusavao sam preko Xamp-a (Apache 2.2.11,MySQL 5.1.33 ) i preko phpTriad, međutim uvek kada pokušam da u poljima za username i password unesem:

"a' OR '1'='1"
ili
' OR '1'='1

vraća me na grešku pri prijavi, neispravni user i pass.

Dakle, kako primeniti SQL Injection, tacnije kako postaviti kod da bi bio otvoren za injection?
[ Nikola Poša @ 07.06.2009. 16:32 ] @
Citat:
misk0: Pa ako znas da tako izgleda query mozes napisati reicmo
$password= ') OR '1'=('1

Da, u pravu si, tačnije samo ovako nešto:
Code:
$password= "'a') OR '1'=('1'";

Citat:
MalGanis:Dakle, kako primeniti SQL Injection, tacnije kako postaviti kod da bi bio otvoren za injection?

A jesi probao npr. u phpMyAdmin-u da izvršiš neki od tih upita?
[ tarla @ 07.06.2009. 16:48 ] @
da nije uključena opcija magic_quotes ili tako nešto ?
[ MalGanis @ 07.06.2009. 19:03 ] @
Citat:
tarla: da nije uključena opcija magic_quotes ili tako nešto ?


magic_quotes_gpc = On
magic_quotes_runtime = Off / ako se ne varam meni je za ovaj slucaj bitna ova, a ona je kao sto se vidi of
magic_quotes_sybase = Off
[ Nikola Poša @ 07.06.2009. 20:13 ] @
Probaj samo da jednom otštampaš tu promenljivu $query, pre mysql_query(), čisto da vidiš da li ima onih backspace-ova pre jednostrukih navodnika...
[ bogdan.kecman @ 08.06.2009. 08:06 ] @
obzirom na to da vrednosti skupljas iz get/post/cookie .. validna vrednost za magic quotes ti se nalazi u deprecated magic_quotes_gpc ... te kada pokupis tu vrednost kroz post/get php ti sam odradi escape tih navodnika i ostalih smor znakova te samim tim sprecava injection.
[ tarla @ 08.06.2009. 12:54 ] @
Citat:
MalGanis: magic_quotes_gpc = On


rekoh li ja... :)

[ Marko Medojević @ 11.06.2009. 21:13 ] @
Magic quotes izvršava addslashes() funkciju nad svim vrednistima koje kupiš iz GET/POST nizova, tako da ti to verovatno smeta da uradiš sam sebi MySQL injection. Probaj da isključiš magic quotes u .htaccess-u ili da pre primene injectiona pozoveš stripslashes funkciju nad ulaznim parametrima koje ubacuješ u upit.
Primer:
Code:

$username = stripslashes($_GET['username']);
[ MalGanis @ 15.06.2009. 22:08 ] @
Da, hvala na odgovorima.

Od krucijalnog značaja je magic quotes = off