¿El acceso de solo lectura a la base de datos impide la inyección de sql?

48

Tengo una API web que se conecta a mi servidor SQL mediante una conexión de solo lectura y quiero permitir que los usuarios expertos en tecnología de mi API ingresen una cláusula SQL en la cadena de consulta. Básicamente solo quiero agregar lo que ingresan en la declaración de selección.

¿La conexión de solo lectura a la base de datos con un privilegio mínimo (capacidad de selección solo en una tabla) previene todos los ataques de inyección?

    
pregunta Aaron 26.04.2015 - 17:04
fuente

4 respuestas

102

No. Podría estar confundiendo la inyección de SQL con la inyección de datos; las tablas de solo lectura no impiden la inyección de SQL y, en el mejor de los casos, solo un poco para limitar su impacto.

La inyección SQL simplemente significa la capacidad de inyectar código SQL. Si bien las tablas de solo lectura pueden limitar la capacidad de insertar datos en la tabla, no afectan la capacidad de:

  • Lea de otras bases de datos o tablas si no está deshabilitado
  • Lee de las tablas del sistema o ejecuta otras consultas del sistema que son difíciles de rechazar
  • Escriba consultas excesivamente complejas que realizarán una DoS
  • Exfiltrate los datos mediante DNS
  • Acceda a los archivos locales (por ejemplo, utl_file en Oracle)
  • Acceda a la red del servidor DB (por ejemplo, utl_http en Oracle)
  • Ejecute código arbitrario en el servidor a través de función de DB desbordamientos de búfer
  • Consulte Inyección avanzada de SQL en bases de datos Oracle para un buen paseo a través de todo el tipo de cosas que necesita preocuparse (y darse cuenta de que otras bases de datos tienen sus equivalentes)

Si usted

  

básicamente, solo queremos agregar lo que ingresan a la declaración select .

entonces estás permitiendo expresamente que el atacante intente cualquiera de estos.

Ahora, ciertamente puedes hacer cosas para limitar esto. Puede no permitir comillas y caracteres de separador de sentencias SQL. Puede rechazar cualquier entrada que no sea [A-Za-z0-9"=] (o equivalente equivalente para su base de datos). Pero si comienza a seguir este camino, es mejor que escriba su aplicación correctamente : exponga una interfaz de consulta más rica en la que ofrezca las claves que deben verificarse y luego realice la cotización adecuada en cualquier valor que el usuario entra.

    
respondido por el gowenfawr 26.04.2015 - 18:04
fuente
13

No, ejemplo trivial

EXEC ('SELECT COUNT(*) 
       FROM table 
       WHERE UserName =''''' + @UserName + ''''' AND Password = '''''+@Password+'''''')

Establezca @Password en a' OR 1=1;--

Y tu contraseña se pasa por alto

    
respondido por el Akash 26.04.2015 - 17:56
fuente
12
  

¿La conexión de solo lectura a la base de datos con un privilegio mínimo (capacidad de selección solo en una tabla) previene todos los ataques de inyección?

La inyección SQL es una forma en que un atacante puede modificar una declaración existente para que cause acciones no deseadas. Estas acciones pueden ser cambios en la base de datos o la ejecución del código en el sistema, pero también simplemente devolver datos que no deberían o realizar una denegación de servicio mediante la ejecución de operaciones que requieren recursos.

La restricción de las consultas a solo las selecciones en una tabla específica puede limitar el impacto, pero es probable que aún pueda causar una denegación de servicio. Y dependiendo de dónde se utilizarán los resultados de la consulta, puede cambiar el comportamiento de la aplicación devolviendo resultados inesperados.

    
respondido por el Steffen Ullrich 26.04.2015 - 17:19
fuente
0

En absoluto. Las fallas de la inyección SQL no están en el servidor SQL sino en el nivel de la aplicación web, por lo que si la aplicación web es sensible a la inyección SQL, seguirá siendo razonable sin importar el nivel de acceso a la base de datos.

Sin embargo, el principio de privilegio mínimo que menciona hace que, incluso si alguien logra explotar una inyección de SQL en la aplicación web, solo obtendría acceso de lectura en el contenido de la base de datos, no podrá modificar la base de datos. contenido o estructura.

    
respondido por el WhiteWinterWolf 26.04.2015 - 17:17
fuente

Lea otras preguntas en las etiquetas