Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Prevenir: Codigo Malicioso en URL

Estas en el tema de Prevenir: Codigo Malicioso en URL en el foro de PHP en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 19/06/2013, 00:31
Avatar de 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
  #2 (permalink)  
Antiguo 19/06/2013, 01:05
Avatar de repara2  
Fecha de Ingreso: septiembre-2010
Ubicación: München
Mensajes: 2.445
Antigüedad: 13 años, 7 meses
Puntos: 331
Respuesta: Prevenir: Codigo Malicioso en URL

Todo lo que necesitas sabes está aquí: http://phpsec.org/projects/guide/
Saludos
__________________
Fere libenter homines, id quod volunt, credunt.
  #3 (permalink)  
Antiguo 19/06/2013, 06:48
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Prevenir: Codigo Malicioso en URL

podrias hacer algo asi , como ves no se pasa la variable $GET para incluir el archivo si no se compara y ya ejecutamos el include sin ningun peligro
Código PHP:
Ver original
  1. if(isset($_GET['p']))
  2. {
  3.     switch($_GET['p'])
  4.     {
  5.         case 'index.php':
  6.         include'index.php';
  7.         break;
  8.  
  9.         // asi mas paginas
  10.  
  11.         default: // defecto
  12.         include'home.php';
  13.     }
  14. }
  15. else
  16. {
  17.     // por defecto si no existe $_GET['p']
  18.     include 'home.php';
  19. }
  #4 (permalink)  
Antiguo 19/06/2013, 10:30
Avatar de nicolasberro  
Fecha de Ingreso: junio-2013
Mensajes: 14
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Prevenir: Codigo Malicioso en URL

Gracias a ambos por responder!

Gracias por ese codigo, webankenovi, es parecido a lo que hacia yo pero mucho mas simple.
Con respecto al otro caso, de si la ejecucion es anterior o posterior a las verificaciones, tenes alguna idea?
  #5 (permalink)  
Antiguo 19/06/2013, 10:45
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Prevenir: Codigo Malicioso en URL

bueno haber

Código PHP:
Ver original
  1. <?php
  2. if(!isset($_GET['id'])){
  3.      header('Location: index.php');
  4. //SI NO EXISTE, REDIRIJO A INICIO, PODRIA HACER CUALQUIER OTRA COSA, PERO PARA SALIR DEL PASO ELIJO ESTA CONSECUENCIA
  5. }else if(count($_GET) > 2){
  6.      header('Location: index.php');
  7. //SI HAY MAS DE DOS PARAMETROS (ES DECIR, FUE AÑADIDO UNO A MANO POR URL), REDIRIJO A INICIO
  8. }
  9. $id = urldecode($_GET['id']);
  10. $id = trim($id);
  11. $id = seguro($id);
  12. /*ESTAS FUNCIONES SON POR SI ALGUIEN AÑADE ALGO A LA URL MANUALMENTE
  13. Y LOGRANDO SALTAR EL PRIMER FILTRO (DE CANTIDAD DE PARAMETROS,
  14. ES DECIR, QUE LO AÑADEN AL PARAMETRO ID).
  15. La funcion seguro es definida por el usuario (en este caso yo)
  16. y realiza cosas como reemplazar TODO tipo de caracteres especiales,
  17. escapar caracteres, sacar tags html, etc. */
  18. ?>

te refieres ha si yo como usuario escribo en la url algo asi archivo.php?id=<script >scripting</script> esto se ejecutaria antes de que tu valides el dato ? pues segun mi opinion es que asi es seguro si tu validas antes de hacer `por ejemplo echo $_GET['id']; no tiene por que haber problema .

pero una recomendacion es no pasar datos de la base de datos mediante la url , usa en ese caso si es posible sessiones y te quitas de problemas, supongo que ese id es el id de usuario ? y no es muy seguro hacer eso si es tu caso que creo que si y en caso de hacerlo deberias hacerle una codificacion de doble sentido o hashearlo no lo tengo en tu caso muy claro por que no se que es el id que envias

en vez de

web.archivo.php?id=juan usamos web.archivo.php?id=nh4kj3hti84th3ht89th4593ht

pero te recomiendo sessiones por seguridad
  #6 (permalink)  
Antiguo 19/06/2013, 11:18
Avatar de nicolasberro  
Fecha de Ingreso: junio-2013
Mensajes: 14
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Prevenir: Codigo Malicioso en URL

Entiendo.
El id que menciono no tiene nada que ver con los usuarios que utilizan la pagina, sino que es un identificador de un registro de la base de datos. Esto significa que ese identificador lo unico que hace es indicarle a la base de datos (cuya conexion y query es posterior a lo que indique en el fragmento de codigo) que registro debe ir a buscar. Ese 'id' es un parametro obtenido mediante un enlace en otra de las paginas.
Supongamos que al tipo le intereso saber sobre ese determinado registro y entonces hace click y ve toda la informacion que le muestro. Es un sitio sobre estadisticas, lo que hace que un registro pueda aparecer en muchos lados, por tanto uso el sistema este de enlaces para que en cualquier instancia se pueda ir al registro que interese.
Sabiendo esto, te das cuenta que no podria pasar los datos por POST porque los trae un enlace.
  #7 (permalink)  
Antiguo 19/06/2013, 11:23
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Prevenir: Codigo Malicioso en URL

Ok entiendo en ese caso deberias mostrar un identificador al cliente no el original y otro diferente para el servidor y creo que con eso valdria , pero no es muy seguro ya que se puede alterar , puede mandar errores que sirvan para entender mas tu aplicaccion y asi encontrar una vulnerabilidad , para que sea seguro tienes que validarlo correctamente o te expones a ataques ya que es un dato que entra directo en la consulta si no lo verificas muy muy correctamente te expones a inyeccion .
  #8 (permalink)  
Antiguo 19/06/2013, 11:46
Avatar de nicolasberro  
Fecha de Ingreso: junio-2013
Mensajes: 14
Antigüedad: 10 años, 10 meses
Puntos: 1
Respuesta: Prevenir: Codigo Malicioso en URL

Si son estadisticas de un juego. Los datos son sobre puntos de jugadores, etc.
Lo de la exposicion innecesaria de errores lo estuve viendo y puse algunos documentos html por el servidor y en los errores antes de subir al servidor no voy a mostrar mysqli_error() ni nada parecido. Antes de subirla tengo que forzarla a ver que pasa. A inyecciones no me expongo porque en la funcion seguro tengo muchos reemplazos. Voy a intentar idear algo para que sean distintos los identificadores del servidor y del cliente, esa es buena idea.

Bueno, no te robo mas tiempo, muchas gracias!!
  #9 (permalink)  
Antiguo 19/06/2013, 11:49
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Prevenir: Codigo Malicioso en URL

es muy buena idea usar ids diferentes para no comprometer la aplicacion , saludos y de nada xao

Etiquetas: html, malicioso, prevenir, registro, url
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 02:53.