¿Cuáles serían los posibles abusos para una API HTTP que acepta SQL sin formato?

9

Me preguntaba cuáles serían algunos de los posibles abusos para una API HTTP que aceptaba consultas de SQL y resultados de conjuntos de resultados. El hecho de que esta sea la definición canónica de inyección SQL no se pierde en mí :)

En mi caso, tengo en mente una aplicación específica de PHP / MySQL que es Magento, una plataforma de comercio electrónico.

Aquí hay algunas medidas de seguridad que he considerado:

  • Ruta de URL no estándar: para evitar el análisis masivo, cada instalación tendrá su propia ruta de URL (esto es similar a cómo se maneja el backend de administración de Magento)
  • Una clave API de longitud decente
  • acceso solo HTTPS
  • Acceso de solo lectura a través de un usuario de MySQL de solo lectura.
  • Acceso de solo lectura a través de análisis de SQL. Se requeriría un poco menos de configuración si el acceso de solo lectura pudiera implementarse de esta manera. Estaba considerando simplemente analizar las consultas de "INSERT", "UPDATE", "DROP", etc.
  • Tablas y campos en lista negra. En su mayor parte, los datos de configuración se almacenan en una tabla llamada core_config_data , por lo que podrían incluirse en la lista negra. También cosas como los tokens de tarjetas de crédito se pueden almacenar en un campo específico de una tabla específica. En implementaciones muy deficientes, las tarjetas de crédito también se pueden almacenar de forma clara, lo que, por supuesto, debería incluirse en la lista negra.
  • Acceso a la tabla y al campo de la lista blanca: tal vez, solo permitir el acceso a las tablas y campos de la lista blanca sería un mejor enfoque que una lista negra.
  • Hay muchas extensiones de comunidad que también podrían almacenar información confidencial. Sería difícil bloquearlos de forma genérica de forma predeterminada, por lo que creo que una lista blanca podría ser la única opción para resolver esto.
  • Algún mecanismo para un número / frecuencia máxima de reintentos
  • Otras cosas estándar que se utilizan para asegurar las conexiones SSH, por ejemplo, como una lista blanca de IP, autenticación de clave pública, VPN, etc.

Suponiendo que estas medidas estuvieran vigentes, ¿sería esto tan seguro o más seguro que, digamos, el acceso SSH bloqueado por una lista blanca de IP?

ACTUALIZACIÓN: algunos detalles más específicos de la aplicación, para dar seguimiento a algunas de las preguntas en las respuestas.

  • Lo que estoy buscando construir es un módulo Magento que se implementará en la tienda y aceptará consultas SQL para devolver los datos a mi aplicación SaaS. Soy dueño del módulo y de la aplicación SaaS.
  • La aplicación en cuestión sería una aplicación SaaS que aprovechó Magento para extraer datos. Por lo tanto, no es una situación a la que solo tengan acceso los empleados de confianza.
  • El nivel mínimo de seguridad ideal (desde la perspectiva de la cantidad de configuración) sería no usar un usuario de solo lectura.
  • Supongamos que los falsos positivos que se bloquearían no son un problema (Lo sentimos, "Tablas de inserción de Bobby").

ACTUALIZACIÓN 2: Solo quería ampliar un poco más la razón por la que elegí encuadrar esta pregunta en términos de compararla con una conexión SSH con una lista blanca de direcciones IP.

Una conexión SSH para todos los propósitos y propósitos ya es funcionalmente lo mismo que una API de SQL sin formato (y mucho más) en el sentido de que puede SSH y conectarse a MySQl y luego hacer lo que sea. Por lo tanto, creo que si una API SQL es tan segura o más segura que una conexión SSH, puede presentar un nivel de riesgo aceptable.

También, sé que este tipo de pregunta puede ser demasiado subjetiva, por lo que quería encuadrarla de una manera que pudiera tener una respuesta relativamente objetiva, por lo que quise compararla con un escenario SSH específico.

    
pregunta kalenjordan 15.05.2014 - 21:29
fuente

3 respuestas

9

El potencial de abuso obviamente depende de la aplicación. ¿Esto solo se enfrenta a empleados de confianza en una intranet / VPN con acceso privilegiado? ¿De lo contrario, estos empleados tendrían acceso de solo lectura a la base de datos, porque hay una gran cantidad de consultas diversas que necesitarán para ejecutar los datos? En ese caso, puedo imaginar que el usuario de confianza genere consultas arbitrarias sin procesar.

¿O es que esta aplicación se enfrenta a un atacante aleatorio que puede ver su tienda en línea y está intentando causar estragos? En ese caso, te recomiendo que no hagas esto. Tómese el tiempo y siga los flujos de trabajo y cree las consultas parametrizadas que tienen permiso para ejecutarse: el usuario de la API HTTP solo tiene permiso para modificar los parámetros de estas consultas.

Analizar el comando SQL para los términos incorrectos como UPDATE / DROP es una muy mala idea. Las personas pueden obtener realmente ingeniosas evitando estas prevenciones (por ejemplo, usted omite los filtros que eliminan las etiquetas <script> usando <scr<script>ipt> , que luego se convierte en <script> ). Del mismo modo, puede haber razones válidas para que algún campo tenga el valor "Actualizar" en él. Hay posibilidades de codificar problemas / problemas de normalización de Unicode para omitir su filtro. Por ejemplo, un atacante envía DRO%C0%50 en la cadena codificada de la URL que pasa el filtro que marca "DROP", pero luego, cuando los bytes DRO\xc0P se envían a la base de datos, su procesamiento es idéntico a ser DROP , lo que permite que un atacante se caiga la base de datos. (Para más información, vea este truco utilizado en ataques transversales de directorios ).

Tener una cuenta de solo lectura es una mejor solución, pero es posible que no desee que un atacante pueda acceder a algunos campos privados (por ejemplo, números de CC, hashes de contraseñas, etc.). Además, no es difícil simplemente crear comandos SQL maliciosos que requieren mucha CPU y pueden ser utilizado para realizar ataques de denegación de servicio en su base de datos .

Dejar un código de escritura de usuario final no confiable (y un comando SQL es código) siempre es un antipatrón y debe evitarse. Sí, esto requerirá más trabajo inicialmente con las consultas parametrizadas permitidas, pero vale la pena.

EDITAR:

Si las consultas que genera su aplicación siempre son de plena confianza, se trata de un problema diferente. Es decir, su aplicación está generando pares de consultas parametrizadas como "SELECT name FROM users WHERE id = ?" enviadas a la base de datos junto con una matriz de entradas de usuario no confiables - ["1"] o en caso de un ataque de inyección SQL fallido ["1 OR 1 = 1; DROP TABLE user; --"] ). O potencialmente más problemático, pero posiblemente seguro, use algunas de las funciones de desinfección por inyección SQL bien conocidas existentes para desinfectar su entrada para enviar algo. Personalmente, no arriesgaría la segunda ruta, pero las funciones de desinfección maduras pueden hacer esto.

Luego, todo lo que necesita hacer es usar cifrado autenticado (por ejemplo, los mensajes están cifrados y con MAC) entre su aplicación y la API HTTPS. Una lista blanca de direcciones IP sería una forma razonable de lograr esto (además de decir enviar una contraseña) en todo TLS (y verificar la identidad del otro servidor que aloja la API para evitar los ataques de Man in the Middle).

    
respondido por el dr jimbob 15.05.2014 - 22:00
fuente
4

La mayoría de las bases de datos (y esto incluye MySQL) están diseñadas para admitir este modo de operación de manera segura. Esto solía ser ampliamente utilizado con aplicaciones de "cliente gordo" que acceden a la base de datos directamente. La idea es darles a los usuarios relevantes los permisos de base de datos que necesitan, y la base de datos controla el acceso. Algunas bases de datos (especialmente Oracle) admiten permisos extremadamente granulares, control a nivel de filas y columnas, así como "bases de datos privadas virtuales".

En estos días, los clientes pesados tienden a acceder a un servicio web en lugar de a una base de datos directamente, pero se usa un modelo similar para el personal analítico que necesita ejecutar consultas personalizadas, pero solo tiene permisos limitados en la base de datos.

Desafortunadamente, la seguridad de este enfoque ha sido ampliamente desacreditada. La mayoría de las bases de datos han tenido numerosas vulnerabilidades donde un usuario de base de datos con privilegios bajos puede escalar sus privilegios. Oracle, en particular, ha tenido docenas de tales vulnerabilidades. En contraste, la mayoría de las bases de datos han tenido pocas vulnerabilidades que permiten que un usuario remoto no autenticado tome el control de la base de datos.

Algunas compañías de seguridad (incluidas mi empleador ) ofrecen herramientas y servicios para mejorar la seguridad de la base de datos. Sin embargo, la tendencia arquitectónica es hacer que las bases de datos sean más privadas y solo accesibles para los servidores de aplicaciones, lo que reduce la importancia de este tipo de seguridad.

Si está realmente interesado en hacer lo que propone, la seguridad de su base de datos se vuelve mucho más importante. Tu sugerencia de analizar y filtrar consultas de SQL tiene algún mérito, aunque ten en cuenta que SQL es extremadamente complejo de analizar. Hay dispositivos (por ejemplo, firewall de base de datos de Oracle) que hacen esto, aunque no están realmente orientados a su escenario.

¿Quizás necesitas alguna API de consulta genérica, pero no necesariamente SQL? En ese caso, podría considerar algo como API de persistencia de Java . Esto puede asignarse a SQL en el servidor, pero como es más simple que SQL, hay menos errores.

    
respondido por el paj28 15.05.2014 - 22:21
fuente
2

Para agregar a lo que otros han dicho, no necesita acceso de escritura en la tabla de la base de datos a instalar puerta trasera . Aunque estaba utilizando SQL Server en lugar de MySQL, alguien me mostró una secuencia de comandos que permitía crear nuevos usuarios en el servidor a través de SQLI (al no tener en cuenta el sistema, creo).

Si necesita un acceso flexible a los datos, buscaría en algún contenedor de OData que proteja la base de datos al no ejecutar un SQL arbitrario, pero lo suficientemente flexible como para admitir diversas consultas.

Sin embargo, sí vi aplicaciones que enviaban SQL en su HTML (creo que en Facebook), pero las enviaron firmadas para que no aceptaran el sql de nuevo si no procedía de ellas. Lo que significa que nadie podría cambiarlo sin romper la firma, por lo que rechazaría la solicitud.

    
respondido por el LB2 15.05.2014 - 22:18
fuente

Lea otras preguntas en las etiquetas