| app | ||
| malicious | ||
| docker-compose.yml | ||
| proxy.conf | ||
| README.md | ||
Description XSS
XSS, cross-site scripting, is een methode waarmee je remote code execution kan behalen in een browser. Dit bereik je door een vertrouwde server kwaadaardige content te laten serveren.
In dit project is één vorm hiervan opgenomen, namelijk een directe echo (Reflected XSS).
Dit is het meest makkelijke voorbeeld, maar niet altijd de realiteit.
Vaak zal je toch wel wat beveiliging moeten omzeilen. Om deze reden zijn
er dan ook honderden verschillende manieren van XSS, ook wel attack vectors
genoemd. Hier is een gist met een lijst van ideeën.
In practice
Als voorbeeld bevat deze repository een docker-compose project die alles opzet. Dit project biedt twee websites aan, geserveerd door een nginx reverse proxy.
De applicatie die je probeert te benaderen staat op http://localhost:8080. Een exploit van deze applicatie, de phishing site, staat op http://localhost:8081.
Setting up
Dit project maakt gebruik van docker-compose. Met het volgende commando kan je de docker omgeving opzetten:
docker-compose up -d
Wanneer je klaar bent, kan je met het volgende commando alles stoppen:
docker-compose stop
Als je alles weer wilt verwijderen, dan kan je het volgende draaien:
docker-compose down
Testing
Navigeer naar de login pagina. Hier kan je een gebruikersnaam invoeren een ingelogde sessie met de server starten. Als dit gelukt is, wordt je gelijk naar de home pagina gestuurd. Hier zie je nu onderaan staan dat je ingelogd bent. Het doel is om deze sessie over te nemen in een nieuwe browser (tip: om te testen, gebruik een privé-venster of andere browser voor deze tweede sessie, zodat cookies anders zijn).
Attacking
De kwaadaardige website heeft een link staan. Als de gebruiker deze aanklikt, wordt deze naar de applicatie gebracht, maar niet voordat de sessie cookies uitgelezen worden en opgestuurd worden naar de kwaadaardige website.
Mitigation
Dit voorbeeld is geschreven in PHP. De oplossing voor het invoegen van HTML op deze manier is om gebruik te maken
van een functie htmlspecialchars(). Maar dat lost alleen dit probleem op. Er zijn nog honderden manieren om op deze
manier aan te vallen (zie inleiding). Iedere taal zal zijn eigen eisen hebben om dit netjes op te lossen. Je zal altijd
een vector missen, ga daar maar van uit.
Zelfs Google, op haar searchengine, had recentelijk nog een XSS probleem. Lees de commit met de fix.
Loop niet al te radeloos weg, er is namelijk wel een oplossing die je mee kan nemen. Deze oplossing dekt nog altijd niet volledig, maar werkt beter dan alles wat je zelf zal doen: gebruik een framework.