¿Con respecto a la inyección de SQL en el back-end?

2

He iniciado sesión en la base de datos SQL Server 2008 y ejecuté la siguiente consulta:

select * from USER_Main_INFO_Name where userid ='' or 'x'='x'

Después de ejecutar la consulta, la base de datos ha proporcionado una lista total de usuarios.

Usando la herramienta Burp. He hecho la inyección SQL en la parte delantera. Mi aplicación ha dado un resultado de error adecuado.

¿Mi aplicación es fuerte? ¿Cómo evitar la inyección de SQL en el backend?

    
pregunta user35819 26.12.2013 - 11:02
fuente

2 respuestas

4

Esto implica que en algún momento estás construyendo sentencias de SQL por concatenación de cadenas que involucran cadenas no confiables. ¡No hagas eso! En su lugar, use declaraciones preparadas (o alguna otra forma de parametrización de consultas), ya que son bastante intrínsecamente inmunes a SQLi.

Supongo que te refieres a que tu interfaz bloquea con éxito todos los SQLi que probaste. Esto no significa que bloquee todos los SQLi, por supuesto; eso depende de qué tan exhaustivas sean sus pruebas.

Sin embargo, una vez que la consulta llega a tu servidor (asumiendo que es tu DBMS), realmente no hay forma de saber qué SQL proviene de SQLi y qué SQL es legítimo. Realmente debes confiar en que lo que viene en la conexión de la base de datos es confiable.

Por supuesto, es aconsejable limitar el impacto de tales ataques tanto como sea posible. Más simple y comúnmente, puede limitar los permisos de la cuenta de servicio de la aplicación en la base de datos solo a las acciones que realmente realiza. Esto no impide que SQLi per se, pero disminuirá el impacto si existe alguno.

Otro enfoque posible es abstraer algunos de los SQL en una capa de acceso a datos con la cual habla el frontend, y evitar pasar cadenas al DBMS que no provienen de la aplicación en sí (y ciertas columnas de confianza en ciertas tablas) . Es mucho más fácil usar declaraciones preparadas.

    
respondido por el Falcon Momot 26.12.2013 - 11:21
fuente
3

La mejor manera de prevenir las inyecciones de SQL en el front-end es usar declaraciones preparadas. Si desea restringir el acceso de los usuarios a la base de datos, puede utilizar las herramientas de administración de cuentas como CREATE USER , GRANT INSERT ... , REVOKE ... , que se envían a lo largo del propio DBMS. Si esto no satisface el nivel de seguridad deseado, puede comenzar a usar firewalls de base de datos. Otro enfoque para impedir que los usuarios accedan a su base de datos es introducir una línea de base de acceso a datos. Una línea de base significa que crea un protocolo de acceso que contiene todos los puntos de acceso que tienen permiso para acceder a la base de datos de destino. Un ejemplo simple sería:

DB-USER | IP-Address   | Source Program
----------------------------------------
admin   | 5.200.200.20 | OraDriver.exe
herby   | 192.186.2.10 | DbUtil.exe

En caso de que una solicitud entrante se desvíe de la línea base, se ejecute una acción específica, notificar a un administrador (comportamiento como un sistema de detección de intrusos), bloquear la solicitud, etc.

    
respondido por el My-Name-Is 26.12.2013 - 12:47
fuente

Lea otras preguntas en las etiquetas