php code injection

Sziasztok
Talaltam egy erdekes kodot az egyik belso ceges programban. Azt szeretnem megkerdezni a hozzaertoktol, hogy ez a kodreszletet ki lehet-e hasznalni code injectionhoz.


parse_str($parameters);
$str = '$start = "'.$b->start.'";';
eval($str);

Tehat az lenne a kerdes, hogy a $parameters valtozoban lehet olyan ertek, hogy a masodik sornal ne legyen "Trying to get property of non-object" hiba es barmit le lehessen futtanti.
Maskeppen fogalmazava: mi kellene legyen a $parameters valtozoban hogy a parse_str() utan a $b->start modjuk legyen :


alma";phpinfo();$tmp="aa

Remelem nagyjabol ertheto
koszi

Hozzászólások

parse_str nem hoz létre objektumot, csak tömbökkel dolgozik. $b-> nem lesz érvényes...

A parse_str nem fogja deserializálni a benne lévő tartalmat, vagyis nem tudsz objectet létrehozni, így a $b->start mindig egy notice-t fog generálni. Ebben az esetben, mivel az $str elején a '$start' fixen adott, ez a kód nem alkalmas arra hogy code injection-höz használd fel

// Happy debugging, suckers
#define true (rand() > 10)

Koszi a valaszokat.
Nem tudom miert irtak igy meg a kodot. De a lenyeg, hogy nem lehet code injectionhoz hasznalni.

Alapvetoen azt erdemes tudni a PHP-rol, hogy az eval() fuggvenynek NULLA valid felhasznalasa letezik. Termeszetesen az eval()-on kivul is leteznek code injection lehetosegek szep szammal, de ez kifejezetten razza a pofonfat. Az illeto kodot lekoveto "fejlesztot" csokoltatom.

--
Pásztor János
Sole Proprietor @ Opsbears
Development Lead @ IXOLIT
Refaktor Magazin

Az első google találaton egy wordpress-re telepített "kiegészítő" (az eval-os funkciót nem tudom, a wordpress szolgáltatja-e) van, bármiféle authentication nélkül, és van egy eval()-os funkció. Hogy most ezt pozitív vagy negatív példaként hozta, én is érdeklődném, mert ez nagyjából pont az, amit nagyon nagyon nem kéne.

(+1 arra, hogy nem találkoztam még olyan feladattal, amire az eval kellett volna, lehet van, várok rá értelmes javaslatokat)

Valami kimaradt a kódból, nem? Pl:


$b = parse_str($parameters);
$str = '$start = "'.$b->start.'";';
eval($str);

Vagy mit tudom én.

Akkor pl. a $b-be is azt rak, amit akar, nemde?

Pl mókás kedvű felhasználók nulla idő alatt csinálnak ilyesmiket:


#!/usr/local/bin/php
<?php
$evil_str = 'alma\'; echo "meglepődtél, mi"; #\'';

eval ('$somestring=\''.$evil_str.'\'');
?>

Szerk: ja, most kapcsolok, azt nem tudtam, hogy a parse_str egy builtin függvény. Megnézve a leírást a 'register_globals' jutott eszembe, de nemcsak nekem: http://php.net/manual/en/function.parse-str.php

Egészen pontosan ráhibáztál a dologra! :)
A fenti példában csak azért nem lehet ezt megcsinálni, mert ott a fertőzhető változó egy object property-je, a parse_str pedig nem deserializálja a stringet, így nem lehet létrehozni a szükséges object-et az inject-hez.

// Happy debugging, suckers
#define true (rand() > 10)