Aplicación web

Pone a prueba tu web y apps como lo haría un atacante.

Simulamos el comportamiento de un atacante contra tu sitio y aplicaciones —de forma segura, sin dañarlos— para descubrir por dónde podrían entrar antes de que alguien lo intente de verdad.

Qué revisa este frente

  • Tu sitio, puesto a prueba

    Probamos tu sitio en funcionamiento como lo haría alguien intentando entrar, de forma segura y sin dañar nada, para ver qué cede.

    DAST
  • Instrucciones coladas por un formulario

    Comprobamos si es posible colar instrucciones a través de tus formularios y campos de búsqueda para que la base de datos haga algo que no debería.

    Injection
  • Las protecciones del navegador

    Verificamos que tu web tenga puestas las protecciones del navegador que evitan robos de sesión y suplantaciones. Suelen faltar y casi nunca se notan.

    Web Posture
  • Que el candado sea real

    Revisamos que el candado de tu web sea real: certificado válido, sin vencer, y cifrado que no esté obsoleto.

    TLS/SSL

Así se ve el resultado

Y esto es lo que recibes

el hallazgo
altoDAST

Inyección SQL en el formulario de acceso

POST /login · parámetro «usuario»

runbook generadoconfianza: alta

qué está pasando

El campo de usuario del formulario de acceso llega a la consulta sin separar el dato de la instrucción. Un valor construido a propósito cambia lo que la base entiende.

impacto

Permite leer la tabla de usuarios completa y, según los permisos de la conexión, modificarla. Es la puerta que más se prueba en un ataque automatizado.

pasos para cerrarlo

  1. Sustituye la concatenación por una consulta parametrizada en el acceso a datos del login.
  2. Revisa el resto de consultas del mismo módulo: el patrón suele repetirse en el registro y en la recuperación de contraseña.
  3. Reduce los permisos del usuario de base de datos de la aplicación a lo mínimo que necesita.
  4. Despliega y vuelve a lanzar el análisis para confirmar que el hallazgo se cierra.

cómo verificar que quedó cerrado

  • El payload de prueba ya no devuelve filas distintas de las esperadas.
  • El registro de la base no muestra consultas con sintaxis alterada.
  • El análisis siguiente marca el hallazgo como resuelto, no como reabierto.

el cambio, listo para pegar

La diferencia está en dejar que el motor de base de datos reciba el valor como dato, nunca como parte de la instrucción.

antes
const user = await db.query(
  "SELECT * FROM users " +
  "WHERE email = '" + email + "'"
);
después
const user = await db.query(
  "SELECT * FROM users WHERE email = $1",
  [email]
);
referenciasOWASP · SQL Injection Prevention Cheat SheetCWE-89