[ Pink_Panther @ 15.09.2006. 01:15 ] @
Pozdrav svim PHP programerima.

Pošto imam nekoliko stranica koje sam radio u PHPu od kojih su dva portala sa relativno velikim brojem posjeta, želio bi samo da pitam ako ima ikakav način da provjerim da li je čitava stranica ranjiva na PHP injections ili druge oblike zlouporabe.

Pozz svima
[ McKracken @ 15.09.2006. 01:26 ] @
Postoji.

Neko treba da uradi jedan mali security audit od strane nekoga ko se bakce web sigurnoscu il probaj enki od automatizovanih alata kao sto su http://www.acunetix.com/vulnerability-scanner/




Jedino sto moras imati na umu je da ako se rupa otkrije, onda postoji. Ako se ne otkrije, ne znaci da ne postoji.



[ Ivan.Markovic @ 15.09.2006. 09:52 ] @
Citat:
McKracken
Jedino sto moras imati na umu je da ako se rupa otkrije, onda postoji. Ako se ne otkrije, ne znaci da ne postoji.

Podvlacim.

Acunetix je jedan od najboljih alata za testiranje ali opet uz pomoc alata ne mozes sve da otkrijes ...
[ glavince @ 16.09.2006. 14:51 ] @
Intrersantna tema.
Volio bi da cujem vise mislenja i iskustva za sigurnost koda.
Konkretno me zanima koje su mogucnosti da neko napravi stetu preko direktnog zapisivanja podataka iz forme u bazu.
Recimo insert into baza $_POST['bla'].
Ili koje mjere bezbednosti treba preuzeti pri upload fajlova.
Iskreno se nadam da ce se iz ove teme razviti konstruktivni dijalog.
[ Pink_Panther @ 16.09.2006. 15:50 ] @
Citat:
glavince: Intrersantna tema.
Volio bi da cujem vise mislenja i iskustva za sigurnost koda.
Konkretno me zanima koje su mogucnosti da neko napravi stetu preko direktnog zapisivanja podataka iz forme u bazu.
Recimo insert into baza $_POST['bla'].
Ili koje mjere bezbednosti treba preuzeti pri upload fajlova.
Iskreno se nadam da ce se iz ove teme razviti konstruktivni dijalog.

Prvo preko ovog koda INSERT INTO baza $_POST['bla'] može se koristiti SQL injection ako nije obrađen strnig.
Što se tiče uploda failova ja npr. za galerije ograničavam amo na jpg, gif,bmp slike ali pored toga koristim i ograničenje veličine failova i još neke druge sitne modifikacije.
Rizična stvar preko uploada je ako ga npr ne ograničiš na određene failove onda može neko uploadovati PP skriptu sa bilo kojim kodom.
[ glavince @ 16.09.2006. 16:03 ] @
Za oradzivanje stringa koristim:
addcslashes() i mysql_real_escape_string()
$string = addcslashes(mysql_real_escape_string($_GET['string']));
E sad me zanima koja je opasnost ako se string ne obradi.
Ako moze neki primer kako je moguce da neko izmeni ili izbrise nesto u bazi preko forme za input.
I kako bi izgledao $string koji bi bio stetan za podatke u bazi.

[Ovu poruku je menjao glavince dana 16.09.2006. u 17:23 GMT+1]
[ glavince @ 17.09.2006. 20:54 ] @
Testirao sam sledeci kod na PHP 4.3.10 i 5.0.4 i izgleda da ove verzije imaju ugradzenu zastitu od nezeljenih mysql injectiona.
Code:

<?php
echo $_POST['u']."<br>";
echo addslashes($_POST['u'])."<br>";
echo mysql_real_escape_string($_POST['u'])."<br>";
echo addslashes(mysql_real_escape_string($_POST['u']))."<br>";
?>
<form name="test" method="post">
<input type="text" name="u" value="' OR ''='">
<input type="submit" name="ok">
</form>

Output:
\' OR \'\'=\'
\\\' OR \\\'\\\'=\\\'
\\\' OR \\\'\\\'=\\\'
\\\\\\\' OR \\\\\\\'\\\\\\\'=\\\\\\\'
[ Nemanja Avramović @ 17.09.2006. 23:54 ] @
Citat:
glavince:
E sad me zanima koja je opasnost ako se string ne obradi.
Ako moze neki primer kako je moguce da neko izmeni ili izbrise nesto u bazi preko forme za input.
I kako bi izgledao $string koji bi bio stetan za podatke u bazi.


Na primer, selektuješ korisnika sledećim kodom:

Code:
$user = $_POST['user'];
$pass = $_POST['pass'];
$sql = mysql_query("SELECT FROM users WHERE user = '$user' AND pass = '$pass' LIMIT 1");
...


...ako ti neko u $pass ubaci: ' OR 1=1 OR neko_polje = 'neka_vrednost
dobićeš sledeći query:
$sql = mysql_query("SELECT FROM users WHERE user = '$user' AND pass = '' OR 1=1 OR neko_polje = 'neka_vrednost' LIMIT 1");

...a čim je 1 = 1 onda je uslov ispunjen i korisnik će biti selektovan. Ako obradiš string onda će MySQL vratiti grešku prilikom napada, ili tako nešto

p.s. Ovo pišem napamet ali u principu to je to
[ sale83 @ 18.09.2006. 08:36 ] @
Citat:
glavince: Testirao sam sledeci kod na PHP 4.3.10 i 5.0.4 i izgleda da ove verzije imaju ugradzenu zastitu od nezeljenih mysql injectiona.
Code:

<?php
echo $_POST['u']."<br>";
echo addslashes($_POST['u'])."<br>";
echo mysql_real_escape_string($_POST['u'])."<br>";
echo addslashes(mysql_real_escape_string($_POST['u']))."<br>";
?>
<form name="test" method="post">
<input type="text" name="u" value="' OR ''='">
<input type="submit" name="ok">
</form>

Output:
\' OR \'\'=\'
\\\' OR \\\'\\\'=\\\'
\\\' OR \\\'\\\'=\\\'
\\\\\\\' OR \\\\\\\'\\\\\\\'=\\\\\\\'



1)Na to sto mislis da PHP ima zastitu to je ovo(php.ini):
Code:

;PHP.ini
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On

Naravno to je odlicno :)


2) Nemas potrebu da koristis addslashes u kombinaciji sa mysql_real....
Code:

addslashes(mysql_real_escape_string($_POST['u']))."<br>";


dovoljno je samo:
Code:

mysql_real_escape_string($_POST['u']);



3) Mada I dalje sto se tice ispravnosti ovaj kod nije potpuno siguran:
Code:

mysql_real_escape_string($_POST['u']);


Pitas se zasto ???


Odgovor:

Funkcija mysql_real_escape_string() ocekuje da joj se prosledi STRING dok svako moze da joj proseledi Array i naravno tu ce aplikacija da pukne..


Dobijes ovaku gresku
Code:

Warning: mysql_real_escape_string() expects parameter 1 to be string, array given in ...



Znaci kod i dalje nije siguran ako govorimo o programiranju gde je sve bitno sto se tice S ...


Zato treba proveriti sta je korisnik posalo putem POST/GET/COOKIEs

Code:

//recimo jako dobro dodje ako hoces da izbegnes pomenutu gresku sa Array :)
mysql_real_escape_string(is_string($_POST['u']));


....

Ma o sigurnosti mozes dosta da se pise....

Toliko od mene...
Poz
sale


[Ovu poruku je menjao sale83 dana 18.09.2006. u 09:49 GMT+1]
[ Pharos @ 18.09.2006. 11:22 ] @
Ako znaš engleski, sve što te zanima možeš naći ovde.