KB » Computer » Damn Vulnerable Web Application (DVWA)

Damn Vulnerable Web Application (DVWA)

    Tweeten

Setup

Naast de hieronder beschreven methode kan het ook veel simpeler, want DVWA is onderdeel van Metasploitable.

Ik beschrijf de setup apart voor Windows en Kali.

Bekijk na de setup eerst deze sectie.

Setup in Windows

Download XAMMP

Download XAMPP (bevat o.a. MySQL, Apache en Tomcat server) van apachefriends.org.

Installeer, en zet de Apache en MySQL services aan.

Controleer dan of de web server het doet door in de browser naar localhost/dashboard te gaan.

Download DVWA

Download de Damn Vulnerable Web Application hier (knop Download, links onderin).

Installeer DVWA

Maak een map dvwa binnen de map \XAMMP\htdocs (De files die in die map stonden horen bij de default installatie, en je kan ze weggooien, maar het hoeft niet.)

Extract the Zip-file naar de net aangemaakte map.

Als je nu naar localhost\dvwa gaat zou je bij de DVWA-pagina moeten komen.

Rename dan de file config.inc.php.dist in de map config naar config.inc.php. Edit dit bestand, en zorg ervoor dat db_user de waarde root heeft, en db_password blank is.

Klik onderaan de pagina op Create / Reset Database

Bereikbaarheid vanuit Kali (of een andere machine)

Daarna moet je vanuit Kali testen of je de app kan bereiken, en het IP-adres van je Windows-PC toevoegen aan de file /etc/hosts (met als domein vuln.lab).

Setup in Kali

Als je de app in Kali wilt installeren, moet je hem in Kali downloaden, en het het volgende commando geven: cp -Rv /home/userid/Downloads/DVWAversion /var/www

Daarna: chmod -Rv 777 /var/www/DVWAversion

Als je nu in de browser naar localhost gaat zou je de index van de DVWA-map moeten zien.

apt-cache search mysql | grep -i database | less
Zoek naar mysql-client, en dan:
apt-get install mysql-client
apt-get install mysql-server
service mysql restart

mysql -h localhost -u root (1e keer), of
mysql -h localhost -u root -p (volgende keren)
Tussendoor: SET PASSWORD FOR root@localhost=PASSWORD('test'); (uppercase niet noodzakelijk).

Ga nu naar de DVWA-map, en dan cd config. Daar staat nl. de file config.inc.php, die je moet wijzigen. Je moet de waarde van db_password vervangen door test (tenminste als je aan het eind van de vorige paragraaf dat zo ingesteld hebt).

service apache2 restart
Dan klik je op het browserscherm van localhost op Create / Reset Database

Userid en password van het inlogscherm staan in readme.md ('admin' en 'password').

Default staat het security level misschien op high. Hier staat hoe je dat moet veranderen.


DVWA Security

Er zijn voor elk probleem in DVWA 3 security levels, die andere oplossingen vragen. In dit menu kan je het level veranderen.

Default staat het level mogelijk op het hoogste niveau, waardoor hacken voor een beginner erg moeilijk wordt.


Upload

Low security

Klik op Upload
Soms wordt niet goed gecontroleerd op wat er ge-upload wordt. Bv. bij een CV zou je 1 of ander document verwachten. We gaan proberen een PHP shell te uploaden, nl. dit:
<?php echo shell_exec($_GET['cmd'].' 2>&1'); ?>

shell_exec is een PHP-functie die je shell commands laat uitvoeren
$_GET wil zeggen dat je HTTP commands gaat geven
cmd is de parameter.

Als je het commando in een bestand zet en upload, moet je goed kijken waar het bestand blijft. Je plaatst het pad naar het script in de URL, en krijgt niets terug. Dat is goed nieuws, want nu kan je aan het eind toevoegen ?cmd=ls
En je krijgt een listing terug.


Command Execution

Kies in het menu Command Execution.

Op chris-young.net worden alle 3 levels besproken.

Low security

Je krijgt dan een invoerveld waar je een IP-adres kan invullen. Er wordt dan een ping gedaan van dat adres.

Maar in Linux/Unix kan je meerdere commando's uitvoeren gescheiden door een ';'. Je zou dus kunnen proberen om i.p.v. alleen een IP-adres er iets achter te plakken, bv. ; pwd

Op deze manier kan je ook de inhoud van de password file /etc/passwd te pakken krijgen. Vul dan bv. in: 127.0.0.1; cat /etc/passwd

I.p.v. de ';' om commando's te scheiden, kan je ook '&&' gebruiken, dus bv. 127.0.0.1 && whoami

Om het besturingssysteem te weten te komen kan je dit doen: 127.0.0.1 | uname
Door de pipe te gebruiken raak je de overtollige ping-informatie kwijt. Die uitvoer wordt naar het uname-commando gestuurd, maar dat programma doet er verder niets mee.


SQL injection manual

Low security

Met een cijfer als invoer krijg je voor- en achternaam te zien. Probeer nu als invoer 3'. Dat levert een error, dus is de applicatie kwetsbaar en probeer je een injection techniek: 3' or 1=1#. Je krijgt nu alle records te zien.

Je probeert nu 3' or 1=1 union select database(),user()#, en daarna 3' or 1=1 union select user,password from users#

Je krijgt een lijst met users en MD5 encrypted passwords, die je online kan decrypten, bv. dat van admin. Ga bv. naar www.md5online.org. Het password blijkt 1234 te zijn.


XSS (Reflected)

Low security

Als je de code bekijkt zie je dat je naam ge-echo'd wordt, zonder enige controle op rare tekens.

Probeer wat er gebeurt als je Javascript invoert: <script>alert('xss')</script>. xss verschijnt in een message op het scherm.

Je kan in de URL zien dat alles wat je aan Javascript invoert wordt uitgevoerd in de browser.

Medium security

We zien in de source code dat '<script>' vervangen wordt door niets. De eenvoudige oplossing is een parameter toevoegen aan de script-tag, bv. language="javascript"

High security (v 1.10)

Deze keer staat er in de code: $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '',, $GET['name'])

Nu probeer je ><img src=x onerror=alert()>, en het werkt.

Impossible security (v 1.10)


XSS (Stored)

Low security

Probeer, net als bij Reflected XSS, wat er gebeurt als je Javascript invoert (in het message-veld): <script>alert('xss')</script>. xss verschijnt in een message op het scherm.

In dit geval, omdat de code in de database gestored is, krijg je de melding opnieuw als je de pagina ververst.

Medium security

Tussendoor doe je een reset van de database. Deze keer wordt de 'message' door de strip_tags functie gehaald. Maar in de 'name' wordt alleen <script> vervangen.

Je wilt het dus weer proberen met een language="..." parameter bij de script-tag (in het name-veld), maar er is onvoldoende ruimte. Dus ga je de Inspector oproepen (Q), en de limit (van 10) verhogen naar 500. Hoe dat moet is me onduidelijk. Je kan rechtsklikken en dan Edit as HTML, maar onduidelijk hoe je de waarde dan kan bevestigen.

High security

Tussendoor doe je een reset van de database.

Deze keer staat er in de code (van het name-veld): $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '',, $GET['name'])

Nu probeer je ><img src=x onerror=alert()> (na aanpassen van de lengte van het name-veld als bij medium security), en het werkt.



    Tweeten

© Henk Dalmolen
Reageer via E-mail (dalmolen@xs4all.nl)

Deze pagina is voor het laatst gewijzigd op: 25-01-23 17:00:16