¿Un método más rápido que el de Blind SQL Injection?

2

La inyección de SQL ciego se basa en pruebas VERDADERAS / FALSAS. Aquí hay un ejemplo:

is first letter A? --> NO
is first letter B? --> YES
is second letter A? --> NO
...
is last letter X? --> YES

No es un método rápido. ¿Sabes algo mejor para adivinar la palabra de la base de datos más rápido?

    
pregunta Mark Q. 12.06.2012 - 15:52
fuente

4 respuestas

6

Su enfoque a este problema es muy malo. Está intentando encontrar letras en la complejidad de tiempo lineal: O(n) . Comparando letras, una tras otra. Significa, que en el modelo pesimista tienes que revisar todo el alfabeto. Supongamos que su alfabeto se compone solo de letras minúsculas: {a,z} , y su contraseña es zzz . Tendrás 26 intentos para encontrar la primera letra, 26 intentos para encontrar la segunda letra y 26 intentos para encontrar la última.

Como se mencionó anteriormente, puede acelerar este proceso. Tenga en cuenta que el orden de las letras en el alfabeto siempre es el mismo (las letras están ordenadas). Puede usar la búsqueda binaria con O(log(n)) complejidad de tiempo. Este método es utilizado por la mayoría de las personas. Sin embargo, también puedes acelerarlo.

Si sabemos que la contraseña de búsqueda es la palabra del diccionario, podríamos utilizar el análisis lingüístico para construir nuestros intentos de inyección de sql sq. Podríamos utilizar nuestro conocimiento sobre la frecuencia de las letras en el texto (por ejemplo, la letra más frecuente en inglés es ‘e’). También podríamos usar el conocimiento: ¿cuál es la probabilidad de que después de la letra X, aparezca la letra Y? También podríamos intentar adivinar cuántas letras X hay en nuestra palabra. En este enfoque las expresiones regulares pueden ayudarnos mucho. Definimos el rango de caracteres que coincidirán con las funciones LIKE (para MSSQL ) o REGEXP (para MySQL ). Aquí se puede encontrar una explicación bastante agradable sobre la expresión regular en ataques de inyección de SQL: enlace

    
respondido por el p____h 14.06.2012 - 14:19
fuente
5

El método que está describiendo tiene una complejidad de tiempo O (n). Puede usar una búsqueda binaria que tiene una complejidad de tiempo O (log (n)). Creo que sqlmap usa una búsqueda binaria, hay varias otras implementaciones .

Algunas bases de datos como MSSQL le permiten realizar búsquedas de DNS, y este se puede usar como un canal de comunicación alternativo con el base de datos.

También puedes volcar los resultados de una consulta en un archivo usando into outfile de MySQL.

Finalmente, a veces no es realmente una inyección ciega, simplemente "difícil de ver". Lo que quiero decir con esto es que no necesita usar sleep() y no puede extraer datos directamente con un union select , sino que si una parte de la consulta es falsa o verdadera, afecta a alguna parte de la consulta. página. Utilicé esta técnica de explotación en máquinas simples , donde, si la pregunta era cierta, se encontró un registro , si fuera falso, obtendría un error "No se encontraron mensajes". Esto se puede usar junto con una búsqueda binaria para acelerar en gran medida el proceso de Exfiltrating Data.

    
respondido por el rook 12.06.2012 - 20:46
fuente
4

Puedes hacer tus propias pruebas con sqlmap , que incluye diferentes tipos de ataques SQLi.

Debido a que no incluye ninguna información del entorno, no estoy seguro de cómo ayudar. Ejecute sqlmap utilizando un tipo de sqli y compare los tiempos de ejecución, teniendo en cuenta las variables que podrían inflar artificialmente los tiempos de ejecución.

    
respondido por el schroeder 12.06.2012 - 16:45
fuente
2

No distinga mayúsculas de minúsculas, y divídalo en trozos ...

¿El fragmento actual contiene alguna A?

WHERE MID(field1,1,40) LIKE '%a%'

Si es así:

WHERE MID(field1,1,40) LIKE 'a%'
WHERE MID(field1,1,40) LIKE '_a%'
WHERE MID(field1,1,40) LIKE '__a%'

etc.

    
respondido por el militia officer 05.10.2012 - 12:21
fuente

Lea otras preguntas en las etiquetas