¿Cómo construir un escáner de inyección SQL en Python?

En términos generales, SQLi es la técnica de inserción de código más frecuente y peligrosa. Un ataque SQLi está destinado a enviar comandos SQL maliciosos al servidor de la base de datos. El objetivo de ataque más común es la extracción masiva de conocimiento. Los atacantes pueden volcar tablas de bases de datos con muchos miles de registros de clientes. Según el entorno, la inyección SQL también se puede explotar para cambiar o eliminar datos, ejecutar comandos arbitrarios del sistema operativo o lanzar ataques de denegación de servicio (DoS).

Construyendo un escáner de inyección SQL en Python

Usando el siguiente enfoque, primero extraeremos los formularios web porque la inyección de SQL se realiza a través de la entrada del usuario. Luego, verificaremos si una página web tiene errores de SQL, esto será útil al verificar ataques de inyección de SQL y, finalmente, lo probaremos en formularios HTML.

Para esto, necesitaremos requests y el paquete BeautifulSoup.

Acercarse

  • Módulo de importación
  • Ahora, inicialice la sesión de HTTP y configure el agente de usuario más reciente para su navegador
  • Ahora extraeremos los formularios web HTML.
    • Para esto, primero, escribiremos una función que al dar una URL, hará una solicitud a esa página y extraerá todas las etiquetas de formulario HTML de ella.
    • Luego devuelva estas etiquetas como una lista.
    • Entonces podemos usar esta lista después.
  • Ahora comprobaremos si la página obtenida tiene alguna vulnerabilidad de SQL o no a partir de su salida de respuesta.
  • Si tiene algún error de sintaxis, la página es vulnerable. Aunque hay muchos errores de base de datos, buscaremos con errores de base de datos limitados, es decir, errores de Oracle y SQL Server, porque estos dos se usan principalmente.
  • Ahora aplicaremos este enfoque de búsqueda para todos los formularios en la página web HTML para el error
  • Nuestro script está listo y ahora lo probaremos.
    • Pasaremos la URL en la que tenemos que detectar la inyección de SQL.
    • Así que pasaremos el argumento URL a través de la línea de comando.

Programa:

Python3

import requests
from bs4 import BeautifulSoup
import sys
from urllib.parse import urljoin
  
s = requests.Session()
s.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
  
  
def get_forms(url):
    soup = BeautifulSoup(s.get(url).content, "html.parser")
    return soup.find_all("form")
  
  
def form_details(form):
    detailsOfForm = {}
    action = form.attrs.get("action").lower()
    method = form.attrs.get("method", "get").lower()
    inputs = []
      
    for input_tag in form.find_all("input"):
        input_type = input_tag.attrs.get("type", "text")
        input_name = input_tag.attrs.get("name")
        input_value = input_tag.attrs.get("value", "")
        inputs.append(
            {"type": input_type, "name": input_name, "value": input_value}
        )
          
    detailsOfForm["action"] = action
    detailsOfForm["method"] = method
    detailsOfForm["inputs"] = inputs
    return detailsOfForms
  
  
def vulnerable(response):
    errors = {"quoted string not properly terminated",
              "unclosed quotation mark after the character string", 
              "you have an error in your sql syntax;"}
      
    for error in errors:
        if error in response.content.decode().lower():
            return True
    return False
  
  
def sql_injection_scan(url):
    forms = get_forms(url)
    print(f"[+] Detected {len(forms)} forms on {url}.")
      
    for form in forms:
        details = form_details(form)
          
        for c in "\"'":
            data = {}
              
            for input_tag in details["inputs"]:
                if input_tag["type"] == "hidden" or input_tag["value"]:
                    data[input_tag["name"]] = input_tag["value"] + c
                elif input_tag["type"] != "submit":
                    data[input_tag["name"]] = f"test{c}"
            url = urljoin(url, form_details["action"])
              
            if details["method"] == "post":
                res = session.post(url, data=data)
            elif details["method"] == "get":
                res = session.get(url, params=data)
            if vulnerable(res):
                print("SQL Injection attack vulnerability detected in link:", url)
            else:
                print("No SQL Injection vulnerability detected")
                break
  
  
if __name__ == "__main__":
    url_arg = "https://www.geeksforgeeks.org/python-programming-language/"
    sql_injection_scan(url_arg)

Producción:

[+] 0 formularios detectados en https://www.geeksforgeeks.org/python-programming-language/.

Publicación traducida automáticamente

Artículo escrito por img2018033 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *