Inyección de código basada en SQL

LIBP-0276 (Libro de pautas)

Seguir las siguientes indicaciones para evitar los ataques por inyección de código SQL

Debido a la proliferación de sitios webs que trabajan contra una base de datos, la inyección de SQL ha comenzado a ser un problema grave. Este fallo es fácilmente detectable y cualquier sitio o software que trabaje con bases de datos puede ser objetivo de un atacante.

El problema reside en que SQL no controla que los datos de entrada no contengan instrucciones de control: AND, OR, SELECT, exec, etc. Esto, sin el suficiente control sobre la sintaxis de los datos de entrada proporcionados por los usuarios, puede provocar que cualquier entrada sea interpretada como código SQL en lugar de datos y alterar el resultado de las consultas.

Un ejemplo de inyección sería el siguiente: MS SQL construye una función que permita la ejecución de un comando shell. Una inyección de SQL en este contexto sería desastrosa. En una consulta de la siguiente manera

SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='$user_input' ORDER BY PRICE

Un usuario podría introducir la siguiente cadena para el parámetro "user_input":

' exec master..xp_cmdshell 'vol' --

Estaríamos permitiendo la modificación de la consulta SQL, que se realizaría ejecutando un comando shell: master..xp_cmdshell 'vol'

SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='' exec master..xp_cmdshell 'vol' --' ORDER BY PRICE

Para evitar los problemas de inyección de SQL, se considerarán en los desarrollos las siguientes indicaciones.

Pautas

TítuloCarácter
Mecanismos automáticosRecomendada
Procesamiento de consultas SQLObligatoria
Consultas dinámicasRecomendada
Uso de meta-caracteresNo Recomendada

Mecanismos automáticos

Utilizar los mecanismos que estructuran de forma automática la separación entre datos y código

Si está disponible, utilice los mecanismos que estructuran de forma automática la separación entre datos y código. Estos mecanismos son capaces de proporcionar la seguridad necesaria mediante la codificación y la validación automática de los datos de entrada, desconfiando siempre de los datos proporcionados por el usuario y mejorando las soluciones de implementación propia.

Procesamiento de consultas SQL

Procesar las consultas SQL utilizando comandos preparados, consultas parametrizadas o procedimientos almacenados

Procese consultas SQL utilizando comandos preparados, consultas parametrizadas o procedimientos almacenados. Estas características deben aceptar parámetros o variables y el apoyo inflexible de tipos.

No construir dinámicamente y ejecutar las cadenas de consulta dentro de estas características haciendo uso de "exec" o funciones similares, ya que puede volver a introducir la posibilidad de inyección SQL

Consultas dinámicas

Utilizar de forma correcta la codificación y los escapes de las entradas

Si tiene que utilizar consultas generadas dinámicamente a pesar del riesgo, utilice de forma correcta la codificación y los escapes de las entradas.

En lugar de construir su propia implementación, estas características pueden estar disponibles en la base de datos o en el lenguaje de programación.

Por ejemplo, el paquete de Oracle DBMS_ASSERT puede consultar o hacer cumplir los parámetros que tienen ciertas propiedades que las hacen menos vulnerables a la inyección de SQL.

Uso de meta-caracteres

No permitir el uso de meta-caracteres.

No permita el uso de meta-caracteres (como ' = * ? // o similares) ya que, aunque estos se filtren, el uso posterior de los datos puede volver a introducir la posibilidad de inyección SQL.

Contenidos relacionados

Recursos
Área: Desarrollo » Seguridad » Codificación y Validación de entrada/salida
Código Título Tipo Carácter
RECU-0578 Inyección en Hibernate con SQL Ejemplo Obligatorio