¿Cómo funciona la inyección avanzada de SQL?

Shashi Kant Sharma dio un excelente recorrido sobre cómo funciona esto, pero me gustaría agregar algunas estrategias de mitigación:

* Los procedimientos almacenados son su amigo, especialmente para el inicio de sesión / autenticación SQL. Me doy cuenta de que algunas personas se oponen filosóficamente a los desencadenantes y los procedimientos almacenados, pero sugiero respetuosamente que esas personas lo superen.

En el ejemplo de Shashi, la razón por la que ‘SELECCIONAR correo electrónico, contraseña de …’ funciona es porque eso es todo lo que hace. Está buscando ‘n’ filas, donde n> 0. Pero esa no es la forma en que debería funcionar la autenticación. Debe haber una y SOLO una fila devuelta. Este simple control eliminaría el 90% de este estilo más popular de ataque de inyección sql. Por ejemplo…

1. el procedimiento almacenado ejecuta ‘SELECCIONAR correo electrónico, contraseña de …’
2. comprobaciones de procedimiento almacenado para rowcount = 0; lo que debería informar a la aplicación que llama para decirle al usuario que “intente nuevamente”
3. comprobaciones de procedimiento almacenado para recuento de filas> 1; suponiendo que la columna de correo electrónico es única / no nula, ahora sabe con un 99% de certeza que este es un intento de inyección sql; alertar a la aplicación que realiza la llamada y REGISTRARLO, posiblemente prohibiendo la IP del cliente en intentos posteriores
4. el usuario solo se autentica si rowcount = 1
5. Otra cosa interesante de los procedimientos almacenados es su capacidad de tener tipos de datos y TAMAÑOS preestablecidos en los valores de entrada, para evitar que los intentos de pirateo inunden su código con bytes sin sentido que podrían explotar alguna vulnerabilidad indocumentada.

* Del mismo modo, manténgase alejado de las pruebas ‘SI EXISTE’ … ¡siempre verifique el número de filas devueltas de una consulta de autenticación! El hack de estilo ‘OR 1 = 1’ que Shashi describió devolverá varias filas; Esa es tu pistola humeante.

* NUNCA use sql dinámico, como en …

  SET @my_sql_code = 'SELECCIONAR correo electrónico, contraseña de' +  + 'DONDE algo bla, bla, bla ...'

 EJECUTAR @my_sql_code

… porque el hacker tiene la capacidad de hacer cualquier valor nefasto que quiera. Pase siempre los valores a un procedimiento almacenado o API / servicio web intermedio y deje que maneje la transferencia directa de la base de datos subyacente después de asegurarse de que los datos de entrada estén limpios.

* Desactive los informes de errores de db / app: así es como los hackers de inyección sql hacen gran parte de su trabajo sucio. “Agitan el control” con muchas técnicas diferentes diseñadas para enviarles deliberadamente mensajes de error innecesariamente detallados en un intento de mapear sus tablas de usuario y sistema, luego por proceso de eliminación y conjeturas = voila = están en.

Cada lenguaje web / framework / etc moderno tiene los medios para agrupar códigos de error, un volcado de pila + informe completo del entorno y registrarlo, enviárselo por correo electrónico, lo que desee. Lo mejor es devolverle al usuario algo inocuo y vago, como “error 666: nombre de usuario / pwd no válido” o algún mensaje diferente al mensaje estándar “inténtelo de nuevo”. De esa manera, si es un usuario legítimo y lo llaman / envían un correo electrónico con un “error 666 wtf?” sabrá que puede ser que su nombre de usuario y / o pwd tengan algunos apóstrofes (‘) desafortunadamente colocados en ellos.

* NUNCA use las cuentas de usuario sa, sysadmin o root de su base de datos para ejecutar consultas en nombre de su servidor web. Siempre cree una cuenta de tipo www_db_dummy con pocos privilegios que SOLO tenga acceso a la cantidad de columnas, tablas, vistas, procesos almacenados y disparadores necesarios. Al final es más trabajo porque usará muchas declaraciones GRANT, pero esta estrategia hará que sus órdenes de magnitud db sean más seguras contra los ataques de inyección sql y le brindará una enorme tranquilidad al mismo tiempo.

Si todos siguieran los pasos anteriores todo el tiempo, probablemente habría una reducción del 99% en los ataques de inyección SQL durante la noche.

¿Quiere hacer un truco divertido que le dirá si un sitio web es vulnerable a la inyección de SQL, probablemente porque tontamente usan SQL dinámico? Simplemente ingrese un signo de porcentaje ‘%’ (sin las comillas) en uno de los campos de formulario del sitio web y vea lo que hace. Por ejemplo, hace un tiempo estaba usando un sitio frustrante que lo obligaba a conocer parte del apellido de un médico o grupo de práctica / médico antes de devolver una lista del área. Como estaba buscando un nuevo médico, no sabía un nombre, pero solo quería ver a todos los que figuran en el código postal. Frustrante. Mala experiencia de usuario. Entonces, pensé que alguien con malas habilidades de diseño de sitios web también podría tener poco conocimiento de SQL, así que ingresé% en el apellido y los campos de grupo y * boom * obtuve un volcado completo de los miles de documentos en su base de datos, tal como quería .

No me considero un hacker, pero si pudiera hacer eso, ¿qué crees que una persona verdaderamente malvada podría inyectar en tu aplicación web?

Para saber cómo funciona realmente, primero debe saber cómo un servidor comprende y procesa los datos.

El cliente envía esto:
Nombre de usuario: [correo electrónico protegido]
Contraseña: hola

El servidor lo procesa así:
SELECCIONE el correo electrónico, passwd DE los miembros DONDE email = ‘ [correo electrónico protegido] ‘ Y passwd = ‘hola’;

Ahora, si ambas son verdaderas (debido a la palabra clave AND), entonces el servidor solo hará más cosas. Aquí “miembros” es el nombre de la tabla y “email” y “passwd” son los nombres de los campos.
Ahora si el Cliente envía esto:
Nombre de usuario: [correo electrónico protegido] ‘-
Contraseña: cualquier cosa

El servidor lo procesa así:
SELECCIONE el correo electrónico, passwd DE los miembros DONDE email = ‘ [correo electrónico protegido] ‘ – ‘Y passwd =’ cualquier cosa ‘;

Aquí, cualquier cosa anterior, debe ser cierta porque cualquier cosa posterior, se considerará como un comentario (depende del DBMS, por ejemplo, algunos usos # también) y si hay un usuario con una dirección de correo electrónico [protegida por correo electrónico] , obtendremos acceso. Esperemos que hayamos recogido algo de información y hayamos encontrado en la página contactus que [correo electrónico protegido] existe (porque estaba en la página contactus en el sitio web objetivo).
¿Qué sucede si la dirección de correo electrónico se eliminó de la base de datos pero la página contactus no se actualizó y, por lo tanto, no obtendremos una entrada, por lo que esta vez usaremos la palabra clave OR?

El cliente envía esto:
Nombre de usuario: [correo electrónico protegido] ‘OR’ 1 ‘=’ 1 ‘-
Contraseña: bla

El servidor lo procesa así:
SELECCIONE el correo electrónico, passwd DE los miembros DONDE email = ‘ [correo electrónico protegido] ‘ OR ‘1’ = ‘1’ – ‘Y passwd =’ cualquier cosa ‘;
aquí, también, cualquier cosa después, será considerado como un comentario e ignorado. y solo se procesará todo lo anterior, que dice: considere ‘esto’ O ‘esto’ como verdadero y DBMS sabe que ‘1’ = ‘1’ es una declaración verdadera. Entonces nos permitirá entrar.

también se puede hacer de esta manera, el Cliente envía esto:
Nombre de usuario: [correo electrónico protegido] ‘OR’ 1 ‘=’ 1
Contraseña: bla ‘OR’ 1 ‘=’ 1

Ahora ya sabes lo que sucederá en el lado del servidor.

Hay diferentes técnicas para usar en diferentes situaciones para determinar si un sitio web es vulnerable o no, como los caracteres de escape, los ataques basados ​​en el tiempo, los ataques basados ​​en errores, etc. Debe leer y practicar mucho en algunas aplicaciones web vulnerables descargables como: DVWA o Webgoat. Y para ir más allá, aprenda un DBMS específico y una aplicación web y aloje un servidor en su sistema (para practicar localmente). Después de eso, será fácil probar lo mismo en diferentes DBMS y software de aplicaciones web. Luego trate de hacerlos un poco seguros, luego piratee, luego vuelva a hacerlos un poco más seguros y luego intente piratearlos nuevamente.
Feliz aprendizaje
Happy Hacking

Hay un muy buen recurso en el tubo de seguridad, serie de videos sqli labs de audi1. Le permite configurar su propia aplicación web vulnerable en cualquier entorno de Linux y le permite aprender las cosas desde los conceptos básicos hasta los profesionales desde la inyección SQL y la construcción de una perspectiva de aplicación web segura.

¡Lo más importante es que es completamente gratis!

Encuentra el siguiente enlace para lo mismo.

http://www.securitytube.net/user

en resumen el concepto es
“1 = 1”, que siempre es cierto para todas las condiciones.
Por lo tanto, insertar ese tipo de comandos combinados con otros pocos comandos más en las páginas de inicio de sesión de los sitios web puede darle acceso a ellos. Dado que es un truco muy antiguo para hackear, hoy en día la validación de datos en las páginas de inicio de sesión es mucho más inteligente.