Lektion 1 von 9
Wie Angreifer denken: Sicherheitsdenken und OWASP Top 10
Du verstehst, warum der Server keiner Eingabe trauen darf, kennst die OWASP Top 10:2025 mit Beispielen und beschreibst jede Lücke mit Beobachtung, Ursache, Fix und Nachweis.
Worum es geht
Fabienne ist im dritten Lehrjahr bei der Bödelisoft AG in Interlaken. Das neue Gästeportal ist fast fertig: Gäste melden sich an, sehen ihre Buchungen und laden Rechnungen als PDF herunter. In drei Wochen ist der Go-live. Ihr Teamleiter sagt: "Bevor wir live gehen, will ich wissen, ob da jemand fremde Rechnungen sehen oder Konten übernehmen kann. Schau dir das an."
Am ersten Tag sucht ein Testgast namens D'Amico nach seiner Buchung und erhält eine Fehlermeldung mit einem Stück SQL darin. Für Fabienne ist das ein Alarmsignal: Wenn ein einfacher Apostroph die Datenbankabfrage durcheinanderbringt, dann landet Text aus dem Eingabefeld direkt im SQL-Befehl. Und was ein harmloser Name versehentlich kaputt macht, kann jemand anderes absichtlich ausnutzen.
Die meisten erfolgreichen Angriffe auf Unternehmen laufen nicht über exotische Netzwerktricks, sondern über gewöhnliche Fehler in Applikationen: ungeprüfte Eingaben, schwache Logins, fehlende Berechtigungsprüfungen. Diese Fehler entstehen beim Programmieren, also lassen sie sich auch dort verhindern.
In dieser Lektion lernst du die Denkweise, mit der du ab jetzt jede Funktion anschaust, die aktuelle Liste der wichtigsten Risiken (OWASP Top 10:2025) und eine Struktur, mit der du jede Schwachstelle sauber beschreibst. Im ersten Code-Labor schreibst du eine serverseitige Eingabeprüfung.
Drei Grundideen, die alles andere tragen
Jede Eingabe kommt aus fremder Hand
Stell dir die Rezeption eines Hotels vor. Ein Gast reicht einen Zettel über die Theke: "Zimmer 214, bitte Rechnung an diese Adresse." Eine gute Rezeptionistin prüft zuerst, ob der Gast wirklich in Zimmer 214 wohnt.
Bei einer Webapplikation ist der Browser dieser Zettel. Alles, was vom Browser kommt, kann die Person davor verändern: Formularfelder, versteckte Felder, Cookies, Header, URL-Parameter, JSON im Body. Mit Entwicklertools oder einem Proxy wie Burp Suite dauert das Sekunden. Eine Prüfung im JavaScript des Frontends ist darum Komfort für ehrliche Benutzer, aber kein Schutz. Geschützt ist nur, was der Server prüft.
Die Linie, an der Daten aus einem weniger vertrauenswürdigen Bereich in einen vertrauenswürdigeren wechseln, heisst Vertrauensgrenze. Die wichtigste liegt zwischen Browser und API. Aber auch Daten aus Partnerschnittstellen oder hochgeladenen Dateien überqueren solche Grenzen.
Schutzziele: Was kann kaputtgehen?
Sicherheit heisst konkret, drei Dinge zu schützen. Die Abkürzung CIA kommt aus dem Englischen (Confidentiality, Integrity, Availability).
| Schutzziel | Frage | Beispiel im Gästeportal |
|---|---|---|
| Vertraulichkeit | Sieht nur, wer darf? | Rechnung von Gast A ist für Gast B unsichtbar |
| Integrität | Ist nur verändert, was verändert werden darf? | Niemand kann den Preis einer Buchung manipulieren |
| Verfügbarkeit | Funktioniert es, wenn es gebraucht wird? | Das Login bricht bei vielen Anfragen nicht zusammen |
Dazu kommt die Nachvollziehbarkeit: Wer hat wann was getan? Ohne Protokoll bleibt ein Vorfall unerkannt.
Mehrere Schichten statt einer Mauer
Kein Schutz ist perfekt. Darum baust du mehrere Schichten (Defense in Depth): Eingaben prüfen, Abfragen parametrisieren, Ausgaben kodieren, minimale Rechte, Protokollierung. Dazu kommen Secure by Default (die sichere Einstellung ist die Voreinstellung) und Fail Closed (bei einem Fehler wird der Zugriff verweigert, nicht erlaubt).
Welche Aussagen zu Eingaben und Prüfungen im Gästeportal stimmen?
Wähle alle zutreffenden Antworten.
Die OWASP Top 10:2025
Das Open Worldwide Application Security Project (OWASP) ist eine gemeinnützige Organisation, die freie Werkzeuge und Leitfäden zur Applikationssicherheit herausgibt. Bekannt sind vor allem die OWASP Top 10, die zehn wichtigsten Risikokategorien für Webapplikationen, ermittelt aus Prüfdaten vieler Applikationen und einer Umfrage unter Fachleuten. Die aktuelle Fassung ist die OWASP Top 10:2025.
| Nr. | Kategorie | Kurz erklärt | Beispiel im Gästeportal |
|---|---|---|---|
| A01 | Broken Access Control | Fehlende oder falsche Berechtigungsprüfung | Rechnung 4712 eines fremden Gastes abrufbar |
| A02 | Security Misconfiguration | Unsichere Einstellungen, Standardwerte, unnötige Funktionen | Debug-Modus mit Stacktraces in Produktion |
| A03 | Software Supply Chain Failures | Probleme in Bibliotheken, Build und Auslieferung | PDF-Bibliothek mit bekannter kritischer Lücke |
| A04 | Cryptographic Failures | Fehlende oder schwache Kryptografie | Passwörter als SHA-256 ohne Salt |
| A05 | Injection | Eingaben werden als Befehl interpretiert | Suche baut SQL per String-Verkettung |
| A06 | Insecure Design | Sicherheit im Entwurf vergessen | Entwurf übernimmt den Preis aus der Buchungsanfrage statt ihn serverseitig zu berechnen |
| A07 | Authentication Failures | Schwächen bei Anmeldung und Sessions | Login ohne Schutz gegen Durchprobieren |
| A08 | Software or Data Integrity Failures | Ungeprüfte Updates, Daten oder Objekte | Update-Paket ohne Signaturprüfung eingespielt |
| A09 | Security Logging and Alerting Failures | Angriffe werden nicht erkannt | 2000 fehlgeschlagene Logins ohne Alarm |
| A10 | Mishandling of Exceptional Conditions | Fehler und Ausnahmen falsch behandelt | Bei Datenbankfehler wird der Zugriff erlaubt |
Gegenüber der Fassung von 2021 hat sich einiges verschoben. Server-Side Request Forgery (SSRF), 2021 noch eine eigene Kategorie, gehört jetzt zu A01. Die Kategorie zu veralteten Komponenten wurde zu A03 erweitert und umfasst die ganze Lieferkette der Software. Neu ist A10: falsch behandelte Fehlerfälle, zum Beispiel eine Prüfung, die bei einer Ausnahme "offen" weiterläuft.
Ordne jedem Fund aus dem Gästeportal die passende Kategorie der OWASP Top 10:2025 zu.
Angriff, Ursache, Fix: die Struktur für jede Lücke
Wenn du eine Schwachstelle beschreibst, im Team, im Bericht oder in der Prüfung, überzeugt eine klare Struktur mit vier Teilen:
- Beobachtung und Nachweis: Was passiert, und wie kann man es reproduzieren?
- Ursache im Code: Welche Zeile, welches Muster ist schuld?
- Fix: Was änderst du, und warum wirkt das?
- Nachweis des Fixes: Mit welchem Test zeigst du, dass die Lücke zu ist und zu bleibt?
Am Beispiel D'Amico sieht das so aus:
// Ursache: Die Eingabe wird in den SQL-Text geklebt
const sql = "SELECT * FROM buchung WHERE nachname = '" + req.query.name + "'";
// Mit D'Amico entsteht: ... WHERE nachname = 'D'Amico' (Syntaxfehler)
// Fix: Platzhalter, der Wert geht getrennt an die Datenbank
const [zeilen] = await pool.execute(
"SELECT * FROM buchung WHERE nachname = ?",
[req.query.name]
);Ordne die Lücke zusätzlich einer OWASP-Kategorie zu, hier A05 Injection. Das zeigt, dass du ein Muster erkennst. Der Nachweis des Fixes ist ein automatisierter Test mit D'Amico und typischen bösartigen Eingaben.
Für den D'Amico-Fund liegen vier Ticket-Einträge vor. Welcher beschreibt die Lücke so, dass das Team sie verstehen, beheben und den Fix prüfen kann?
Schritt für Schritt: eine Profiländerung serverseitig prüfen
Gäste können ihr Profil ändern, das Frontend schickt JSON an PATCH /api/profil. Fabienne baut die Prüfung auf dem Server. Eingabevalidierung ist nicht der Hauptschutz gegen Injection oder XSS (das sind parametrisierte Abfragen und Output-Encoding, Lektionen 3 und 4), aber die erste Schicht: Was nicht in die erwartete Form passt, kommt nicht weiter.
Schritt 1: Erlaubte Felder festlegen (Allowlist). Nur vorname, nachname, telefon und sprache dürfen geändert werden. Ein Feld wie rolle oder rabatt im JSON wird abgelehnt. Sonst könnte jemand mit "rolle": "admin" sein eigenes Konto aufwerten (das nennt man Mass Assignment).
Schritt 2: Typ prüfen. Ein Name muss ein String sein, keine Zahl, kein Array, kein Objekt.
Schritt 3: Form und Länge prüfen. Beschreibe, was erlaubt ist, statt aufzuzählen, was verboten ist. Ein Name besteht aus Buchstaben (auch é, ü, ñ), Leerzeichen, Bindestrich und Apostroph, höchstens 50 Zeichen. Eine Telefonnummer im Format +41 und neun Ziffern.
Schritt 4: Wertebereich prüfen. Die Sprache ist genau einer der Werte de, fr, it, en.
Schritt 5: Fehler sammeln und knapp antworten. Der Server antwortet mit Status 400 und nennt die fehlerhaften Felder, aber keine internen Details.
// profilPruefung.js Serverseitige Prüfung für PATCH /api/profil
const ERLAUBTE_FELDER = ["vorname", "nachname", "telefon", "sprache"];
const NAME = /^[\p{L}][\p{L} '\-]{0,49}$/u; // Buchstaben, Leerzeichen, ' und -
const TELEFON = /^\+41\d{9}$/; // z.B. +41791234567
const SPRACHEN = ["de", "fr", "it", "en"];
function pruefeProfil(daten) {
const fehler = [];
// Schritt 1: unbekannte Felder ablehnen (Schutz gegen Mass Assignment)
for (const feld of Object.keys(daten)) {
if (!ERLAUBTE_FELDER.includes(feld)) fehler.push(feld);
}
// Schritt 2 und 3: Pflichtfelder mit Typ und Form
for (const feld of ["vorname", "nachname"]) {
const wert = daten[feld];
if (typeof wert !== "string" || !NAME.test(wert.trim())) fehler.push(feld);
}
// Telefon ist optional, aber wenn vorhanden, dann korrekt
if (daten.telefon !== undefined &&
(typeof daten.telefon !== "string" || !TELEFON.test(daten.telefon))) {
fehler.push("telefon");
}
// Schritt 4: Wertebereich
if (!SPRACHEN.includes(daten.sprache)) fehler.push("sprache");
// Schritt 5: Ergebnis
return { ok: fehler.length === 0, fehler };
}
console.log(pruefeProfil({ vorname: "Luca", nachname: "D'Amico", sprache: "it" }));
// { ok: true, fehler: [] }
console.log(pruefeProfil({ vorname: "Luca", nachname: "D'Amico", sprache: "it", rolle: "admin" }));
// { ok: false, fehler: [ 'rolle' ] }Schritt 6: Gut- und Schlechtfälle testen. D'Amico und Müller-Lüdenscheidt müssen durch. Ein leerer Name, eine Zahl, 51 Zeichen, <b>Test</b> und ein Feld rolle müssen scheitern.
Code-Labor: eine Buchungsanfrage serverseitig prüfen
Gäste können im Portal Änderungswünsche zu einer Buchung schicken. Die API erhält dafür JSON. Schreibe pruefeBuchungsanfrage(daten). Sie gibt { ok, fehler } zurück, wobei fehler die Namen aller Felder enthält, die nicht stimmen (leere Liste = alles in Ordnung).
| Feld | Regel |
|---|---|
buchungsnummer | Pflicht, exakt die Form BK- + 4 Ziffern + - + 6 Ziffern, z.B. BK-2026-004711 |
anzahlGaeste | Pflicht, ganze Zahl vom Typ number von 1 bis 6 |
anreise, abreise | Pflicht, gültiges Datum im Format JJJJ-MM-TT (Hilfsfunktion ist vorhanden). Liegt die Abreise nicht nach der Anreise, ist abreise fehlerhaft |
bemerkung | optional. Wenn vorhanden: Text mit höchstens 500 Zeichen |
| jedes andere Feld | nicht erlaubt, der Feldname kommt in fehler (Schutz gegen Mass Assignment) |
Denk an die Allowlist-Idee: Beschreibe, was erlaubt ist, und lehne alles andere ab.
Typische Fehler
- Nur im Frontend validieren.
requiredoder eine JavaScript-Prüfung lässt sich mit einem Klick umgehen. Korrektur: Jede Regel gilt zusätzlich auf dem Server. - Blocklist statt Allowlist. Ein Filter, der
<script>entfernt, übersieht<SCRIPT>,<img onerror=...>und hundert andere Varianten. Korrektur: beschreiben, was erlaubt ist, und alles andere ablehnen. - Detaillierte Fehlermeldungen an Benutzer. Stacktraces, SQL-Texte oder Pfade verraten einem Angreifer, wie das System gebaut ist (A02, A10). Korrektur: generische Meldung an den Benutzer, Details ins Protokoll.
- Objekte ungefiltert übernehmen.
Object.assign(benutzer, req.body)übernimmt auchrolleoderistAdmin. Korrektur: nur erlaubte Felder einzeln übernehmen. - Sicherheit erst am Schluss. "Vor dem Go-live machen wir noch einen Pentest" findet Fehler, wenn sie am teuersten sind. Korrektur: Sicherheitsfragen ab dem Entwurf stellen, mit Bedrohungsanalyse (Lektion 2).
Zusammenfassung
- Alles, was vom Browser kommt, kann verändert sein. Geschützt ist nur, was der Server prüft.
- Vertraulichkeit, Integrität und Verfügbarkeit sind die Schutzziele, Nachvollziehbarkeit ergänzt sie.
- Defense in Depth, Secure by Default und Fail Closed sind die Grundprinzipien.
- Die OWASP Top 10:2025 reichen von A01 Broken Access Control bis A10 Mishandling of Exceptional Conditions. Ordne jeden Fund einer Kategorie zu.
- Beschreibe jede Lücke mit Beobachtung, Ursache, Fix und Nachweis.
- Eingabevalidierung arbeitet mit Allowlists, prüft Typ, Form, Länge und Wertebereich und lehnt unbekannte Felder ab.
- Teste Angriffe nur in eigenen oder ausdrücklich freigegebenen Umgebungen.
Mit deiner eigenen KI vertiefen
Kopiere einen Prompt in Claude, ChatGPT oder Claude Code. Er macht die KI zur Lernbegleitung statt zum Lösungsautomaten.
OWASP-Kategorien sokratisch üben Chat-KI
Du übst, Schwachstellen den OWASP Top 10:2025 zuzuordnen und die Ursache zu benennen. Die KI stellt Fragen und gibt Hinweise, statt die Antworten vorzusagen.