Je bekijkt nu Code injection: werking, risico’s en preventie

Code injection: werking, risico’s en preventie

  • Laatste wijziging in bericht:
  • Bericht auteur:

Wat is Code Injection?

Code Injection is een aanval waarbij een applicatie onbedoeld ingevoerde code uitvoert. Dat gebeurt vaak via formulieren, URL-parameters, cookies, uploadvelden of API-aanroepen. De dreiging ontstaat meestal door slechte invoervalidatie, onveilige programmeerkeuzes of functies die gebruikersinvoer te direct verwerken. Daardoor kan een aanvaller soms eigen code laten draaien binnen een webapplicatie, serverproces of databaseomgeving.

Voor bedrijven is het risico groot, omdat één zwakke invoerplek al genoeg kan zijn. Een webshop, klantenportaal of interne beheeromgeving verwerkt veel gegevens van gebruikers. Als die gegevens zonder strenge controle in code, queries of commando’s belanden, ontstaat een aanvalsvlak. Daarom hoort code injection thuis in hetzelfde bredere onderwerp als aanvallen via onveilige invoer.

Wat is Code Injection?

Code Injection is dus geen enkel trucje, maar een verzamelnaam voor aanvallen waarbij invoer verandert in uitvoerbare instructies. De applicatie denkt dat zij gewone tekst verwerkt. Toch behandelt een kwetsbaar onderdeel die tekst als code. Hierdoor kan de aanvaller acties afdwingen die de ontwikkelaar nooit bedoelde.

Het verschil met gewone foutieve invoer zit in de uitvoering. Een verkeerd e-mailadres geeft bijvoorbeeld een validatiefout. Kwaadaardige invoer probeert daarentegen een extra instructie mee te geven. Als de applicatie die instructie accepteert, kan willekeurige code-uitvoering ontstaan. Dat heet vaak arbitrary code execution en is een ernstig beveiligingsrisico.

Hoewel aanvallers vaak technische kennis gebruiken, begint de aanval meestal op een herkenbare plek. Denk aan een zoekveld, contactformulier of loginpagina. Juist daarom moeten ontwikkelaars elke invoer behandelen als onbetrouwbaar. Vertrouwen op de voorkant van een website is onvoldoende, want een aanvaller kan verzoeken direct naar de server sturen.

Hoe werkt injectie van code?

Bij een injectieaanval zoekt een aanvaller naar een invoerveld dat te veel vrijheid geeft. Dat kan een formulier zijn, maar ook een HTTP-header, cookie, zoekopdracht of API-parameter. Vervolgens test de aanvaller of speciale tekens, scripts of commando’s anders worden verwerkt dan gewone tekst.

Scherm met programmeercode en beveiligingsanalyse

Een simpele demonstratie is een veld waarin iemand geen naam invult, maar een script probeert te plaatsen:

bashKopiërenBewerken<script>alert('Hacked!');</script>

Als de applicatie deze invoer niet controleert of encodeert, kan de browser het script uitvoeren zodra de pagina laadt. Daardoor ziet een gebruiker niet alleen tekst, maar voert zijn browser code uit. Bij server-side varianten kan de server zelf een opdracht uitvoeren. Dat maakt de impact vaak groter.

De aanval verloopt meestal in stappen. Eerst vindt de aanvaller een invoerpunt. Daarna probeert hij tekens of opdrachten die de logica van de applicatie beïnvloeden. Vervolgens kijkt hij naar foutmeldingen, afwijkende pagina’s of trage reacties. Hierdoor leert hij hoe de applicatie invoer verwerkt. Ten slotte stuurt hij een payload die gegevens leest, acties uitvoert of toegang uitbreidt.

Niet elke payload is direct zichtbaar. Soms schrijft de aanvaller code weg in een database of logbestand. Later leest een beheerpagina die waarde opnieuw in. Dan voert de applicatie de opgeslagen inhoud alsnog uit. Dit maakt onderzoek lastiger, maar loganalyse kan het spoor vaak terugvinden.

Soorten injectieaanvallen met code

Er zijn verschillende vormen, afhankelijk van de plek waar de invoer terechtkomt. De namen verschillen, maar het basisprobleem blijft gelijk: gebruikersinvoer krijgt te veel invloed op code of opdrachten.

  1. SQL Injection: hierbij voegt een aanvaller SQL-fragmenten toe aan invoer. Daardoor kan hij mogelijk databases lezen, aanpassen of leegtrekken.
  2. Script Injection: hierbij plaatst een aanvaller JavaScript of vergelijkbare code in een pagina. Deze vorm overlapt vaak met kwaadaardige scripts in de browser.
  3. Command Injection: hierbij bereikt invoer een shell of systeemfunctie. Daardoor kan een aanvaller mogelijk opdrachten op de server uitvoeren.
  4. XML Injection: hierbij misbruikt een aanvaller de verwerking van XML-gegevens. Soms draait het om structuurmanipulatie, soms om externe entiteiten.
  5. LDAP Injection: hierbij beïnvloedt invoer een LDAP-query. Dit kan gevolgen hebben voor authenticatie, gebruikerslijsten of toegangscontrole. Lees ook de uitleg over LDAP injection.

Daarnaast bestaan varianten die specifieke platformen raken. Denk aan template-injectie, expression-injectie of misbruik van evaluatiefuncties. Toch begint preventie steeds bij dezelfde vraag: kan deze invoer ooit als instructie worden behandeld?

Risico’s van code-injectie voor systemen en gegevens

De gevolgen van een succesvolle aanval kunnen ernstig zijn. Een aanvaller kan gegevens bekijken, sessies overnemen of beheerfuncties misbruiken. In het slechtste geval krijgt hij controle over een server of kan hij nieuwe malware plaatsen. Daardoor groeit een klein invoerprobleem uit tot een incident voor de hele organisatie.

  1. Onbevoegde toegang tot gegevens: aanvallers kunnen klantinformatie, gebruikersaccounts of interne bedrijfsgegevens bekijken.
  2. Servercompromittering: een kwetsbare functie kan leiden tot controle over bestanden, processen of configuratie.
  3. Diefstal van gebruikersgegevens: kwaadaardige code kan inloggegevens, tokens of betaalinformatie verzamelen.
  4. Verspreiding van malware: een aanvaller kan de applicatie gebruiken om schadelijke bestanden of scripts te verspreiden.
  5. Schending van wet- en regelgeving: datalekken kunnen meldplichten, herstelkosten en reputatieschade veroorzaken.

Voor niet-technische lezers helpt een eenvoudige vergelijking. Een applicatie hoort invoer te lezen als een formulierantwoord. Bij code injection leest de applicatie een deel van dat antwoord alsof het een opdracht is. Daarom is het probleem niet alleen technisch. Het raakt ook bedrijfscontinuïteit, klantvertrouwen en naleving van regels.

Toegangsrechten bepalen vaak hoe ver de schade loopt. Als een kwetsbare applicatie te veel rechten heeft, kan een aanvaller meer bereiken. Beperkte rechten remmen de impact. Daarom sluit preventie nauw aan op goed beheer van rollen en rechten, zoals bij fouten in toegangscontrole.

Code-injectie voorkomen met veilige invoer

Preventie begint met veilige ontwikkelgewoonten. Controleer invoer vroeg, verwerk gegevens veilig en beperk wat code mag doen. Een enkele maatregel is niet genoeg. Combineer daarom invoervalidatie, veilige functies, logging, rechtenbeheer en tests.

Ontwikkelaar controleert webapplicatie op beveiligingsfouten

1. Valideer en encodeer gebruikersinvoer

Controleer of invoer past bij het verwachte formaat. Een postcode, datum of klantnummer heeft een duidelijke vorm. Alles daarbuiten moet de applicatie weigeren of veilig verwerken. Encodeer uitvoer bovendien per context, bijvoorbeeld voor HTML, JavaScript of URL’s.

2. Gebruik parameterized queries en prepared statements

Bij databasevragen moet gebruikersinvoer nooit rechtstreeks in een query belanden. Prepared statements scheiden data van instructies. Daardoor blijft invoer tekst, ook als iemand speciale tekens meestuurt. Dit verkleint de kans op SQL-misbruik sterk.

3. Kies veilige alternatieven voor gevaarlijke functies

Vermijd functies die tekst als code uitvoeren, zoals eval-achtige functies of directe shell-aanroepen. Gebruik liever vaste bibliotheken, frameworkfuncties en whitelists. Moet een applicatie toch een systeemtaak uitvoeren? Geef dan vaste parameters door en laat gebruikersinvoer niet de opdracht samenstellen.

4. Beperk rechten en toegang

Geef applicaties alleen de rechten die zij nodig hebben. Een webproces hoeft meestal geen beheerrechten op de server te hebben. Hierdoor blijft de schade kleiner als een kwetsbaarheid toch misbruikt wordt.

5. Gebruik logging, monitoring en een WAF

Log verdachte patronen, maar sla geen gevoelige gegevens onnodig op. Een Web Application Firewall kan bekende aanvalspatronen blokkeren. Toch vervangt een WAF geen veilige code. Zie het als extra laag, niet als excuus om invoercontrole over te slaan.

6. Test tijdens ontwikkeling en onderhoud

Voer code reviews, beveiligingstests en penetratietests uit. Test vooral plekken waar invoer naar databases, templates, bestanden of systeemcommando’s gaat. Daardoor ontdek je kwetsbaarheden voordat aanvallers ze vinden.

Een veilige reviewchecklist hoeft niet ingewikkeld te zijn. Vraag per invoerpunt: wat is het verwachte formaat? Waar komt de waarde terecht? Welke functie verwerkt de waarde? Kan de waarde ooit een opdracht worden? En welke rechten heeft het proces dat de waarde verwerkt?

Wat doe je na code-injectie?

Vermoed je misbruik, handel dan snel en gestructureerd. Trek niet meteen alle sporen weg. Logs, bestanden en verzoeken kunnen juist laten zien hoe de aanval werkte. Toch moet je de schade beperken zodra je voldoende bewijs hebt veiliggesteld.

  1. Isoleer het getroffen systeem en beperk netwerktoegang waar dat kan.
  2. Bewaar logs en relevante bestanden, zodat je de aanval later kunt onderzoeken.
  3. Analyseer het invoerpunt en bepaal welke kwetsbaarheid de aanvaller gebruikte.
  4. Herstel gegevens via schone back-ups als bestanden of databases zijn aangepast.
  5. Patch de applicatie en verbeter validatie, encoding en rechten.
  6. Informeer betrokkenen wanneer persoonsgegevens of klantgegevens zijn geraakt.

Controleer ook of de aanvaller achterdeuren heeft geplaatst. Een server kan na herstel opnieuw besmet raken als verborgen toegang blijft bestaan. Let daarom op onbekende accounts, vreemde geplande taken en aangepaste configuratiebestanden. Meer uitleg over dit risico vind je bij verborgen toegang tot systemen.

FAQ

Deze vragen vatten de belangrijkste punten kort samen.

Is injectie van code hetzelfde als malware?

Nee. Code injection is een aanvalstechniek, terwijl malware schadelijke software is. De techniek kan wel helpen om malware te plaatsen of uit te voeren. Daarom hoort het risico bij bredere beveiliging van applicaties, servers en gebruikersgegevens.

Waarom is gebruikersinvoer gevaarlijk bij code?

Gebruikersinvoer komt van buiten de applicatie. Een aanvaller kan die invoer aanpassen, herhalen en direct naar de server sturen. Als de applicatie de waarde vertrouwt, kan tekst veranderen in een opdracht. Daarom moet invoer altijd gecontroleerd en veilig verwerkt worden.

Kan een WAF deze aanvallen volledig stoppen?

Een WAF kan bekende patronen herkennen en blokkeren. Toch stopt hij niet elke aanval. Aanvallers passen payloads aan en misbruiken soms logica die er normaal uitziet. Gebruik een WAF daarom als extra laag naast veilige code, beperkte rechten en goede tests.

Welke functies zijn extra riskant?

Functies die tekst uitvoeren als code zijn extra riskant. Denk aan eval-achtige functies, dynamische templates en directe shell-aanroepen. Kies waar mogelijk vaste bibliotheken, prepared statements en whitelists. Daardoor blijft gebruikersinvoer data in plaats van een uitvoerbare instructie.

Conclusie

Code injection blijft een ernstige kwetsbaarheid, omdat gewone invoer kan veranderen in uitvoerbare instructies. Slechte validatie, onveilige functies en te ruime rechten vergroten de kans op misbruik. Bescherm applicaties daarom met strikte invoercontrole, veilige API’s, prepared statements, encoding en regelmatige reviews.

Voor organisaties is vooral het vaste proces belangrijk. Breng invoerpunten in kaart, test gevoelige functies en beperk rechten vóórdat er een incident ontstaat. Zo verklein je de kans dat een aanvaller code injection gebruikt om gegevens te stelen, malware te plaatsen of systemen over te nemen.