Seguridad de aplicaciones Java: top 10 vulnerabilidades para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Seguridad de aplicaciones Java: top 10 vulnerabilidades para principiantes

\n

Java sigue siendo uno de los lenguajes más populares para crear aplicaciones corporativas y web. Sin embargo, incluso una plataforma confiable no garantiza la seguridad del código. Según OWASP, la mayoría de los ataques ocurren debido a errores de los desarrolladores, no por vulnerabilidades en la JVM. En este artículo analizaremos las 10 principales vulnerabilidades de aplicaciones Java que todo desarrollador principiante debe conocer. Obtendrá no solo conocimientos teóricos, sino también ejemplos prácticos de código con explicaciones sobre cómo evitar errores peligrosos.

\n\n

1. Inyección SQL (SQL Injection)

\n

La amenaza más común. Un atacante puede ejecutar una consulta SQL arbitraria si concatena cadenas directamente.

\n

Ejemplo incorrecto (código vulnerable):

\n
String query = "SELECT * FROM users WHERE username = '" + userName + "' AND pass = '" + password + "'";\nStatement stmt = connection.createStatement();\nResultSet rs = stmt.executeQuery(query);
\n

Solución: use PreparedStatement con consultas parametrizadas.

\n
String query = "SELECT * FROM users WHERE username = ? AND pass = ?";\nPreparedStatement pstmt = connection.prepareStatement(query);\npstmt.setString(1, userName);\npstmt.setString(2, password);\nResultSet rs = pstmt.executeQuery();
\n\n

2. Cross-Site Scripting (XSS)

\n

Si muestra datos del usuario en HTML sin escape, un atacante puede inyectar código JavaScript.

\n

Código vulnerable (JSP):

\n
<%= request.getParameter("message") %>
\n

Protección: escape la salida usando bibliotecas (por ejemplo, OWASP Java Encoder) o use motores de plantillas con escape automático (Thymeleaf, JSP con JSTL).

\n
<c:out value="${message}" />
\n\n

3. Deserialización insegura

\n

La deserialización en Java puede provocar ejecución remota de código (RCE) si un atacante envía un flujo de bytes especialmente diseñado.

\n

Mala práctica:

\n
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());\nObject obj = ois.readObject(); // se puede restaurar cualquier cosa
\n

Recomendaciones:

\n
    \n
  • Nunca deserialice datos de fuentes no confiables.
  • \n
  • Use listas blancas de clases (look-ahead object input stream).
  • \n
  • Considere alternativas (JSON, Protobuf).
  • \n
\n\n

4. Inyección de comandos del sistema (Command Injection)

\n

Si su aplicación ejecuta comandos del sistema con datos del usuario, es posible la inyección.

\n

Código peligroso:

\n
Runtime.getRuntime().exec("ping " + userInput); // userInput = 127.0.0.1; rm -rf /
\n

Protección: evite llamar a comandos shell, use bibliotecas Java integradas. Si la llamada es inevitable, valide los datos de entrada con una lista blanca estricta.

\n\n

5. Deficiencias en autenticación y gestión de sesiones

\n

Una protección de sesión débil es un problema común. Por ejemplo, el uso de identificadores de sesión predecibles o el almacenamiento de contraseñas en texto plano.

\n
    \n
  • Genere IDs de sesión con SecureRandom.
  • \n
  • Use hashing moderno (bcrypt, scrypt, Argon2) para contraseñas.
  • \n
  • Establezca tiempos de espera de sesión y las banderas HttpOnly/Secure para cookies.
  • \n
\n\n

6. Configuración insegura (Security Misconfiguration)

\n

Modos de depuración dejados activos, contraseñas predeterminadas, puertos abiertos: todo esto le da al atacante información sobre el sistema.

\n

Qué verificar en Spring Boot:

\n
    \n
  • Desactive los endpoints de Actuator en producción o protéjalos.
  • \n
  • No use spring.jpa.show-sql=true en producción.
  • \n
  • Elimine los encabezados de servidor predeterminados
  • \n

Blogs

Book Recommendations