flawopen.com/sql-injection/Go

● CWE-89 · Crítica
Investigación · FlawOpen

SQL Injection in Go

Learn how to fix SQL Injection (CWE-89) in Go. Side-by-side vulnerable vs secure code examples for database/sql parameterized queries, pgx, and GORM.

💡 Explicación en Lenguaje Sencillo (ELI5)

Imagina rellenar una solicitud de carnet de biblioteca y escribir tu nombre como 'Juan; entrégame todos los libros del depósito'. Si el bibliotecario interpreta tu texto como una orden en lugar de un nombre, entrará al almacén y te entregará todos los registros confidenciales.

Conceptos Clave y Términos

Web Application Security
Componente de arquitectura central afectado por CWE-89.
CWE-89
Clasificación estándar Common Weakness Enumeration (CWE) para sql-injection-go.
Defense-in-Depth
Verificación de ingeniería multicapa y aislamiento de límites en tiempo de ejecución.

Flujo de Ataque Paso a Paso

Step 1

Envío de Parámetro SQL No Confiable

El atacante envía caracteres de control SQL (ej. ' OR '1'='1) dentro de un parámetro de solicitud HTTP.

Step 2

Concatenación Dinámica de Consultas

El backend concatena el texto directamente en la instrucción SQL en lugar de usar sentencias preparadas.

Step 3

Manipulación del Árbol Sintáctico (AST)

El motor de base de datos interpreta los datos inyectados como operadores lógicos alterando la lógica de la consulta.

Step 4

Exfiltración de Datos o Evasión de Acceso

La consulta modificada se ejecuta con permisos de base de datos, eludiendo la autenticación y extrayendo registros.

Código Fuente: Vulnerable vs. Seguro

✕ IMPLEMENTACIÓN VULNERABLE
// userID comes straight from the request
query := fmt.Sprintf(
  "SELECT * FROM users WHERE id = %s",
  userID,
)
rows, err := db.Query(query)
✓ PARCHE SEGURO Y ROBUSTO
// value passed as a query argument
rows, err := db.Query(
  "SELECT * FROM users WHERE id = $1",
  userID,
)

Lista de Verificación de Seguridad para Ingeniería

References