Hackear: ejemplo de inyección de SQL en un programa en C ++

Inyección de código se produce cuando el usuario atrae a su programa en C ++ para ejecutar alguna pieza de código creado por el usuario. " Qué? Mi programa nunca haría eso "! tu dices. Considere la más común y, por fortuna, más fácil de entender variante de esta pequeña estafa: la inyección de SQL.

Aquí están algunos hechos acerca de SQL:

  • SQL (a menudo pronunciado " secuela ") significa Structured Query Language.

  • SQL es el lenguaje más común para acceder a bases de datos.

  • SQL se utiliza casi universalmente en el acceso a bases de datos relacionales.

Si no # 8242-t ya saben SQL, # 8242-s suficiente para decir que SQL es a menudo interpretado en tiempo de ejecución. Muy a menudo, las declaraciones de C ++ enviarán una consulta SQL a un servidor independiente de base de datos y luego procesar y mostrar lo que el servidor envía de vuelta. Una consulta típica de SQL dentro de un programa C ++ puede ser similar al siguiente:

char * query = "SELECT * FROM transacciones DONDE ID de cuenta = # 8242 hasta 123,456789 millones # 8242 -" resultados = submit (consulta) -

Este código dice, "SELECT todos los campos DE la mesa de operaciones DÓNDE el ID de la cuenta (probablemente uno de los campos de la tabla de transacciones) es igual a 123 456 789 (el usuario # 8242-s Identificación de cuenta) ". los enviar() función de la biblioteca podría enviar esta consulta fuera al servidor de base de datos.

El servidor de base de datos respondería con todos los datos que tiene sobre cada transacción que el usuario ha hecho nunca en esta cuenta, que se almacenan en la colección resultados. El programa entonces recorrer resultados, Probablemente se presentan las transacciones en una tabla con cada transacción en una fila separada.

El usuario probablemente doesn # 8242-t necesita que muchos datos. Tal vez sólo las transacciones entre fecha de inicio y fecha final, dos variables que el programa lee desde el usuario # 8242-s página de consulta. Este programa más selectivo C ++ podría contener una declaración como la siguiente:

char * query = "SELECT * FROM transacciones DONDE ID de cuenta = # 8.242-123.456.789 # 8242-" "Y date> # 8242- "+ startDate +" # 8242- y la fecha lt; # 8242- "+ endDate +" # 8242 - "-

Si el usuario introduce 01/10/2013 para fecha de inicio y 01/11/2013 para fecha final, a continuación, la consulta resultante que se envía a la base de datos es la siguiente:

* SELECT FROM transacciones DONDE ID de cuenta = # desde 8.242 hasta 123456789 # 8242- ANDdate> # 8242-2013 / 10/1 # 8242- y la fecha lt; # 8242-2013 / 11/1 # 8242--

En otras palabras, le mostrará todas las transacciones realizadas en el mes de octubre de 2013. Eso tiene sentido. Lo # 8242-s el problema?

El problema surge si el programa simplemente acepta lo que el usuario entra como las fechas de inicio y fin y los conecta a la consulta. Doesn # 8242-t hacer ninguna comprobación para asegurarse de que el usuario está introduciendo sólo una fecha y nada más que una fecha. Este programa es demasiado confiada.

¿Qué pasa si un hacker entrara 01/10/2013 para el fecha de inicio, pero para el fecha final llegara a entrar en algo así como 01/11/2013# 8242- O ID de cuenta = # 8242 hasta 234567890. (Observe las comillas simples no equilibradas.) Ahora la consulta combinada de SQL que se envía al servidor de base de datos se vería

* SELECT FROM transacciones DONDE ID de cuenta = # desde 8.242 hasta 123456789 # 8242- ANDdate> # 8242-2013 / 10/1 # 8242- y la fecha lt; # 8242-2013 / 11/1 # 8242- ORaccountID = # 8242 a 234.567.890 # 8242--

Esto, dice, " Muéstrame todas las transacciones de la cuenta 123456789 para el mes de octubre de 2013, además de todas las transacciones para alguna otra cuenta 234567890 que don # 8242-t propia para cualquier fecha ".

Este pequeño ejemplo puede plantear algunas preguntas: " ¿Cómo fue el hacker sabe que él podía entrar sentencias SQL en lugar de las fechas "? Él no # 8242-t know - él simplemente intenta entrar falsa SQL en todos los campos que acepte texto carácter y ve lo que pasa. Si el programa se queja, " # Que no 8242-es una fecha legal, " a continuación, el hacker sabe que el programa comprueba para asegurarse de que las fechas de entrada son válidos e inyección SQL ganó # 8242-t trabajo aquí.

Si, por otro lado, el programa mostrará un mensaje de error como Declaración ilegal de SQL, a continuación, el hacker sabe que el programa acepta la entrada falsa y enviados fuera al servidor de base de datos que luego pateó la espalda. Éxito! Ahora todo lo que tiene que hacer es formular la pregunta correcta.

Entonces, ¿cómo el hacker sabe que el ID de cuenta se llama ¿ID de la cuenta? Él no # 8242-sé que tampoco, pero ¿cuánto tiempo haría falta para adivinar que uno? Los hackers son muy persistentes.

Por último, ¿cómo el hacker sabe que 234567890 era un número de cuenta válido? Una vez más, él no # 8242-t -, pero ¿de verdad crees que el hacker # 8242-s va a parar allí? Diablos no. Él # 8242-S va a intentar todas las combinaciones de dígitos que puede imaginar hasta que encuentre algunas realmente grandes cuentas con saldos muy grandes que vale la pena robar a.

Recuerde tres cosas:

  • Inyección SQL fue hace años muy comunes.

  • Era sólo esta sencilla.

  • Con un mejor conocimiento de SQL y una sintaxis muy torturado, un buen hacker puede hacer casi cualquier cosa que quiera con una inyección SQL como esto.




» » » » Hackear: ejemplo de inyección de SQL en un programa en C ++