Buenas Prácticas de Desarrollo Seguro: A1 Injection

Como mencionamos anteriormente, publicaremos semanalmente información relacionada con el TOP 10 OWASP, con el fin de promover y difundir los conceptos de desarrollo seguro. En esta primera publicación, se revisará el primer punto de listado: A1 Inyección.

Por lo general se relaciona Inyección o Injection con vulnerabilidades asociadas a SQL Injection, sin embargo, este ítem hace referencia a distintos tipos de inyección, como por ejmeplo consultas LDAP, comandos de sistema operativo, entidades XML, etc.

Antes que todo, se debe entender que cualquier fuente de información o parámetros de entrada puede ser manipulada, por lo tanto se debe entender que los parámetros de entrada pueden ser mediante las cabeceras, URL o el cuerpo de una petición HTTP, correspondiente a los Headers, GET y POST respectivamente.
Es importante que todos los parámetros de entrada sean correctamente validados y filtrados de acuerdo a distintos criterios. El tratamiento de estos datos puede ser:

  • Filtrar: En base a patrones o expresiones regulares, determinar qué tipo de datos acepta el sistema y cuales no.
  • Escapar: Aceptar todo tipo de datos, pero escapándolos correctamente.
  • Sanear: Aceptar todo tipo de datos, pero eliminando el contenido inapropiado.
  • Transformar: Aceptar todo tipo de datos, pero transformándolos a un tipo de datos aceptado.

Debemos entender la diferencia que existe entre estos distintos métodos, ya que se debe adaptar al funcionamiento de la aplicación. Por ejemplo, si tenemos un editor de texto enriquecido, mediante el cual se permite al usuario manipular código HTML, en este caso no deberíamos optar por la opción de escapar los caracteres, ya que al momento de mostrar la información el navegador no lo interpretará y lo mostrará como texto.

Para entender como funcionan cada uno de estos metodos, creamos la siguiente tabla:

En el input de ejemplo se puede ver un script javascript, el cual gatilla una alerta en el navegador. Dependiendo el tipo de método que apliquemos sobre los parámetros de entrada, podemos ver el output que deberíamos obtener.

Estos filtros se pueden aplicar a nivel de motor HTTP como por ejemplo nginx, Apache, Microsoft IIS, Tomcat, etc. En el siguiente ejmeplo, podemos ver como se envia un Payload SQL Injection y se filtra desde el motor HTTP.

El filtro detectó que existen caracteres especiales los cuales no están permitidos, por lo tanto no permite la operación y retorna un 403 Forbidden.

Desde el punto de vista de aplicación, para poder filtrar los parametros de entrada existen diversas funciones o métodos, dependiendo del lenguaje o bien del framework que estemos utilizando.

Es importante que los datos sean tratados antes de almacenarse en la base de datos y como recomendación adicional, también al momento de ser desplegados. Los ataques más comunes son cuando no se implementa un correcto tratamiento de los datos se realizan mediante variables GET, datos POST o cabeceras como Cookie y User-Agent.