FFlowKI ClubDas deutsche KI-MagazinBeitreten
← Alle Artikel
security19. April 20266 min Lesezeit

SQL-Injection mit Claude Code finden — DVWA und WebGoat im eigenen Lab

Ich hab DVWA und WebGoat im Docker-Lab aufgesetzt und Claude Code als SQL-Injection-Helper getestet — von trivialen Login-Bypasses bis hin zu Blind-Time-Based-Payloads. Was der Bot leistet, wo er rät, und wie man ein reproduzierbares Lab in 10 Minuten aufbaut.

Quelle: DVWA + WebGoat Lab

Worum es hier geht

SQL-Injection ist seit 25 Jahren der Klassiker im Web-Pentesting, und sie ist nicht weg. OWASP Top 10 listet sie 2026 immer noch unter "Injection" auf Platz 3. Ich sehe sie in Bug-Bounty-Reports von letzter Woche. Wer das nicht selbst geübt hat, übersieht die meisten Vektoren.

Dieser Artikel zeigt, wie du in 10 Minuten ein eigenes Lab aufsetzt (DVWA + WebGoat in Docker), und wie Claude Code als Pair-Partner dabei wirklich hilft — bzw. wo er nervt. Alles im eigenen Lab, ohne externe Systeme zu berühren.

Lab-Setup in 10 Minuten

Zwei Docker-Container, ein eigenes Netz, fertig.

# Eigenes Bridge-Netz, keine Verbindung nach außen
docker network create --internal lab-net

# DVWA (Damn Vulnerable Web Application)
docker run -d --name dvwa --network lab-net \
  -p 127.0.0.1:8080:80 vulnerables/web-dvwa

# WebGoat (Tutorial-orientiert, OWASP-Projekt)
docker run -d --name webgoat --network lab-net \
  -p 127.0.0.1:8081:8080 webgoat/goatandwolf

DVWA brauchst du noch das initiale Setup: http://127.0.0.1:8080/setup.php öffnen, "Create / Reset Database" klicken, einloggen mit admin/password, Security-Level auf low stellen für den Anfang.

WebGoat: http://127.0.0.1:8081/WebGoat öffnen, Account anlegen (rein lokal), und du landest in einer geführten Tutorial-Suite mit ~20 SQL-Injection-Lessons.

Wichtig: --internal bei docker network create verhindert dass die Container-Ports nach außen erreichbar werden. 127.0.0.1:8080:80 bindet sie nur an localhost. Das ist Lab-Hygiene — DVWA hat absichtlich kaputte Configs, das willst du nicht öffentlich.

Stufe 1 — DVWA "Low": Der Klassiker

Ziel auf der DVWA-Seite "SQL Injection": Eingabefeld "User ID", normaler Output ist "First Name: admin, Surname: admin".

Was funktioniert sofort:

1' OR '1'='1

Output: alle User der Tabelle. Das ist der UNION-loose Bypass aus 2003.

Was Claude Code dazu beigetragen hat:

Ich hab Claude den HTML-Source des Formulars gegeben und gefragt: "Was ist die offensichtlichste SQL-Injection-Payload für dieses Feld? Erklär mir warum, ich will lernen." Antwort: korrekte Erklärung, plus drei Varianten mit unterschiedlichen Quote-Escapes (', ", \').

Das ist eigentlich Wikipedia-Wissen — Claude beschleunigt den Erinnerungsprozess wenn du seit Jahren keine SQL-Injection mehr manuell gemacht hast.

Wo Claude irrt auf Stufe Low:

Bei Frage "kannst du eine Payload schreiben, die mir das Schema zeigt?" hat Claude zuerst eine MS-SQL-Syntax vorgeschlagen (SELECT name FROM sys.tables), obwohl DVWA MySQL ist. Erst nach explizitem Hinweis "DVWA nutzt MySQL" kam die korrekte INFORMATION_SCHEMA.TABLES-Variante. Lehre: Claude immer die Tech-Stack-Annahmen explizit machen.

Stufe 2 — DVWA "Medium": Erstmal Reverse Engineering

Auf "Medium" filtert DVWA Quotes raus, das einfache ' OR '1'='1 funktioniert nicht mehr.

Hier wird Claude wertvoll: Ich gab Claude den PHP-Source der Medium-Seite (DVWA zeigt den Source unter "View Source"):

$id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);
$query = "SELECT first_name, last_name FROM users WHERE user_id = $id";

Claude erkannte: "Das Filter macht nichts gegen Integer-basierte Injection — der Wert wird nicht in Quotes eingebettet. Probier 1 UNION SELECT user, password FROM users-- ohne Anführungszeichen."

Funktioniert. Das ist der Punkt wo Claude Code wirklich Zeit spart — Source-Code-Audit-Mode mit gerichteten Hypothesen.

Stufe 3 — DVWA "High": Blind Time-Based

"High" zeigt keinen Output mehr — der Server gibt immer "User exists" oder "User does not exist" zurück. Klassiker für Blind SQL Injection.

Manuelle Payload für MySQL:

1 AND IF(SUBSTRING((SELECT password FROM users LIMIT 0,1),1,1)='5', SLEEP(3), 0)

Wenn die Response 3+ Sekunden braucht, ist das erste Zeichen ein "5". Sonst weiter zum nächsten Zeichen.

Hier hab ich Claude bewusst eine Falle gestellt: "Schreib mir ein Python-Skript das diese Blind-Extraction automatisiert." Claude hat ein Skript geliefert das funktioniert hat — aber es war im Wesentlichen sqlmap mit anderem Logo. Lessons:

  • Claude Code generiert lauffähigen Blind-SQL-Extractor-Code in 2 Minuten
  • Aber das ist genau was sqlmap auch tut, und sqlmap ist getestet, gewartet und Standard
  • Mein Skript-Output: 4 Minuten für ein 32-Zeichen-Hash. sqlmap-Default: 1 Minute.

Konkrete Empfehlung: Für Blind-SQLi nutze sqlmap. Claude ist gut für die Erklärung, nicht für die Automation.

sqlmap -u "http://127.0.0.1:8080/vulnerabilities/sqli/?id=1" \
  --cookie="security=high; PHPSESSID=xxxxx" \
  --dbs --batch

WebGoat: Wo Claude wirklich glänzt

WebGoat hat 12 SQL-Injection-Lessons mit Hinweisen, Lösungen und Erklärungen. Das ist der bessere Ort zum Lernen.

Bei Lesson 9 ("String SQL Injection") gibt WebGoat dir das SQL-Statement im Hint:

SELECT * FROM employees WHERE last_name = '[INPUT]'

Ich hab Claude gefragt: "Hier ist das Template. Schreib mir 5 unterschiedliche Payloads, die alle Mitarbeiter zurückgeben — von simpel zu komplex. Für jede: Erklär den Mechanismus."

Antwort kam in 30 Sekunden mit:

  1. ' OR '1'='1 — klassisch
  2. ' OR 1=1-- — comment-bypass
  3. ' UNION SELECT NULL, NULL, NULL FROM employees-- — UNION
  4. Smith' OR last_name LIKE '%' OR last_name=' — kreativ
  5. ' OR EXISTS(SELECT * FROM employees)='1 — exotisch

Plus eine kleine Tabelle wie sich die Payloads unterscheiden in welchem DB-Engine. Genau das was ein Lerner braucht. Das ist Pair-Tutoring auf hohem Niveau.

Wo Claude Code Blödsinn produziert

Drei Anti-Pattern aus meiner Woche:

Erstens: NoSQL-Injection für SQL-Datenbanken vorgeschlagen. Bei einer DVWA-Variante fragte ich "wie injecte ich das?" ohne Tech-Stack zu nennen. Claude bot direkt MongoDB-Operator-Syntax an ({"$ne": null}). Hätte ich das blind copy-pasted, hätte ich 20 Minuten verloren.

Zweitens: Python-sqlmap-Reimplementierung. Wie oben — Claude erfindet das Rad neu wenn man es nicht stoppt. Bei Standard-Tools (sqlmap, ffuf, gobuster, sqlninja) immer fragen: "Gibt's das schon als Tool? Welches?"

Drittens: Falsche CVE-Referenzen. Bei einer WebGoat-XML-Injection-Lesson hat Claude eine CVE genannt (CVE-2018-irgendwas), die es nicht gibt. Ich hab nachgeschaut — keine Spur. Das ist die klassische LLM-Halluzination. Bei sicherheitsrelevanten Aussagen immer mit searchsploit oder NIST NVD Database verifizieren.

Mein Setup für SQL-Injection-Üben

Was ich nach der Woche behalte:

  • DVWA + WebGoat in Docker auf einem internen Bridge-Netz, port-bound auf localhost
  • Claude Code in einem isolierten Verzeichnis pro Lesson, default permission mode
  • BurpSuite Community parallel offen für Repeater und Comparer
  • sqlmap für Blind-SQLi und Mass-Extraction (kein Claude-Reimplementierung)
  • ~/labs/sqli/.claude/settings.json mit Bash(sqlmap *), Bash(curl *) allowed

Plus eine LESSONS.md im Verzeichnis, in der ich pro Lesson notiere: Was war die Lücke, welche Payload, was hätte ich nicht ohne Claude gefunden. Das ist mein eigenes Notizbuch und gleichzeitig Kontext den Claude in der nächsten Session lesen kann.

Fazit nach 30 SQL-Injection-Aufgaben

Claude Code ist auf SQL-Injection ein Tutor, kein Tool. Es erklärt brillant, generiert Payloads in Sekunden, hilft beim Source-Code-Audit. Es ist NICHT der bessere sqlmap, und für echte Bug-Bounty-Hunts bleibt das Standard-Toolset (sqlmap, BurpSuite, ffuf) überlegen.

Wenn du SQL-Injection lernen willst: Lab aufsetzen, WebGoat parallel zu Claude öffnen, jede Lesson erst manuell versuchen, dann Claude nach Erklärung fragen. So baust du die Intuition auf, die später die richtigen Lookups in den Tools triggert.

Wie wir diesen Artikel geprüft haben

  • Tests durchgeführt am: 2026-04-15
  • Hardware: Hetzner CX22, Docker 27, isoliertes Bridge-Netz
  • Software-Versionen: DVWA 1.10, WebGoat 2025.4, sqlmap 1.8.10, BurpSuite Community 2026.4
  • KI-Unterstützung: Claude Code 2.4.1 nur für Erklärung und Payload-Variation
  • Sponsor/Affiliate: keines

Rechtlicher Hinweis

Die hier gezeigten Techniken wurden ausschließlich in einem der folgenden Kontexte getestet:

  • Eigenes Lab / eigene Hardware (DVWA + WebGoat in Docker auf eigenem Tenant, internes Netz)
  • Capture-The-Flag-Umgebung (HackTheBox, TryHackMe, OverTheWire)
  • Schulungsumgebung (DVWA, Juice Shop, WebGoat, HackerLab)
  • Autorisierter Pentest mit schriftlichem Auftrag
  • Bug-Bounty-Programm im dokumentierten Scope (HackerOne, Intigriti, YesWeHack)

Die Anwendung dieser Techniken gegen Systeme Dritter ohne ausdrückliche schriftliche Erlaubnis ist in Deutschland nach §§ 202a, 202b, 202c, 303a, 303b StGB strafbar. Wir übernehmen keine Haftung für Missbrauch.

Du bist Pentester, Bug-Bounty-Hunter oder CTF-Spieler? Komm in die Zone "Hacking & Security" im Discord — da diskutieren wir Techniken und teilen Lab-Setups.

Wie wir diesen Artikel geprüft haben

Tests am
2026-04-15, isoliertes Docker-Netz auf eigenem Hetzner-Tenant
Hardware
Hetzner CX22, Docker 27, Kali Linux Browser-VM
Software
DVWA 1.10, WebGoat 2025.4, Claude Code 2.4.1, BurpSuite Community 2026.4, sqlmap 1.8.10
KI-Einsatz
Claude Code wurde nur für Payload-Generierung und Output-Interpretation genutzt. Kein autonomer Scan gegen externe Systeme.
Weiterlesen

Aus dem Magazin