jueves, 8 de enero de 2015

Fallos de seguridad XSS en PHP



Los fallos de seguridad XSS o Cross Site Scripting consisten en la ejecución del código HTML, JavaScript o VBScript sin conocimiento del webmaster.

Hay dos tipos de XSS.

1. XSS no permanente

Este tipo de fallos de seguridad se puede encontrar cuando recurre a una página PHP con información que se pasa en la URL.

Por ejemplo, cuando recurre a la página get_recibe.php con el parámetro nombre=Juan:

http://127.0.0.1:8888/get_recibe.php?nombre=Juan

En la página get_recibe.php, aparece el siguiente código:

<?php
echo $_GET[’nombre’];
?>

Da como resultado:

Juan

A continuación el usuario cambia Juan por:

<script>alert(’Hola’)</script>

La página get_recibe abre un pop-up que muestra "Hola". El navegador ejecuta JavaScript que se ha generado con la instrucción echo $_GET[’nombre’];

En este caso, el código intruso es una alerta, pero el usuario puede introducir un código para leer las cookies, redirigir a otra URL, etc.

Para impedir esto, los navegadores suelen activar la seguridad XSS por defecto, que procede de un script que se encuentra en la URL y que por tanto no se ejecuta.

Sin embargo, no puede saber con antelación la configuración del navegador del usuario, por lo que se recomienda añadir código PHP para impedir estos scripts.

Utilice la función htmlentities() cuando recupere la información con $_GET o $_POST. Esta función traduce los caracteres especiales y hace inoperativos los scripts maliciosos. Por defecto convierte las dobles comillas e ignora las simples. Para utilizar las comillas simples, añada la constante ENT_QUOTES.

El ejemplo anterior se convierte en:

<?php
echo htmlentities($_GET[’nombre’], ENT_QUOTES);
?>

Y da como resultado:

<script>alert(’Hola’)</script>

Si muestra el código de origen de la página, aparecerá lo siguiente:

&lt;script&gt;alert(Hola)&lt;/script&gt;

Y el navegador muestra el script sin ejecutarlo.


2. XSS permanente

Supongamos que el script malicioso se ha insertado en la base de datos con un mensaje en el foro, el blog o en un e-mail. Este mensaje se ejecuta cada vez que una persona lee el mensaje en Internet.

La solución es la misma: si recupera el mensaje con $_POST[’mensaje’], añada la función htmlentities().

Por ejemplo, si una página recupera el nombre, el apellido y el mensaje con POST, dará el siguiente resultado:

<?php
echo htmlentities($_POST[’nombre’], ENT_QUOTES);
echo htmlentities($_POST[’apellido’, ENT_QUOTES]);
echo htmlentities($_POST[’mensaje’], ENT_QUOTES);
?>

Los caracteres especiales se insertan en la base de datos y el script no se ejecuta cuando se muestra el mensaje que lo contiene.


3. Error de página

Si recurre a su página PHP utilizando como parámetro el nombre de una página contenida en un include, aparecerá lo siguiente: 

http://127.0.0.1:8888/get_recibe.php?pagina=pagina1

El código pagina get_recibe.php es:

<?php
include("files/".htmlentities($_GET[’pagina’]).".php");
?>

Tiene como efecto incluir pagina1.php

Si el usuario agrega en la URL un script malicioso, como: 

http://127.0.0.1:8888/get_recibe.php?pagina=<script> alert(’Hola’)</script>

Aparecerá en su página un mensaje de error, con un e-mail que contiene la URL que provoca dicho error, siempre y cuando se haya activado el informe de error.

Cuando lea su e-mail, se ejecutará el script, ya que tendrá su código JavaScript en el e-mail.

Para evitar esto, añada el código error_reporting(0) en la página de inicio. El resultado será no mostrar el error y no enviará el e-mail de la URL que contiene el script malicioso.



Espero haber ayudado en algo. Hasta la próxima oportunidad!









No hay comentarios:

Publicar un comentario en la entrada