Praktyczne ćwiczenie: Testowanie i mitigacja
🎯 Cel ćwiczenia
Przetestować aplikację pod kątem błędów kryptograficznych:
- przechowywania haseł w plaintext,
- akceptacji JWT bez podpisu,
- braku HTTPS,
- twardo zakodowanych kluczy szyfrujących.
🧪 Scenariusz testowy 1: JWT bez podpisu (alg: none
)
Aplikacja: REST API z JWT (symulowane lub Juice Shop + Burp Suite)
Krok 1: Przechwyć token JWT
Zaloguj się jako zwykły użytkownik i zapisz token z nagłówka Authorization
.
Krok 2: Zmień algorytm
Za pomocą jwt.io lub Burp Suite Decoder zmodyfikuj nagłówek JWT:
{
"alg": "none",
"typ": "JWT"
}
Dodaj dowolny payload, np.:
{
"username": "admin",
"role": "admin"
}
Usuń podpis i wyślij żądanie z takim tokenem.
➡️ Jeśli serwer go akceptuje: krytyczna luka.
🛠️ Mitigacja (Node.js example)
jwt.verify(token, secret, { algorithms: ['HS256'] });
🧪 Scenariusz testowy 2: Hasła w plaintext
Aplikacja: Dump bazy danych z tabelą users
Krok 1: Zbadaj kolumnę password
Jeśli zawartość to np. admin123
, a nie hash (np. $2b$12$...
) – hasła są przechowywane w formie jawnej.
🛠️ Mitigacja – Hashowanie haseł
const bcrypt = require('bcrypt');
const hash = await bcrypt.hash('admin123', 12);
🧪 Scenariusz testowy 3: Brak HTTPS
Krok 1: Otwórz aplikację bez HTTPS
Użyj curl
:
curl -v http://example.com/login
Jeśli przesyłane są dane logowania – aplikacja narażona na MITM.
🛠️ Mitigacja
- Wymusić HTTPS w aplikacji i serwerze.
- Dodać
HSTS
w nagłówkach:
Strict-Transport-Security: max-age=31536000; includeSubDomains
🧪 Scenariusz testowy 4: Twardo zakodowany klucz szyfrujący
Aplikacja: JavaScript w frontendzie
Krok 1: Znajdź hardcoded klucz
const key = "my-secret-key"; // ❌ zły przykład
➡️ Atakujący może go użyć do deszyfrowania danych użytkownika.
✅ Zadania do wykonania
- Zidentyfikuj i wykorzystaj co najmniej jedną lukę kryptograficzną.
- Udokumentuj dowody (screeny, żądania/odpowiedzi).
- Zaproponuj poprawkę (mitigacja).
- Uwzględnij wynik w raporcie końcowym.
🧠 Dodatkowe ćwiczenia
🔍 1. Przeanalizuj JWT z aplikacji mobilnej
- Zainstaluj emulator (np. Android Studio / Genymotion).
- Uruchom aplikację mobilną i przechwyć ruch sieciowy za pomocą Burp Suite lub mitmproxy.
- Znajdź token JWT przesyłany przez aplikację.
- Skopiuj token i przeanalizuj go na stronie jwt.io.
- Sprawdź:
- Czy JWT ma
alg: none
? - Czy payload zawiera informacje użytkownika?
- Czy można go zmodyfikować bez błędu po stronie serwera?
- Czy JWT ma
🔐 2. Sprawdź konfigurację TLS/SSL aplikacji
- Zainstaluj testssl.sh.
- Uruchom test dla aplikacji:
./testssl.sh https://twoja-aplikacja.pl
-
Przeanalizuj:
- Dostępne wersje protokołów TLS.
- Cipher Suites.
- Certyfikat i jego ważność.
- Obecność HSTS.
-
Alternatywnie, użyj SSL Labs.
🧬 3. Zidentyfikuj sekrety w repozytorium kodu
Opcja A: TruffleHog
trufflehog github --repo=https://github.com/twoj-org/twoj-repo
- Szuka zakodowanych kluczy API, tokenów, haseł.
Opcja B: Gitleaks
gitleaks detect --source=.
- Lekka alternatywa, możliwa do integracji z CI/CD.
📌 Sprawdź, czy repozytorium nie zawiera:
AWS_SECRET_KEY
JWT_SECRET
- Twardo zakodowanych haseł lub kluczy prywatnych
W następnym rozdziale: 3.3 – Injection