17. Het XXE Lab
XML External Entity injection bestaat omdat iemand ooit besloot dat XML-parsers bestanden moesten kunnen openen van willekeurige locaties. Een ontwerpbeslissing die, in retrospect, vergelijkbaar is met het installeren van een kattenluikje in de deur van een kluis. Het leek op dat moment vast logisch. De kat vond het geweldig. De inbreker ook.
/xxe/yolo.dtd GET
Genereert een kwaadaardige DTD die een bestand uitleest en doorstuurt. De parameter ?request=/etc/passwd bepaalt welk bestand. Het endpoint heet yolo. Dat is geen acroniem. Dat is precies wat het lijkt. De ontwikkelaar heeft niet eens de moeite genomen om te doen alsof het een professionele naam was. En weet je? Dat is eerlijker dan 90% van de enterprise-API’s die zichzelf namen geven als “DataSyncBridge Pro” maar onder de motorkap precies hetzelfde doen, alleen langzamer en met een licentie van 40.000 euro per jaar.
/xxe/froufrou GET
Het callback-endpoint. De parameter heet hatseflats. De data wordt opgeslagen in raw/loot/{ip}/xxe/{naam}.txt. Je leest die namen — froufrou, hatseflats — en je denkt: “dit kan niet serieus zijn.” De bestanden die je ermee exfiltreert zijn echter doodserieus. En dat contrast — de meest serieuze dingen omhuld in de meest absurde woorden — is misschien wel het meest Nederlandse aan deze hele applicatie.
/xxe/fout.dtd GET
Error-based XXE. Data via een XML-parse error. Geen uitgaande verbindingen nodig. Soms is de elegantste oplossing de lelijkste, en dit is het bewijs.
Je opdrachtgever profiteert: je rapport bevat niet “de XML-parser is kwetsbaar” maar “hier is de inhoud van /etc/passwd die via uw XML-endpoint is uitgelezen.” Het eerste is een opmerking. Het tweede is een bewijs. Het verschil in urgentie is als het verschil tussen “het raam zou open kunnen staan” en “er staat iemand in uw woonkamer.” Raad eens welke zin sneller tot actie leidt.