XXE-injectie
Een geüpload XML-bestand dat de eigen bestanden van de server leest.
Wat is XXE-injectie?
XXE verandert een XML-parser in een primitief voor het lezen van bestanden en het vervalsen van verzoeken. De aanvaller declareert een SYSTEM-entiteit in een DOCTYPE, en de parser inline een lokaal bestand, of het antwoord van een interne URL, voordat uw code het document ziet. Dat maakt het eerder een parserconfiguratiefout dan een invoervormfout. U wijst een upload van een inkooporder naar file:///etc/passwd en leest deze terug in het herhaalde leveranciersveld. Vervolgens repareert u libxmljs.parseXml(..., { noent: true }) : wijs DOCTYPE- en entiteitsdeclaraties af, en parseer terwijl de resolutie van externe entiteiten en DTD's uitgeschakeld is.
Wat je leert in XXE-injectie
- Herken XXE als een bug in de parserconfiguratie, niet als een bug in de invoervorm
- Lees een XML-payload en identificeer de SYSTEM-entiteitsdeclaratie die deze gevaarlijk maakt
- Begrijp dat XXE generaliseert van het lezen van lokale bestanden naar het ophalen van interne URL's (SSRF)
- Pas de oplossing op parserniveau toe (schakel de resolutie van externe entiteiten uit) en laag-diepgaande controles bovenop
- Controleer elke XML-parseeroproepsite op dezelfde vlag zodra er een is gevonden
XXE-injectie — Trainingsstappen
-
Zoek de intakefunctie
Met Brackwell Logistics kan elke geregistreerde leverancier een inkooporder indienen door deze als XML-bestand te uploaden. Het formulier neemt het document, parseert het op de servers van Brackwell en leest de leverancier en het totaal terug. Bob opent de functie om te zien hoe deze zich gedraagt voordat hij deze aanraakt.
-
Waar het parseren plaatsvindt
Eén regel op die pagina is de hele reden waarom Bob geïnteresseerd is.
-
Upload een normale bestelling
Kijk eerst hoe de functie zich normaal gedraagt. Bob voegt een gewone inkooporder toe en verzendt deze. Het netwerkpaneel van de browser registreert het verzoek en het antwoord van de server, precies wat een ontwikkelaar ziet in DevTools.
-
Wat de parser herhaalde
De bestelling werd netjes geparseerd. Eén detail in het antwoord vertelt Bob hoe hij het moet aanvallen.
-
Begin met een normaal bestand
Bob opent de gewone inkooporder in zijn editor. Op dit moment is het precies hoe het eruit ziet: een leverancier en een totaal, duidelijke data. Met XML kan een document een externe entiteit declareren, een benoemde tijdelijke aanduiding waarvan de waarde de parser ergens anders vandaan haalt. Bob staat op het punt er een toe te voegen.
-
Bewapen het bestand
Bob voegt een DOCTYPE toe dat een externe entiteit declareert die naar een bestand op schijf verwijst, en wijst vervolgens het leveranciersveld naar die entiteit. Het bestand wordt nog steeds geparseerd als een inkooporder. Hij begint met het bestand dat elke Linux-box heeft, om te bewijzen dat de parser de referentie überhaupt volgt.
-
De entiteit
Er waren slechts twee regels nodig.
-
Upload het gemaakte bestand
Bob dient zijn vervaardigde bestand in via dezelfde intakefunctie. Voor de browser is het gewoon weer een upload van een inkooporder.
-
Het bestand komt terug
Het antwoord is geen leveranciersnaam. Het is het wachtwoordbestand van de server, dat van de schijf wordt gelezen en rechtstreeks wordt teruggestuurd via de normale uitvoer van de upload.
-
Kennis check
Je hebt zojuist een upload van een inkooporder gezien en de bestanden van de server gelezen. Leg vast waarom.
Dekking van beveiligingsframeworks
OWASP Top 10
- A02:2025 Security Misconfiguration
- A05:2021 Security Misconfiguration
CWE
- CWE-611 Improper Restriction of XML External Entity Reference
- CWE-918 Server-Side Request Forgery (SSRF)
CIS Controls
- CIS 16 Application Software Security
NIST CSF
- PR.AT-02 Individuals in specialized roles are provided with awareness and training so that they possess the knowledge and skills to perform relevant tasks with cybersecurity risks in mind
- PR.PS Platform Security