Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Temas relacionados > Seguridad
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-12-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Cross Site Scripting (XSS)

Hola a todos,

Acabo de recibir un correo de alguien que se interesó por Loturak (y venga con Loturak, qué pesado...) hasta el punto de hacer algunas pruebas... comprometodoras. El caso es que me informa de la posibilidad de conseguir realizar "Cross Site Scripting (XSS)" en la aplicación. Ha sido tan amable que me ha enviado dos URLs de ejemplo:

Código:
http://loturak.es/compartir?p=2&demo"><script>alert(123)</script>

http://loturak.es/compartir?n=20&o=fd&b=demo" onmouseover=alert(123) "

Y bien. Yo me dispongo a investigar el tema, pero, ¿se os ocurre algo? ¿qué puede estar sucediendo? ¿Cómo podría evitarse? ¿Qué demonios significa esa variable de nombre "demo"? ¿Cómo se consigue al cabo que se ejecute el JavaScript? ¿Hasta qué punto compromete la seguridad esto? Huf, huf, huf...

Gracias desde aquí a quien me envió la información. No revelo su nombre por si no le apetece. Ya le remití un correo con mi agradecimiento, entre otras cosas. Y gracias a vosotros también por cualquier comentario que tengáis a bien hacer sobre todo esto.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 04-12-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

El problema con la primera URL solucionado... o eso creo, de momento. Se trataba de cierta función utilizada para propagar variables "GET". Precisamente, esta función no la escribí yo de mi copete, sino que más bien la adapté de cierto código, como puede verse:

Código PHP:
/**
 * Propaga las variables contenidas en $_GET en la URL de la página que
 * llame a esta función. Utilizamos esta función básicamente para la pa-
 * ginación de enlaces.
 *
 * El algoritmo principal de esta función está tomado del Script Paginator
 * escrito por Jorge Pinedo Rosas (http://jpinedo.webcindario.com)
 *
 * @author dec
 * @since 0.0.1
 * @access private
 * @param string $menosEstaVar Nombre de la variable que no debe propagarse
 * @return string
 */
function PropagarVariblesGet($menosEstaVar '')
{
  
$qs '';
    if((
$menosEstaVar != '')
     && isset(
$_GET[$menosEstaVar]))
      unset(
$_GET[$menosEstaVar]);

  
$aPropagar array_keys($_GET);
  foreach(
$aPropagar as $varGet)
  {
       if(isset(
$GLOBALS[$varGet])) {
          
$qs.= $varGet."=".$GLOBALS[$varGet]."&";
      }
     elseif(isset(
$_REQUEST[$varGet])) {
         
$qs.= $varGet."=".$_REQUEST[$varGet]."&";
     }
    } 
// endfor

  
return $qs;

Pues bien. Escapando las variables que nos llegan conseguimos salvar el obstáculo puesto por la primera URL. Es decir, la función ha quedado así de momento:

Código PHP:
function PropagarVariblesGet($menosEstaVar '')
{
  global 
$bdatos;  // Nuevo

  
$qs '';
    if((
$menosEstaVar != '')
     && isset(
$_GET[$menosEstaVar]))
      unset(
$_GET[$menosEstaVar]);

  
$aPropagar array_keys($_GET);
  foreach(
$aPropagar as $varGet)
  {
      
$varGet $bdatos->Escapar($varGet); // Nuevo
       
if(isset($GLOBALS[$varGet])) {
          
$qs.= $varGet."=".$GLOBALS[$varGet]."&";
      }
     elseif(isset(
$_REQUEST[$varGet])) {
         
$qs.= $varGet."=".$_REQUEST[$varGet]."&";
     }
    } 
// endfor

  
return $qs;

Aún estoy con la segunda de las URLs... ¿qué os parece de todo esto? ¿Curioso cuando menos no?

Por cierto, el método "Escapar" de la clase "Bdatos" y es tal cual:

Código PHP:
    /**
     * Escapa una cadena para su inserción en la base de datos.
     *
     * Atención: este método no asegura la entrada del usuario, que es algo
     * que deberá hacer en todo caso por otros medios.
     *
   * @author dec
   * @since 0.0.1
   * @version 1.0
     * @param string $cadena Cadena a escapar.
     * @return string
     */
    
function Escapar($cadena) {
        return 
mysql_real_escape_string(stripslashes
         
(strip_tags($cadena)), $this->enlaceConexionBd);
    }
    
/* function */ 
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 04-12-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Cómo lees los parámetros de entrada? Creo que sería útil pasarles un strip_tags.

// Saludos
Responder Con Cita
  #4  
Antiguo 04-12-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Román
¿Cómo lees los parámetros de entrada? Creo que sería útil pasarles un strip_tags.
Creo que me he adelantado. Confírmamelo Román, por favor.

Por otro lado, a ver qué ocurre con la segunda URL...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
Antiguo 04-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por dec
¿Cómo se consigue al cabo que se ejecute el JavaScript?
Pues insertando el script dentro del código de tu pagina.

Donde debería de aparecer esto:
Código:
<a href="/compartir?p=1" title="Mostrar la página anterior">
Pasa a aparecer esto otro
Código:
<a href="/compartir?demo"><script>alert(123)</script>=&amp;p=1" title="Mostrar la página anterior">
En tu código php tienes esto
Código:
$url = Servidor::PhpSelfSinExtension() .'?';
$url .= Servidor::PropagarVariblesGet(APP_VAR_REQUEST_NUM_PAGINA_ENLACES);
$url .= APP_VAR_REQUEST_NUM_PAGINA_ENLACES.'=';
$url = Servidor::UrlParaXhtml($url);
Como ves metes todas las variables get sin comprobar si algún listo añadió alguna por su cuenta.

Y en este otro tramo:
Código:
<a href="'.$url.$i.'" title="'._r('Mostrar la página siguiente').'">
Así que aprovecha esto para insertar parámetros de mas en la url, estos parámetros contienen caracteres como < y " que tu insertas directamente en tu pagina. De esta manera cierra la etiqueta del enlace e inserta el código del script.

Cita:
Empezado por dec
¿Hasta qué punto compromete la seguridad esto?
Un script podría hacer que en tu pagina se mostraran cosas que no tienen nada que ver contigo. Con el consiguiente riesgo que esto conlleva. Por ejemplo Cross Site Scripting se utiliza para el phising.
Responder Con Cita
  #6  
Antiguo 04-12-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Vale, todo mi trabajo de detective a la porra ...
Responder Con Cita
  #7  
Antiguo 04-12-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Para nada Seoane. Ni mucho menos.

Por otro lado la segunda URL es curiosa. Se consigue el mismo efecto escribiendo en la casilla de búsqueda de Loturak: demo" onmouseover=alert(123) "

Al cabo en la página se termina escribiendo el siguiente código:

Código:
<input name="b" value="demo\" onmouseover="alert(123)" \="" id="casillabusqueda" class="inputtext" type="text">
Y el evento, lógicamente, funciona...

Y acabo de confirmar lo que me temía... funciona lo mismo con el resto de casillas de formularios... acabo de probar con el formulario para añadir enlaces y funciona... ¡ay diosito ayúdame!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 04-12-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Vale. Pues la segunda cuestión (la que plantea la segunda URL) se me está atragantando. Y es que si en el primer caso podíamos actuar en un mismo punto, en una función en concreto, en este segundo caso no parece que sea así.

He conseguido escapar la cadena de búsqueda (en que se incluye el JavaScript) con la función "htmlentities", de manera que aparentemente se soluciona el tema. Empero, he dicho antes que todas las casillas de los formularios de la aplicación están comprometidas...

Y sólo hay una función que "controle" cada una de estas casillas. El método "Escapar" que hemos visto antes. Sin embargo, aunque pareciera que esto iba a servir de ayuda, en realidad no lo parece. Véase el método "Escapar" tal y como está ahora:

Código PHP:
    function Escapar($cadena) {
        return 
mysql_real_escape_string(stripslashes
         
(strip_tags($cadena)), $this->enlaceConexionBd);
    } 
Pues bien, si lo dejáramos tal que así:

Código PHP:
    function Escapar($cadena) {
        return 
mysql_real_escape_string(stripslashes
         
(strip_tags(htmlentities($cadena))), $this->enlaceConexionBd);
    } 
Funcionaría por un lado, es decir, ya no tendría efecto el JavaScript de las casillas, de las variables que nos llegasen vía "HTTP GET", quiero decir, pero,... ay diosito si es que todo lo hago mal...

Resulta que el mismo método "Escapar" que usamos para las variables que nos llegan de entrada, también lo usamos cuando mostramos la información de dichas variables en las correspondientes casillas.

Me explico. Cuando vamos a mostrar la búsqueda realizada por el usuario escribimos en la casilla de búsqueda la búsqueda actual... o sea, trabalenguajes aparte, hacemos algo como esto:

Código PHP:
$casillaBusqueda $bdatos->Escapar(BUSQUEDA); 
Pero, al hacer esto, pareciera que la función "htmlentities" codificara la cadena que se muestra en la propia casilla, de manera que esta no se muestra bien... creo que una imagen vale más que mil palabras en este caso.

Conseguimos que el JavaScript no tenga efecto, pero, los datos de las casillas se muestran malamente:



Total,... yo llevo creyendo hace tiempo que igual que usamos un método "Escapar" deberíamos utilizar un método "Desescapar"... o que en todo caso no estamos haciendo un buen uso del método "Escapar"... lo usamos un poco sin ton ni son, me parece a mí...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #9  
Antiguo 04-12-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Disculpad mi pesadez, pero, es que me parece curioso, la verdad. Respecto del problema con la segunda de las URLs resulta que no ocurría sólo en las casillas de los formularios... no. Cuando se realiza una búsqueda en la página Web de que hablamos se indica al usuario que los enlaces están filtrados por dicha búsqueda.

Una de las formas en que se indica es haciendo uso de diversos iconos, que tienen un "título", es decir, cuando el usuario pasa el ratón por encima le aparece el típico "hint" que le muestra algo como: "Buscando enlaces por: Delphi". Donde "Delphi" es la cadena que se está buscando.

Pues bien, lo mismo que para las etiquetas, servía para los de los títulos, así que en la medida de lo posible lo estoy corrigiendo, aunque tengo que revisar algunas cosas. Empero,... lo de las casillas... en fin. Seguiremos informando.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pivot table Editable (cross-tab) villegasmajano MS SQL Server 1 25-10-2006 23:28:57
como manejan uds en Firebird 1.5 el PIVOT de oracle?? (CROSS TABS) pvizcay Firebird e Interbase 4 19-09-2006 19:17:32
Ajuste de decimales en un Cross-Tab nugame Impresión 4 16-06-2004 13:40:44


La franja horaria es GMT +2. Ahora son las 04:58:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi