viernes, 1 de julio de 2011

Evitar XSS/Html Injection en formularios [PHP] Básico

Publicado por OverNet en viernes, julio 01, 2011 ,
Un pequeño tutorial sobre como evitar XSS y/o Html Injection en formularios PHP (Básico)

¿Que es XSS? (Wikipedia)

XSS, del inglés Cross-site scripting es un tipo de inseguridad informática o agujero de seguridad basado en la explotación de vulnerabilidades del sistema de validación de HTML incrustado.


¿Qué es HTML Injection? (Otras fuentes)

Inyección de HTML se refiere a la inserción de código HTML en una respuesta de servidores web de alterar el contenido al usuario final. Esto es también conocido como Cross Site Scripting.

No explicaré sobre la explotación de este bug, ya que solo vamos explicar sobre como evitarla y no ser victima de alguna persona malintencionada.
Un ejemplo sencillo:
Código Java Script inyectado en un input (Alert en JS)
Codigo Java Script en la barra de direcciones


En la imagen de arriba se observa, que en un formulario (Input) se logró inyectar un codigo Java Script y al ser ejecutada nos muestra una ventana diciendo "Owned by Benito Bodoke!" (una alerta).


Tenemos esté código vulnerable al XSS/Html Injection en este caso se uso el metodo "GET" pero con el metodo "POST" sería lo mismo la unica diferencia es que no se ejecutará en la barra de direcciones:
<!-- Formulario HTML -->
<form name="form1" method="get" action="">
  <p>
    <label for="pagina"></label>
    <input type="text" name="pagina" id="pagina">
  </p>
  <p>
    <input type="submit">
  </p>
</form>
<?
### RootNetworking; Código vulnerable a XSS/Html Injection
$overnet = $_GET['pagina'];
echo $overnet;
?>
El codigo de arriba es el mismo que esta en la imagen.
Para poder fixear (Arreglar) este agujero vamos a implementar la función php strip_tags() en este caso se lo implementaremos después de la función echo y antes de la variable.  
Ej:  echo strip_tags($str); 

Les muestro código ya fixeado (Arreglado) para que no se ejecuten códigos tipo "HTML, Java Script o php y cualquier otro lenguaje de programación web solo mostrará texto plano."

- NOTA: También eliminara los tags html para que no se muestren, si queremos mostrarlos solo usamos el htmlentities() en ves de strip_tags()
<!-- Formulario HTML -->
<form name="form1" method="get" action="">
  <p>
    <label for="pagina"></label>
    <input type="text" name="pagina" id="pagina">
  </p>
  <p>
    <input type="submit">
  </p>
</form>
<?
### RootNetworking; Código NO vulnerable a XSS/Html Injection
$overnet = $_GET['pagina'];
echo strip_tags($overnet);
?>


Ejemplo de como quedá con la función
strip_tags():

Función PHP de seguridad implementada strip_tags();

Ahora como quedaría con la función htmlentities():


Función PHP implementada htmlentities();


Pero esta seguridad es nula, cualquier atacante puede ejecutar este alert Bypasseando el filtro HTMLENTITIES Y STRIP_TAGS:
';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
Para evitar este tipo de ataques, es necesario combinar las funciones necesarias de seguridad para evitar que se ejecute el codigo ofuscado en ASCII:

<!-- Formulario HTML -->
<form name="form1" method="get" action="">
  <p>
    <label for="pagina"></label>
    <input type="text" name="pagina" id="pagina">
  </p>
  <p>
    <input type="submit">
  </p>
</form>
<?
### RootNetworking; Código NO vulnerable a XSS/Html Injection/Seguridad ALTA
$overnet = htmlspecialchars(addslashes(stripslashes(strip_tags(trim($_GET['pagina'])))));
echo $overnet;
?>

Para más información les recomiendo leer más acerca de estas funciones, les dejo unos links de referencia para más información sobre como evitar estos bugs e implementar más seguridad.
Links | Unijimpe (Evitar XSS)
Función | PHP Manual sitio oficial (strip_tags()) | htmlentities()

Back Top

5 comentarios:

  1. strip_tags($overnet)quita las etiquetas html pero para parsear esta función sólo es necesario duplicar las etiquetas, para que te ejecute el código. Por ejemplo, si pones:

    $overnet = '1>Hola1>';
    echo strip_tags($overnet);

    Para solucionar esto, usa htmlspecialchars($overnet,ENT_QUOTES)

  2. Me ha ayudado en una práctica de mi portfolio, gracias. Voy a darme una vuelta por la web a ver que más cosas tenéis. Un saludo!

  3. Este comentario ha sido eliminado por un administrador del blog.

Publicar un comentario

Blaaa blaa y + blaa.. escribe las dudas que tengas :D

- No incluyas Correos electrónicos por seguridad propia.
- No SPAM/Flood.
- Se borrará cualquier comentario ofensivo, racista o vulgar.