Clase 01: Introducción

Taller de Seguridad Web

Claudio Salazar (csalazar spect cl)



Sky - Beige - Simple - Serif - Night - Default

Agenda

  • Descripción del taller
  • Programación del taller
  • Premisas en seguridad
  • Recursos

Descripción del taller

Descripción

Este taller pretende brindar a los alumnos las herramientas y habilidades necesarias para llevar a cabo auditorías de seguridad en aplicaciones web y al mismo tiempo enseñar buenas prácticas de programación con tal de prevenir la inclusión de vulnerabilidades en el desarrollo de una aplicación.

Objetivos

  1. Conocer los distintos tipos de ataques sobre aplicaciones web existentes hoy en día.
  2. Entender en que consiste una vulnerabilidad, sus vectores de ataque y los enfoques para mitigar la vulnerabilidad.
  3. Crear habilidades en el alumno para encontrar vulnerabilidades eficientemente.
  4. Aprender buenas prácticas de programación para desarrollar aplicaciones de forma segura.

Formato

  • 9 clases teóricas + 2 prácticas.
  • Clases de cerca de 70 minutos.
  • Tiempo restante para consultas.
  • Diapositivas con links para profundizar en los temas.
  • Una evaluación final.
  • Ponderación: Actividad práctica (30%) + evaluación final (70%)

Simbología

  • Código vulnerable
  • Código parchado
  • Buena práctica
  • Ejemplo en HTML
  • Ejemplo en Javascript
  • Ejemplo en ASP
  • Ejemplo en PHP
  • Ejemplo en Python
  • Ejemplo en Ruby
  • Ejemplo en SQL

Ejemplo de caso real


function loadQuantity(){
  $.ajax({
    type: "POST",
    url: "/api/Quantity.jsp",
      success: function(data) {
        var quantity = parseInt(data, 10);
        if (quantity > 0) {
          $("#divQuantity").html(data + "products");
        } else {
          $("#divQuantity").html("Empty");
        }
      }
  });
}
    

Buena práctica

jQuery.html(htmlString): Set the HTML contents of each element in the set of matched elements.

Si data contiene código HTML o Javascript, este será interpretado por el navegador.


En este caso y en general, donde sólo se busca mostrar texto, es recomendado usar jQuery.text()

Escenario de vulnerabilidad

En el caso que los datos pasados a la petición AJAX retornen código HTML válido, se puede generar un escenario para explotar una vulnerabilidad en el lado del cliente.

Falla en la lógica de la aplicación

parseInt(string, base): Parses a string argument and returns an integer of the specified radix or base.

> parseInt("8", 10);
 8
> parseInt("8a", 10);
 8
> parseInt("8<b>test</b>", 10);
 8
    
  • Mismo comportamiento en funciones equivalentes en C (atoi) y PHP (intval).
  • Python & Ruby lanzan excepciones cuando el string contiene carácteres.

Falla en la lógica de la aplicación


function loadQuantity(){
  $.ajax({
    type: "POST",
    url: "/api/Quantity.jsp",
      success: function("8<b>test</b>") {
        var quantity = parseInt("8<b>test</b>", 10);
        if (quantity > 0) {
          $("#divQuantity").html("8<b>test</b>" + "products");
        } else {
          $("#divQuantity").html("Empty");
        }
      }
  });
}
    

Código corregido del caso


function loadQuantity(){
  $.ajax({
    type: "POST",
    url: "/api/Quantity.jsp",
      success: function(data) {
        var quantity = parseInt(data, 10);
        if (quantity > 0) {
          $("#divQuantity").text(quantity + "products");
        } else {
          $("#divQuantity").text("Empty");
        }
      }
  });
}
    

Estado del arte

  • La mayoría de las aplicaciones han migrado desde el escritorio a la web.
  • Cada día nuevos vectores de ataques son descubiertos.
  • Un gran porcentaje de los desarrolladores no están conscientes de los problemas de seguridad al usar ciertas funciones en forma errada.

Seguridad en Chile

  • La evolución de la escena desde finales de los 90 hasta ahora.
  • La realidad de la industria de seguridad informática.
  • La realidad chilena en comparación con el resto de Sudamérica.

Programación del taller

Lado del cliente

  • Clase 02: Introducción al protocolo HTTP y al navegador.
  • Clase 03: Vulnerabilidades comunes.
  • Clase 04: HTML5 y últimas tendencias en ataques.

Lado del servidor

  • Clase 05: Vulnerabilidades comunes.
  • Clase 06: Inyección de comandos en bases de datos.
  • Clase 07: Inyección de comandos en otros componentes.

Buenas prácticas

  • Clase 08: Aprendiendo de los errores.
  • Clase 09: Herramientas de utilidad.

Training

  • Clase 10 y 11: Experiencia práctica con una aplicación vulnerable.
  • Clase 12: Evaluación final.

Premisas en seguridad

Nada es 100% seguro

Se pueden seguir todas las buenas prácticas en el desarrollo de una aplicación pero hay factores que escapan del alcance (vulnerabilidades en frameworks, binarios usados por la aplicación, etc.)

No todo es XSS, SQLi ...

Aprovechamiento de comportamientos no documentados y fallas en la lógica de la aplicación suelen ser ataques más ingeniosos que las herramientas automatizadas no pueden encontrar.

Explotabilidad de una vulnerabilidad

En la comunidad han habido diversas discusiones sobre la necesidad de explotar una vulnerabilidad satisfactoriamente. Una vulnerabilidad, hoy de explotación compleja, puede ser explotada mañana gracias a cambios en el entorno. No hay motivos para no parchar.

Notificación de vulnerabilidades

La forma recomendada de notificar vulnerabilidades es mediante notificación responsable. Es importante tener en cuenta que la difusión irresponsable de una vulnerabilidad no sólo afecta al vendedor, sino también a los usuarios del software.

Responsabilidades en el desarrollo de aplicaciones

Desarrolladores son, en la mayoría de los casos, los responsables de las vulnerabilidades.

Generalmente, las empresas responsabilizan a los atacantes, siendo que ellos sólo explotan una vulnerabilidad introducida anteriormente. Este último comportamiento viene dado por la búsqueda fácil de un culpable y falta de cultura en seguridad. Como ingenieros formados en seguridad debemos cambiar esta situación.

Recursos

Libro de referencia

Entrenamiento

Recursos visuales

This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.