Sicherheit von Java-Anwendungen: Top-10-Schwachstellen für Anfänger
\nJava bleibt eine der beliebtesten Sprachen für die Entwicklung von Unternehmens- und Webanwendungen. Allerdings garantiert selbst eine zuverlässige Plattform keine Codesicherheit. Laut OWASP sind die meisten Hacks auf Entwicklerfehler zurückzuführen, nicht auf Schwachstellen in der JVM. In diesem Artikel behandeln wir die Top-10-Schwachstellen von Java-Anwendungen, die jeder angehende Entwickler kennen sollte. Sie erhalten nicht nur theoretisches Wissen, sondern auch praktische Codebeispiele mit Erklärungen, wie Sie gefährliche Fehler vermeiden.
\n\n1. SQL-Injection
\nDie häufigste Bedrohung. Ein Angreifer kann eine beliebige SQL-Abfrage ausführen, wenn Sie Zeichenfolgen direkt verketten.
\nSchlechtes Beispiel (anfälliger Code):
\nString query = "SELECT * FROM users WHERE username = '" + userName + "' AND pass = '" + password + "'";\nStatement stmt = connection.createStatement();\nResultSet rs = stmt.executeQuery(query);\nLösung: Verwenden Sie PreparedStatement mit parametrisierten Abfragen.
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. Cross-Site-Scripting (XSS)
\nWenn Sie Benutzerdaten ohne Escape in HTML ausgeben, kann ein Angreifer JavaScript-Code einschleusen.
\nAnfälliger Code (JSP):
\n<%= request.getParameter("message") %>\nSchutz: Escapen Sie die Ausgabe mit Bibliotheken (z. B. OWASP Java Encoder) oder verwenden Sie Template-Engines mit automatischem Escaping (Thymeleaf, JSP mit JSTL).
\n<c:out value="${message}" />\n\n3. Unsichere Deserialisierung
\nJava-Deserialisierung kann zu Remote Code Execution (RCE) führen, wenn ein Angreifer einen speziell präparierten Byte-Stream übergibt.
\nSchlechte Praxis:
\nObjectInputStream ois = new ObjectInputStream(socket.getInputStream());\nObject obj = ois.readObject(); // alles kann wiederhergestellt werden\nEmpfehlungen:
\n- \n
- Deserialisieren Sie niemals Daten aus nicht vertrauenswürdigen Quellen. \n
- Verwenden Sie Whitelists für Klassen (Look-Ahead Object Input Stream). \n
- Ziehen Sie Alternativen in Betracht (JSON, Protobuf). \n
4. OS-Kommando-Injection (Command Injection)
\nWenn Ihre Anwendung Systembefehle mit Benutzerdaten aufruft, ist eine Injection möglich.
\nGefährlicher Code:
\nRuntime.getRuntime().exec("ping " + userInput); // userInput = 127.0.0.1; rm -rf /\nSchutz: Vermeiden Sie den Aufruf von Shell-Befehlen, verwenden Sie integrierte Java-Bibliotheken. Wenn der Aufruf unvermeidbar ist – validieren Sie die Eingabedaten mit einer strengen Whitelist.
\n\n5. Mängel bei der Authentifizierung und Sitzungsverwaltung
\nSchwacher Sitzungsschutz ist ein häufiges Problem. Zum Beispiel die Verwendung vorhersagbarer Sitzungs-IDs oder die Speicherung von Passwörtern im Klartext.
\n- \n
- Generieren Sie Sitzungs-IDs mit
SecureRandom. \n - Verwenden Sie moderne Hash-Verfahren (bcrypt, scrypt, Argon2) für Passwörter. \n
- Legen Sie Sitzungs-Timeout und die Flags
HttpOnly/Securefür Cookies fest. \n
6. Unsichere Konfiguration (Security Misconfiguration)
\nZurückgelassene Debug-Modi, Standard-Passwörter, offene Ports – all das gibt einem Angreifer Informationen über das System.
\nWas Sie in Spring Boot überprüfen sollten:
\n- \n
- Deaktivieren Sie Actuator-Endpunkte in der Produktion oder schützen Sie sie. \n
- Verwenden Sie
spring.jpa.show-sql=truenicht in der Produktion. \n - Entfernen Sie Standard-Server-Header