Ataques de inyección / inyección de SQL en términos Layman

1

Tengo problemas para descubrir qué son los ataques de inyección de SQL o, en términos más generales, qué son los ataques de inyección. La mayoría de las explicaciones que hay en Internet son algo difíciles de entender. ¿Podría alguien explicar, en términos simples, qué es un ataque de inyección, y específicamente una inyección de SQL? Además, ¿cuáles son las formas de defenderse contra estos?

Gracias

    
pregunta APCoding 04.10.2015 - 04:08
fuente

2 respuestas

3

En términos sencillos:

Las aplicaciones web típicas son de tres niveles (navegador + servidor web + bases de datos backend). Cuando un usuario accede a un sitio web, su navegador recibe html y js que son producto de páginas web estáticas y también de dinámicas generadas mediante el código del lado del servidor (por ejemplo, php, asp). Cuando inicia sesión, por ejemplo, envía su contraseña y nombre de usuario al servidor web, que procesa dichos parámetros y aplica la lógica de autenticación preprogramada (en php, asp). Dicha lógica requiere verificaciones utilizando una base de datos que almacena datos de los usuarios y permite La verificación simple: el nombre de usuario coincide con la contraseña. Por lo tanto, la lógica del lado del servidor toma sus argumentos y consulta la base de datos (por ejemplo, MySQL).

SELECT * FROM Users WHERE username='your_supplied_username' AND password='your_supplied_password';

La base de datos procesa esto y devuelve (si la base de datos está diseñada correctamente) solo una (coincidencia de nombre de usuario y contraseña) o cero (contraseña incorrecta) que "lo represente".

¿Qué pasa con SQL Injection Bro?

No soy tu hermano, hermano: P. Un desarrollador descuidado tomaría los parámetros enviados por usted y los pondría directamente en los campos your_supplied_ *. Si el usuario no fuera malicioso, esto no sería ningún problema. Sin embargo, para un atacante malicioso, esto abre una puerta enorme para los ataques. Si está familiarizado con SQL, sabe que AND requiere que las expresiones izquierda y derecha se evalúen como verdaderas. Además, en SQLi, el carácter de comentario "-" es un amigo útil, ¿y si escribo mi nombre de usuario '; -?

SELECT * FROM Users WHERE username='your_supplied_username';--' AND password='your_supplied_password';

El código del lado del servidor tomará mi entrada, la aplicará a la consulta de cadena y la enviará a la base de datos. La base de datos interpretará "-" como un comentario que excluirá:

' AND password='your_supplied_password';

manteniendo:

SELECT * FROM Users WHERE username='your_supplied_username'

Esta es una consulta válida que se evaluará fácilmente como verdadera. Ahora, el comportamiento aquí varía. Si el nombre de usuario es único (normalmente lo es), solo se devolverá un registro. Si no es así, se devolverán varios registros y el código del servidor web (por ejemplo, php) generalmente elegirá el primero. Si está familiarizado con SQL, ahora puede obtener consultas creativas y en cadena, usar comodines y obtener comodines. Ahora la pregunta es:

Como desarrollador, ¿qué puedo hacer?

Ahora, esto depende del lenguaje del lado del servidor que está utilizando, pero las primitivas de codificación suelen tener el mismo nombre. Puede escapar de secuencias especiales usando php ( enlace ) o usar declaraciones preparadas ( enlace ).

¿Cómo puedo saber si el servidor sufre de SQLi? Puede ejecutar herramientas como SQLMap o SQLNinja. También puedes ir a los formularios y escribir

'gibberish donde, con suerte, confundirá el analizador de consultas php y filtrará un error que se muestra en su navegador (error de sentencia SQL). Existen otras técnicas, como inyectar una declaración de suspensión en las consultas para verificar si la base de datos se cuelga durante unos segundos antes de regresar. Como mecanismo de defensa, siempre debe procesar sus errores de SQL en el código del lado del servidor antes de enviarlos al usuario para evitar la fuga de información.

Mantente seguro;)

    
respondido por el BrunoMCBraga 04.10.2015 - 11:57
fuente
0

Los ataques de inyección SQL son esencialmente una forma para que un atacante obtenga acceso a los contenidos de una base de datos mediante la explotación de vulnerabilidades o configuraciones erróneas en la forma en que la aplicación maneja ciertas cadenas de caracteres (en particular, caracteres de escape de cadenas).

La forma más fácil que se me ocurre para describirlo es que tiene un formulario web que requiere la participación del usuario para completar una encuesta. En circunstancias normales, el usuario ingresará su información en el formulario y la enviará. Sin embargo, si la aplicación web no limpia correctamente la entrada al eliminar ciertos caracteres especiales, un atacante, en lugar de escribir los datos esperados, puede ingresar un comando que es un comando SQL para extraer datos. Hay algunos ejemplos de métodos y técnicas de inyección de SQL utilizados comúnmente en enlace

Hay varias formas de mitigar el daño que puede causar una inyección de SQL. La entrada de desinfección puede evitar que un atacante ingrese los caracteres especiales necesarios para ejecutar comandos SQL, y limitar los privilegios de la cuenta de la base de datos web puede evitar que los datos que puede recopilar una inyección SQL.

    
respondido por el koluke 04.10.2015 - 06:16
fuente

Lea otras preguntas en las etiquetas