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.
DASTInstrucciones 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.
InjectionLas 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 PostureQue 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
Inyección SQL en el formulario de acceso
POST /login · parámetro «usuario»
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
- Sustituye la concatenación por una consulta parametrizada en el acceso a datos del login.
- 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.
- Reduce los permisos del usuario de base de datos de la aplicación a lo mínimo que necesita.
- 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.
const user = await db.query(
"SELECT * FROM users " +
"WHERE email = '" + email + "'"
);const user = await db.query(
"SELECT * FROM users WHERE email = $1",
[email]
);