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
- 1508 megtekintés
Hozzászólások
parse_str nem hoz létre objektumot, csak tömbökkel dolgozik. $b-> nem lesz érvényes...
- A hozzászóláshoz be kell jelentkezni
Ez így van , én azon filózom mi értelme így a kódnak. :)
- A hozzászóláshoz be kell jelentkezni
Talán, hogy a $b változó (objektum) máshol kap értéket?!
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
Koszi a valaszokat.
Nem tudom miert irtak igy meg a kodot. De a lenyeg, hogy nem lehet code injectionhoz hasznalni.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
A publikus admin panel az smafu?
- A hozzászóláshoz be kell jelentkezni
not sure if irony
- A hozzászóláshoz be kell jelentkezni
Pontosan mire gondolsz? (Ez nekem szólt egyáltalán?)
--
Pásztor János
Sole Proprietor @ Opsbears
Development Lead @ IXOLIT
Refaktor Magazin
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
It was irony :)
- A hozzászóláshoz be kell jelentkezni
Ránézésre ez egy elavult pluginnal felnyomott wordpress. Úgy aztán nem túl meglepő az eval.
https://blog.sucuri.net/2014/12/revslider-vulnerability-leads-to-massiv…
- A hozzászóláshoz be kell jelentkezni
(rossz helyre)
- A hozzászóláshoz be kell jelentkezni
Valami kimaradt a kódból, nem? Pl:
$b = parse_str($parameters);
$str = '$start = "'.$b->start.'";';
eval($str);
Vagy mit tudom én.
- A hozzászóláshoz be kell jelentkezni
a parse_str void típusú, nincs visszatérési értéke. Alapértelmezetten a globális változókat cseszteti, ha a második paraméterként egy array referenciát adsz neki, akkor azt
// Happy debugging, suckers
#define true (rand() > 10)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni