Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/06/2013, 00:31
Avatar de nicolasberro
nicolasberro
 
Fecha de Ingreso: junio-2013
Mensajes: 14
Antigüedad: 10 años, 10 meses
Puntos: 1
Prevenir: Codigo Malicioso en URL

Buenas!

Estuve viendo que en algunos casos se puede insertar codigo malicioso en la URL de manera que nuestro sitio ejecute acciones (como pudiera ser abrir ficheros externos) que no sean las que nosotros programamos.
Suponiendo que en la URL yo traigo dos parametros:
1- al ser sitio dinamico, la pagina que se incluira en la plantilla(entendida como la interfaz unica comun en todas las paginas) general(Le pondremoos el nombre hipotetico 'p').
2- identificador de un determinado registro en una BD(le pondremos el nombre hipotetico 'id').

Dado esto, y puesto que las verificaciones de 'p' estan directamente en la pagina index, me centro solo en 'id' y realizo lo siguiente:

Código PHP:
<?php
if(!isset($_GET['id'])){
     
header('Location: index.php');
//SI NO EXISTE, REDIRIJO A INICIO, PODRIA HACER CUALQUIER OTRA COSA, PERO PARA SALIR DEL PASO ELIJO ESTA CONSECUENCIA
}else if(count($_GET) > 2){
     
header('Location: index.php');
//SI HAY MAS DE DOS PARAMETROS (ES DECIR, FUE AÑADIDO UNO A MANO POR URL), REDIRIJO A INICIO
}
$id urldecode($_GET['id']);
$id trim($id);
$id seguro($id);
/*ESTAS FUNCIONES SON POR SI ALGUIEN AÑADE ALGO A LA URL MANUALMENTE 
Y LOGRANDO SALTAR EL PRIMER FILTRO (DE CANTIDAD DE PARAMETROS, 
ES DECIR, QUE LO AÑADEN AL PARAMETRO ID). 
La funcion seguro es definida por el usuario (en este caso yo) 
y realiza cosas como reemplazar TODO tipo de caracteres especiales, 
escapar caracteres, sacar tags html, etc. */
?>
La pregunta puntual seria si verificando los datos por URL logro impedir que se ejecute el codigo malicioso o si la ejecucion es una instancia previa y con estas medidas no logro hacer nada.
------------------------------------------------------------
Por otro lado, he visto tambien que los include tienen ciertas vulnerabilidades. Por tanto, me pregunto si el siguiente codigo las presenta:

Código PHP:
<?php
if(!isset($_GET['p']) || 'index.php' == $_GET['p']){
     include 
'home.php';
}else{
     
$p $_GET['p'];
    include 
$p;
}    
?>
Esto es simple, lo que se ve. La pagina index que contiene la plantilla comun a toda la pagina y "por defecto" ponemos a home como pagina principal y evitamos el efecto de espejo repetido (cuando una pag se incluye a si misma). Luego, dependiendo de los valores de p, incluimos una u otra pagina. Si se incluye una pagina que no esta en el directorio, saldra el warning o notice correspondiente. Sin embargo, si el atacante lograra introducirme un archivo en mi directorio y le pasa como valor del parametro 'p' el nombre de ese archivo introducido , por las dudas realizo la siguiente comprobacion:

-Dado un array secuencial (llamemosle '$pes') con todos los valores del parametro 'p' posibles, codeamos:

Código PHP:
<?php
function inclusionSegura($p,$pes){
     
$seguro FALSE;
     for(
$it 1$it <= count($pes); $it++){
          if(
$p == $pes[$it]){
               
$seguro TRUE;
                return 
$seguro;
           }
      }
       if(
FALSE == $seguro){
              return 
$seguro;
        }
}

//Luego, en index, hago:
if(FALSE == inclusionSegura($p$pes)){
    echo 
'<script type="text/javascript">window.location="http://www.google.com";</script>';
/*Aqui lo mando a google si me incluye una pagina que no esta en lo previsto. 
Lo hago por javascript ya que, al haber insertado html previamente en index.php,
 no me deja modifcar la cabecera. */
}else{
   include 
$p;
   
//finalmente tenemos un $p que sabemos que es de nuestra pagina, asique lo incluimos tranquilos
}
?>

Bueno, me pregunto si esto tiene problemas de seguridad y como los puedo solucionar, o que le puedo agregar para que sea mejor.
Otra cosa que me resulto interesante hacer es: cambiar el array secuencia $pes por uno asociativo que tenga el nombre de la pagina a incluir y el numero de parametros que recibe y hacer una verificacion mas, que compruebe que ambos sean correcto. Pero bueno, primero me aseguro que esto valga la pena.

Disculpen las molestias y desde ya agradeco la ayuda.
Saludos!

Última edición por nicolasberro; 19/06/2013 a las 00:34 Razón: Comentarios Largos