Erratbares CAPTCHA
Beschreibung
Erratbares CAPTCHA ist eine Schwachstelle, bei der Software eine CAPTCHA-Challenge verwendet, die von nicht-menschlichen Akteuren erraten oder automatisch erkannt werden kann. Ein effektives CAPTCHA sollte für Computer schwer zu lösen sein, während es für Menschen einfach bleibt, aber viele Implementierungen erfüllen diese Anforderung nicht. Zu den Schwächen gehören ungenügende visuelle oder akustische Verzerrung, Verwendung erkennbarer Formate wie mathematische Probleme, begrenzte Antwortmengen (Geburtsjahre, Sportteams), allgemeine Wissensfragen mit Antworten in Datenbanken und Metadaten, die den CAPTCHA-Inhalt preisgeben (wie Dateinamen, die die Antwort enthalten). Diese Mängel ermöglichen es automatisierten Angreifern, den Schutzmechanismus vollständig zu umgehen.
Risiko
Wenn CAPTCHAs umgangen werden können, führen automatisierte Angreifer Aktionen mit Raten aus, die weit über menschliche Fähigkeiten hinausgehen. Dies ermöglicht Spam-Kampagnen, Brute-Force-Angriffe gegen Authentifizierung, Massenkontoerstellung, automatisierte Abstimmungs- oder Bewertungsmanipulation sowie Ticket-Scalping oder Bestandshortung. Dienste, die sich auf CAPTCHAs verlassen, um automatisierten Missbrauch zu begrenzen, werden anfällig für genau die Angriffe, die sie verhindern sollten. Das falsche Sicherheitsgefühl ist besonders gefährlich, da Organisationen möglicherweise keine zusätzlichen Schutzmassnahmen implementieren, weil sie glauben, dass das CAPTCHA ausreichenden Schutz bietet.
Lösung
Verwenden Sie bewährte CAPTCHA-Dienste von renommierten Anbietern, die maschinelles Lernen einsetzen, um die Challenge-Schwierigkeit kontinuierlich zu verbessern. Implementieren Sie starke Verzerrung, die die optische Zeichenerkennung erschwert, während sie für Menschen lesbar bleibt. Vermeiden Sie vorhersehbare Formate wie einfache Matheaufgaben, Trivia-Fragen oder begrenzte Antwortpools. Stellen Sie sicher, dass die CAPTCHA-Implementierung keine Antworten durch Metadaten, vorhersehbare Dateinamen oder schwaches Hashing preisgibt. Erwägen Sie verhaltensbasierte Alternativen wie reCAPTCHA v3, das Benutzerverhalten bewertet anstatt explizite Challenges. Implementieren Sie Rate-Limiting und andere Verteidigungen als Defense-in-Depth-Maßnahmen, anstatt sich ausschließlich auf CAPTCHAs zu verlassen. Testen Sie regelmäßig die CAPTCHA-Wirksamkeit gegen moderne OCR- und Machine-Learning-Tools.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Zugriffskontrolle | Bereich: Zugriffskontrolle Umgehung des Schutzmechanismus - Angreifer können den CAPTCHA-Schutz umgehen, um automatisierte Aktionen mit übermenschlichen Raten auszuführen. |
| Zugriffskontrolle | Bereich: Zugriffskontrolle Privilegien erlangen oder Identität annehmen - Automatisierte Systeme können gefälschte Konten erstellen oder Authentifizierungsversuchslimits umgehen. |
| Integrität | Bereich: Integrität Sonstiges - Massenmanipulation von Abstimmungen, Bewertungen oder anderen benutzergenerierten Inhalten wird möglich. |
Beispielcode
Anfälliger Code
# Anfällig: CAPTCHA verwendet einfache Mathematik, die leicht analysiert werden kann
import random
def vulnerable_generate_captcha():
# Anfällig: Einfache Matheausdrücke sind trivial lösbar
num1 = random.randint(1, 10)
num2 = random.randint(1, 10)
operator = random.choice(['+', '-', '*'])
question = f"Was ist {num1} {operator} {num2}?"
answer = eval(f"{num1}{operator}{num2}")
return question, str(answer)
# Angreifer kann leicht parsen und lösen: "Was ist 5 + 3?" -> 8
// Anfällig: CAPTCHA-Antwort im Dateinamen offenbart
<?php
function vulnerable_generate_captcha() {
$words = ['apfel', 'banane', 'kirsche', 'hund', 'elefant'];
$word = $words[array_rand($words)];
// Anfällig: Antwort ist im Dateinamen!
$image_path = "/captcha/images/{$word}.png";
return [
'image' => $image_path, // Angreifer sieht: /captcha/images/apfel.png
'answer' => $word
];
}
?>
// Anfällig: Begrenzter Antwortpool macht Raten einfach
function vulnerableGenerateCaptcha() {
// Anfällig: Nur 12 mögliche Antworten - 8,3% Chance auf richtige Vermutung
const months = [
'Januar', 'Februar', 'März', 'April',
'Mai', 'Juni', 'Juli', 'August',
'September', 'Oktober', 'November', 'Dezember'
];
const question = "Wählen Sie Ihren Geburtsmonat:";
const correctMonth = months[Math.floor(Math.random() * 12)];
return { question, answer: correctMonth, options: months };
}
Korrigierter Code
# Korrigiert: Verwenden Sie einen renommierten CAPTCHA-Dienst
import requests
def fixed_generate_captcha():
# Korrigiert: Google reCAPTCHA oder ähnlichen Dienst verwenden
# Dies gibt ein Token zurück, das serverseitig verifiziert werden muss
return {
'site_key': RECAPTCHA_SITE_KEY,
'type': 'invisible' # oder 'checkbox' oder 'v3'
}
def fixed_verify_captcha(token, remote_ip):
# Serverseitige Verifizierung
response = requests.post(
'https://www.google.com/recaptcha/api/siteverify',
data={
'secret': RECAPTCHA_SECRET_KEY,
'response': token,
'remoteip': remote_ip
}
)
result = response.json()
return result.get('success', False) and result.get('score', 0) >= 0.5
// Korrigiert: Stärke visuelle Verzerrung mit zufälligen Elementen
<?php
function fixed_generate_captcha() {
$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789';
$answer = '';
for ($i = 0; $i < 6; $i++) {
$answer .= $chars[random_int(0, strlen($chars) - 1)];
}
// Verzerrtes Bild erstellen
$image = imagecreatetruecolor(200, 80);
$bg = imagecolorallocate($image, 255, 255, 255);
imagefill($image, 0, 0, $bg);
// Störlinien hinzufügen
for ($i = 0; $i < 10; $i++) {
$color = imagecolorallocate($image, rand(100, 200), rand(100, 200), rand(100, 200));
imageline($image, rand(0, 200), rand(0, 80), rand(0, 200), rand(0, 80), $color);
}
// Jeden Buchstaben mit zufälliger Rotation und Position zeichnen
for ($i = 0; $i < strlen($answer); $i++) {
$color = imagecolorallocate($image, rand(0, 100), rand(0, 100), rand(0, 100));
$angle = rand(-30, 30);
$x = 20 + ($i * 28) + rand(-5, 5);
$y = 50 + rand(-10, 10);
imagettftext($image, rand(20, 28), $angle, $x, $y, $color, '/fonts/arial.ttf', $answer[$i]);
}
// Antwort in Sitzung speichern, nicht im Dateinamen
$token = bin2hex(random_bytes(16));
$_SESSION['captcha'][$token] = [
'answer' => strtolower($answer),
'expires' => time() + 300
];
ob_start();
imagepng($image);
$data = ob_get_clean();
imagedestroy($image);
return [
'token' => $token,
'image' => 'data:image/png;base64,' . base64_encode($data)
];
}
?>
CVE-Beispiele
- CVE-2022-4036: Eine Terminbuchungsanwendung verwendete schwaches Hashing (CWE-328) für die CAPTCHA-Generierung, wodurch die CAPTCHA-Antwort vorhersehbar und von Angreifern leicht erratbar war.
Verwandte CWEs
- CWE-863: Fehlerhafte Autorisierung (Eltern)
- CWE-1390: Schwache Authentifizierung (Eltern)
- CWE-330: Verwendung ungenügend zufälliger Werte (kann vorangehen)
- CWE-328: Verwendung von schwachem Hash (verwandt)
Referenzen
- MITRE Corporation. "CWE-804: Guessable CAPTCHA." https://cwe.mitre.org/data/definitions/804.html
- OWASP. "Testing for CAPTCHA (WSTG-ATHN-08)." OWASP Web Security Testing Guide.
- Google. "reCAPTCHA Documentation." https://developers.google.com/recaptcha