A fecha de hoy, la inyección SQL sigue siendo un vector crítico que, a pesar de ser conocido, continúa comprometiendo infraestructuras por errores básicos de manejo de datos. El problema raíz es confiar en el input del usuario y concatenarlo directamente en la query.

El error (Vulnerable):

# Nunca hagas esto
query = f"SELECT * FROM users WHERE username = '{username}'"
db.execute(query)

Si el usuario introduce: ‘ OR ‘1’=’1, la query se convierte en:

SELECT * FROM users WHERE username = '' OR '1'='1'

Al hacer esto, permites que el atacante altere la lógica de la consulta para saltar autenticaciones o extraer toda la tabla de usuarios.

La solución (Segura):

Usa siempre consultas parametrizadas (Prepared Statements). Esto separa estrictamente el código SQL de los datos enviados por el usuario.

Ejemplo seguro en Python/PostgreSQL

db.execute("SELECT * FROM users WHERE username = %s", (username,))

En este escenario, el motor de la base de datos trata el input como un simple literal, impidiendo que el motor SQL ejecute comandos maliciosos.

Checklist de mitigación:

Prepared Statements: Obligatorios en cualquier interacción con la BD.

ORM nativo: frameworks como Prisma, SQLAlchemy o Eloquent suelen parametrizar por defecto.

Principio de menor privilegio: La cuenta que utiliza la aplicación no debe tener permisos de superusuario ni acceso a tablas que no le corresponden.

Validación de tipos: Si esperas un ID, asegúrate de que el input sea un integer antes de procesarlo.

¿Cuál es la técnica o herramienta que utilizas hoy en día para automatizar la detección de SQLi en tus pipelines de CI/CD?


Daniel Maldonado

¡Hola! Soy Daniel Maldonado, Sr. Analista de Seguridad Informática y me dedico al hacking desde hace más de 10 años.

0 comentarios

Deja una respuesta

Marcador de posición del avatar

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