¿alguien puede explicar los ataques de inyección de SQL basados en errores?

2

Practico sobre la inyección de SQL basada en errores, pero no hay ninguna buena referencia para ello ...

por ejemplo :):

mysql> select count(*),floor(rand()*2) as a from users group by a;
ERROR 1062 (23000): Duplicate entry '0' for key 'group_key'
mysql> select count(*),floor(rand()*2) as a from users group by a;
ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'
mysql> select count(*),floor(rand()*2) as a from users group by a;
+----------+---+
| count(*) | a |
+----------+---+
|       10 | 0 |
|        3 | 1 |
+----------+---+
2 rows in set (0.00 sec)

¿Por qué la primera y la segunda consulta no se ejecutan?

¿significa el valor de la primera o segunda fila de iguales con una columna?

entonces, ¿por qué cuando cambio la consulta a esto no puedo ver ningún mensaje de error?

  

mysql > seleccione 1, floor (rand () * 2) como un grupo de usuarios por a;

+---+---+
| 1 | a |
+---+---+
| 1 | 0 |
| 1 | 1 |
+---+---+
2 rows in set (0.00 sec)

No puedo entender la vulnerabilidad de inyección de SQL basada en error y también veo este enlace: enlace ¡Pero todavía tengo una pregunta!

¿Cómo se produce esta vulnerabilidad?

Gracias

    
pregunta unbl0ck3r 21.06.2015 - 22:53
fuente

3 respuestas

1

La vulnerabilidad es la inyección SQL. Basado en errores es solo un método para hacer que aparezca el mensaje de error Mostrar datos deseados en lugar de solo un error, ya que cuando tenemos una vulnerabilidad ciega que muestra un error, podemos extraer datos confidenciales de la base de datos directamente (en lugar de un bit a la vez).

Entonces, ¿cómo funciona la consulta?

  

seleccione count (*), concat_ws (0x3a, database (), floor (rand () * 2)) desde   usuarios agrupados por un

Primero, necesitamos count(*) porque queremos que la base de datos realice realmente la operación agregada (agrupar por) y no la optimice.

Segundo, usamos concat_ws(0x3a solo para hacer que las cosas se vean mejor. Solo podemos usar concat(DESIRED_DATA,floor(rand()*2)) .

Bien, ahora vamos a la lógica. concat(DESIRED_DATA,floor(rand()*2)) le dará resultados diferentes en función de cada fila del resultado de la base de datos, porque así es como funciona rand() . Da un número aleatorio entre 0 y 1 para cada fila de salida. Ahora que nuestro azar está limitado a {0,1}, solo genera dos valores. Si estos dos valores son diferentes (es decir, 0 y 1), entonces la consulta funciona bien y le da el resultado que vio anteriormente.

Sin embargo, si ambos dan el mismo número, entonces group by fallará, porque el group_key que se esperaba que fuera único (es el ID de la tabla de resultados temporal) se duplicará y causará que la base de datos errar.

Ahora, a Mysql le gusta decirle cuál es exactamente el valor duplicado en esa consulta, por lo que le muestra la clave duplicada, que será el DESIRED_DATA concatenado por 1 o 0 (de ahí el 0x31 para separarlos mejor.

Por lo tanto, las dos partes de truco, count(*) y rand() son necesarias para que MySQL realmente lo ejecute varias veces, en lugar de solo optimizarlo. Pero el truco es crear una tabla temporal que tenga claves duplicadas y dejar que MySQL nos informe sobre el valor de esa clave en un error .

    
respondido por el AbiusX 19.02.2018 - 03:09
fuente
2

La inyección de SQL basada en errores aprovecha el mal manejo de errores en una aplicación.

Cuando la aplicación te está devolviendo el error mysql, encuentras una forma (generalmente con group by) para que mysql devuelva los datos interesantes en el error.

En su ejemplo, no puedo ver qué información está tratando de obtener, pero mire este sitio, hay buenos ejemplos allí.

Como puede ver en los ejemplos, cada solicitud se realiza para activar un error. Este error contendrá el valor deseado por el atacante. Por ejemplo, la versión mysql se recuperará con el error "Duplique la entrada ' versión MySQL aquí ' para la clave 1".

    
respondido por el r00t 22.06.2015 - 00:34
fuente
1

La inyección de SQL basada en error es útil cuando tiene una página que ejecuta una consulta donde no se muestra el resultado, pero mostrará un error de base de datos si existe. Si bien también podría explotar esto utilizando SQLi ciego, el error basado en ofrece un aumento de velocidad significativo.

La explotación se basa en la inyección una condición que causará un error, a menudo se utiliza la conversión de tipos:

  • select 0+@@version
  • select @@version/0

Si bien se puede utilizar cualquier error, es importante que se evalúen los datos que desea extraer, por lo que no puede utilizar un error de sintaxis.

Espero que esto te ayude a entender cómo funciona el SQLi basado en errores.

    
respondido por el wireghoul 22.06.2015 - 00:39
fuente

Lea otras preguntas en las etiquetas