Sécurité des applications Java : top 10 des vulnérabilités pour débutants
\nJava reste l'un des langages les plus populaires pour créer des applications d'entreprise et web. Cependant, même une plateforme fiable ne garantit pas la sécurité du code. Selon OWASP, la plupart des piratages sont dus à des erreurs de développeurs, et non à des vulnérabilités dans la JVM. Dans cet article, nous allons passer en revue le top 10 des vulnérabilités des applications Java que tout développeur débutant doit connaître. Vous obtiendrez non seulement des connaissances théoriques, mais aussi des exemples pratiques de code avec des explications sur la façon d'éviter les erreurs dangereuses.
\n\n1. Injections SQL (SQL Injection)
\nLa menace la plus courante. Un attaquant peut exécuter une requête SQL arbitraire si vous concaténez des chaînes directement.
\nMauvais exemple (code vulnérable) :
\nString query = "SELECT * FROM users WHERE username = '" + userName + "' AND pass = '" + password + "'";\nStatement stmt = connection.createStatement();\nResultSet rs = stmt.executeQuery(query);\nSolution : utilisez PreparedStatement avec des requêtes paramétrées.
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\n2. Scripting intersite (XSS)
\nSi vous affichez des données utilisateur dans du HTML sans échappement, un attaquant peut injecter du code JavaScript.
\nCode vulnérable (JSP) :
\n<%= request.getParameter("message") %>\nProtection : échappez la sortie à l'aide de bibliothèques (par exemple, OWASP Java Encoder) ou utilisez des moteurs de templates avec auto-échappement (Thymeleaf, JSP avec JSTL).
\n<c:out value="${message}" />\n\n3. Désérialisation non sécurisée
\nLa désérialisation Java peut conduire à une exécution de code à distance (RCE) si un attaquant transmet un flux d'octets spécialement conçu.
\nMauvaise pratique :
\nObjectInputStream ois = new ObjectInputStream(socket.getInputStream());\nObject obj = ois.readObject(); // n'importe quoi peut être reconstruit\nRecommandations :
\n- \n
- Ne désérialisez jamais des données provenant de sources non fiables. \n
- Utilisez des listes blanches de classes (look-ahead object input stream). \n
- Envisagez des alternatives (JSON, Protobuf). \n
4. Injection de commandes système (Command Injection)
\nSi votre application appelle des commandes système avec des données utilisateur, une injection est possible.
\nCode dangereux :
\nRuntime.getRuntime().exec("ping " + userInput); // userInput = 127.0.0.1; rm -rf /\nProtection : évitez d'appeler des commandes shell, utilisez des bibliothèques Java intégrées. Si l'appel est inévitable, validez les données d'entrée avec une liste blanche stricte.
\n\n5. Défauts d'authentification et de gestion des sessions
\nUne faible protection des sessions est un problème fréquent. Par exemple, l'utilisation d'identifiants de session prévisibles ou le stockage de mots de passe en clair.
\n- \n
- Générez des ID de session avec
SecureRandom. \n - Utilisez des hachages modernes (bcrypt, scrypt, Argon2) pour les mots de passe. \n
- Définissez des délais d'expiration de session et les flags
HttpOnly/Securepour les cookies. \n
6. Mauvaise configuration de sécurité (Security Misconfiguration)
\nLes modes de débogage laissés actifs, les mots de passe par défaut, les ports ouverts — tout cela donne à un attaquant des informations sur le système.
\nQue vérifier dans Spring Boot :
\n- \n
- Désactivez les endpoints Actuator en production ou protégez-les. \n
- N'utilisez pas
spring.jpa.show-sql=trueen production. \n - Supprimez les en-têtes de serveur par défaut