XXE: Entity injection aanvallen

Met entity injection aanvallen kunnen applicaties aangevallen worden en datalekken veroorzaken. Dit gebeurd wanneer de XML parser onjuist geconfigureerd is. De meest gevaarlijke variant is XXE, wat staat voor XML eXternal Entity injection. Hierbij kunnen externe resources opgehaald worden, zoals willekeurige bestanden van de server of van andere locaties binnen het netwerk.

Wat is XML?

XML (eXtendable Markup Language) is een taal die gebruikt wordt om data gestructureerd op te slaan. Het formaat hiervan is vooraf afgesproken, en is daardoor voor mens en machine te begrijpen. XML wordt op verschillende manieren toegepast, bijvoorbeeld om uw browser te vertellen hoe deze pagina is opgebouwd. Een voorbeeld van een XML bestand ziet er als volgt uit:

<students>
<student>
<name>John Doe</name>
<id>1</id>
<school>Groningen University</school>
</student>
</students>

Het schoolsysteem kan een mogelijkheid bieden om nieuwe studenten te uploaden middels een XML-bestand. Gebruikers ervan kunnen het bovenstaande voorbeeld opslaan als een studenten.xml bestand. Na het uploaden kan het schoolsysteem het XML-bestand uitlezen en bevragen als een database. Dit zorgt ervoor dat XML zeer geschikt is om gestructureerde data uit te wisselen.

Wat zijn entities?

Het XML-formaat ondersteund ook variabelen. Binnen XML noemen we zo’n variabele een “entity”. Stel alle studenten komen van dezelfde school en we willen voorkomen dat we 1.000 keer “Cyber University” moeten typen, dan kunnen we het volgende doen:

<!DOCTYPE replace [<!ENTITY school "Cyber university">
<students>
<student>
<name>John Doe</name>
<id>1</id>
<school>&school;</school>
</student>
</students>

Bovenaan wordt nu de entity “school” aangemaakt, en deze wordt in het document gebruikt.

Een XXE aanval

Het kan nog handiger: als we de tekst “Cyber University” in een los bestand willen aanleveren, zodat we het XML-bestand niet meer aan hoeven te passen, dan kunnen we de naam ook extern inladen. Dit kan bijvoorbeeld vanaf een webadres of een lokaal ander bestand. Dit noemen we “external entities” of ook wel XXE.

<!DOCTYPE replace [<!ENTITY school SYSTEM "school.txt"> ]>
<students>
<student>
<name>John Doe</name>
<id>1</id>
<school>&school;</school>
</student>
</students>

In het bovenstaande voorbeeld wordt de inhoud van het bestand “school.txt” uitgelezen en gebruikt. Dit is uiteraard handig, maar kan ook een beveiligingsprobleem opleveren. Als het XML-bestand namelijk ingeladen wordt op een server, dan kunnen we op deze manier bestanden uitlezen die op de server staan. Stel, er staat in hetzelfde mapje een bestand genaamd “passwords.config”, dan kunnen we op deze manier de wachtwoorden van de server afhalen, of bijvoorbeeld configuratiebestanden zoals het /etc/passwd bestand. Dit zou een enorm datalek kunnen veroorzaken!

Entity expansions: de billion laughs attack

Een ander probleem wat op kan treden is “entity expansion”. Hiermee kunnen we niet zo zeer data stelen, maar wel de server onbereikbaar maken. Een bekend voorbeeld hiervan is de “billion laughs attack”. Deze staat hieronder:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE lolz [
<!ENTITY lol "lol">
<!ELEMENT lolz (#PCDATA)>
<!ENTITY lol1 "&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;&lol;">
<!ENTITY lol2 "&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;&lol1;">
<!ENTITY lol3 "&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;&lol2;">
<!ENTITY lol4 "&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;&lol3;">
<!ENTITY lol5 "&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;&lol4;">
<!ENTITY lol6 "&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;&lol5;">
<!ENTITY lol7 "&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;&lol6;">
<!ENTITY lol8 "&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;&lol7;">
<!ENTITY lol9 "&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;&lol8;">
]>
<lolz>&lol9;</lolz>

Wat hier gebeurd is dat er een entity gemaakt wordt met de waarde “lol”. Vervolgens wordt er een nieuwe waarde gemaakt, met 10x de waarde van de entity. Het resultaat is nu dus “lollollollollollol lollollollol”. Dit proces wordt herhaald, totdat de entity lol9 een miljard keer het woord lol bevat. Aangezien een letter 1 byte in het geheugen neemt, neemt de laatste entity 3 miljard bytes in beslag, wat 3GB is. Dit is een enorme aanslag op de resources van de server, aangezien het resultaat niet alleen in het geheugen gezet moet worden, maar ook samengesteld moet worden. De meeste servers zullen hierdoor vastlopen, en mocht de server het overleven dan is de aanval eenvoudig op te schalen door een paar regels extra toe te voegen.

Voorkomen

Er is niet een standaard manier om entity injection en de billion laughs aanval te voorkomen. De meeste XML-parsers kennen wel een instelling die deze mogelijkheid uit kan schakelen. Raadpleeg daarom de handleiding.

Entity injection komt vaak voor in grotere softwarepakketten en maatwerksoftware. Tijdens een pentest controleren we hierop. Benieuwd of uw applicatie kwetsbaar is? Neem dan contact met ons op.

Meer informatie over onze diensten

Wilt u er zeker van zijn dat uw websites, apps of systemen vrij zijn van lekken of kwetsbaarheden? Onze experts gaan graag voor u aan de slag. Voor meer informatie over onze pentests of andere diensten kunt u vrijblijvend contact opnemen via onderstaand contactformulier. We vertellen u graag wat we voor u kunnen betekenen.

    Contact

    Randstad 22 147
    1316 BM Almere

    info@cyberant.com
    +31 (0)85 047 1590