OASAM-DV-003: SQL Injection

Descripción
Una vulnerabilidad de inyección SQL, puede ocurrir cuando se utiliza información que proviene de contenedores inseguros para construir consultas SQL de forma dinámica, sin realizar los controles y/o filtrados correspondiente sobre dicha información. Por "contenedores inseguros" debe entenderse cualquier fuente de datos externa al código fuente, como puede ser datos provistos por el usuario, bases de datos no controladas, web services, etc. Android utiliza SQLite para almacenar información. A continuación se muestra un ejemplo de código vulnerable:
String con = "DELETE FROM case_values WHERE _id = " + paramString;
localSQLiteDatabase.execSQL(con);


Riesgos
Una vulnerabilidad de inyección de SQL podría permitir a un atacante utilizar caracteres que poseen un significado especial en el lenguaje SQL para alterar la ejecución de una sentencia dada que se construye dinámicamente con información externa. Como resultado, podría ser posible la obtención de información arbitraria de la base de datos, la alteración de esta información y la alteración del flujo de trabajo de la aplicación afectada.


Recomendaciones
Se recomienda validar todos los campos por medio de listas blancas. De esta forma, sólo se aceptarán caracteres no peligrosos. Es importante normalizar la entrada para evitar las evasiones por medio de codificaciones en los parámetros. De ser posible, se recomienda el uso de "prepared statements", ya que resulta la opción más segura hasta la fecha, para construir sentencias SQL con parámetros externos.


Referencias
1. Dynamic SQL de “Smartphone apps are not that smart: Insecure Development Practices by Vulnex
2. OWASP Top Ten Mobile Risk número 4: Client Side Injection.