Command- en code-injectie
Leer kwetsbaarheden met betrekking tot OS-commandinjectie en willekeurige code-uitvoering in backendsystemen te identificeren en te beperken.
Command- en code-injectie is een gratis Veilig coderen en de OWASP Top 10 voor backends-les op CoddyKit. Dit is les 2 van 4. Je kunt 3 lessen uit dit leerpad gratis volledig lezen — daarna ontgrendelt CoddyKit PRO alle lessen, plus praktische oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Veilig coderen en de OWASP Top 10 voor backends. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Veilig coderen en de OWASP Top 10 voor backends bevat in totaal 4 lessen.
Wat zijn opdracht- en code-injectie?
Welkom! In deze les bekijken we opdrachtinjectie en code-injectie, twee belangrijke kwetsbaarheden in backends.
Deze aanvallen misleiden je toepassing zodat die onbedoelde systeemopdrachten of code op applicatieniveau uitvoert, wat tot ernstige beveiligingslekken leidt.
- Opdrachtinjectie: voert opdrachten van het besturingssysteem uit.
- Code-injectie: voert code in de programmeertaal van de toepassing uit.
De basis van OS-opdrachtinjectie
OS-opdrachtinjectie treedt op wanneer een aanvaller willekeurige opdrachten van het besturingssysteem kan uitvoeren op de server waarop je toepassing draait.
Dit gebeurt wanneer een toepassing niet opgeschoonde invoer van een gebruiker doorgeeft aan een systeem-shell, vaak via functies die externe programma's uitvoeren.
aanvallers kunnen dan:
- Bestanden lezen, schrijven of verwijderen.
- Kwaadaardige scripts uitvoeren.
- Volledige controle over de server krijgen.
Kwetsbaar voorbeeld van een OS-opdracht
Bekijk een kwetsbaar Java-voorbeeld. Stel dat userInput rechtstreeks uit een webformulier komt.
De aanvaller kan opdrachtscheidingstekens (zoals ; of &) gebruiken om nieuwe opdrachten aan de oorspronkelijke opdracht toe te voegen.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class CommandInjectionDemo {
public static void main(String[] args) {
// Imagine 'userInput' comes from a web request parameter
String userInput = "my_file.txt; echo HELLO_INJECTED_COMMAND"; // Malicious input example
// For Windows: "my_file.txt & echo HELLO_INJECTED_COMMAND"
// VULNERABLE: Direct concatenation of user input into a system command
String command = "ls -l " + userInput; // Linux example command
// For Windows: String command = "dir " + userInput;
System.out.println("Executing: " + command);
try {
Process p = Runtime.getRuntime().exec(command);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor(); // Wait for the command to finish
} catch (Exception e) {
System.err.println("Error executing command: " + e.getMessage());
}
}
}Hoe de injectie werkt
In het vorige voorbeeld wordt de tekenreeks ls -l my_file.txt; echo HELLO_INJECTED_COMMAND aan de shell doorgegeven.
De puntkomma (;) is een opdrachtscheidingsteken op Linux/Unix-achtige systemen. Hiermee krijgt de shell de opdracht om eerst de eerste opdracht en daarna de tweede uit te voeren.
Zelfs als my_file.txt niet bestaat, wordt de opdracht echo nog steeds uitgevoerd. Dat toont de injectie aan.
Beperking: invoervalidatie
De belangrijkste verdediging tegen OS Command Injection is strikte validatie van invoer.
- Toestaan op basis van een lijst: Dit is de veiligste aanpak. Definieer precies welke tekens, indelingen of waarden zijn toegestaan voor invoer van gebruikers. Wijs alles af wat hier niet aan voldoet.
- Vermijd blokkeren op basis van een zwarte lijst: Pogingen om bekende kwaadaardige tekens (zoals
;en&) te blokkeren, kunnen vaak worden omzeild door verschillende interpretaties van de shell of trucs met codering.
Beperking van risico's: kies voor veilige API's
Gebruik in plaats van invoer van gebruikers rechtstreeks aan een opdrachttekenreeks toe te voegen API's die argumenten als afzonderlijke elementen aan de opdracht doorgeven.
In Java is ProcessBuilder veiliger dan Runtime.getRuntime().exec() wanneer je het correct gebruikt, omdat het standaard geen shell aanroept om argumenten te interpreteren.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
public class SafeCommandExec {
public static void main(String[] args) {
// Imagine 'userInput' comes from a web request parameter
String userInput = "my_file.txt; echo HELLO_INJECTED_COMMAND"; // Malicious input attempt
// SECURE: Pass arguments as separate strings to ProcessBuilder
// The shell will NOT interpret '; echo HELLO_INJECTED_COMMAND' as a new command
ProcessBuilder pb = new ProcessBuilder("ls", "-l", userInput);
// For Windows: ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/c", "dir", userInput);
System.out.println("Executing: " + String.join(" ", pb.command()));
try {
Process p = pb.start(); // Start the process
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
} catch (Exception e) {
System.err.println("Error executing command: " + e.getMessage());
}
}
}Code-injectie begrijpen
Code-injectie lijkt op Command Injection, maar in plaats van opdrachten van het besturingssysteem wordt willekeurige code uitgevoerd in de programmeertaal van de toepassing.
Dit kan gebeuren wanneer een toepassing:
- Invoer van gebruikers evalueert als uitvoerbare code (bijvoorbeeld met
eval()in scripttalen of met Expression Languages in Java). - Niet-vertrouwde gegevens deserialiseert waarmee kwaadaardige objecten kunnen worden samengesteld.
- Kwetsbare sjabloonengines gebruikt.
Scenario's voor code-injectie
In tegenstelling tot OS Command Injection, dat gericht is op de shell van het besturingssysteem, richt code-injectie zich op de runtimeomgeving van de toepassing.
- Dynamische evaluatie: Als je toepassing invoer van gebruikers ontvangt en die gebruikt in een functie zoals
eval()(veelgebruikt in Python, PHP en JavaScript), kan een aanvaller eigen code injecteren. - Onveilige deserialisatie: Wanneer een toepassing niet-vertrouwde gegevens deserialiseert zonder de juiste validatie, kan een aanvaller kwaadaardige geserialiseerde objecten samenstellen die tijdens het deserialiseren code uitvoeren.
Java-toepassingen zijn bijzonder kwetsbaar voor onveilige deserialisatie.
Code-injectie voorkomen
Het beperken van code-injectie vereist een zorgvuldig ontwerp en een strikte omgang met gegevens:
- Vermijd dynamische code-uitvoering: Gebruik nooit functies die invoer van gebruikers als code evalueren.
- Valideer gedeserialiseerde gegevens: Deserialiseer alleen gegevens uit vertrouwde bronnen. Voer strikte typecontroles en objectvalidatie uit voor alle gedeserialiseerde invoer.
- Gebruik veilige sjabloonengines: Zorg dat je sjabloonengines gegevens van gebruikers automatisch escapen om injectie te voorkomen.
- Minimale bevoegdheden: Voer je toepassing uit met de minimaal noodzakelijke machtigingen.
Toets je kennis
Het is tijd voor een korte toets! Selecteer de effectiefste maatregelen om kwetsbaarheden door injectie te voorkomen.
Samenvatting: verdediging tegen injectie
Goed gedaan! Je hebt geleerd over Command Injection en code-injectie.
- Command Injection stelt aanvallers in staat opdrachten van het besturingssysteem uit te voeren.
- Code-injectie stelt aanvallers in staat code op toepassingsniveau uit te voeren.
- Belangrijke verdedigingen zijn onder andere strikte validatie van invoer (toestaan op basis van een lijst), het gebruik van veilige API's (zoals
ProcessBuildermet afzonderlijke argumenten) en het vermijden van dynamische code-uitvoering met niet-vertrouwde bronnen.
Behandel invoer van gebruikers altijd als niet-vertrouwde gegevens!
Leer Veilig coderen en de OWASP Top 10 voor backends met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 12
- Lessen
- 48
Veelgestelde vragen
Is de les “Command- en code-injectie” gratis?
Ja — je kunt hier op het web alle 3 lessen van het leerpad Veilig coderen en de OWASP Top 10 voor backends, waaronder “Command- en code-injectie”, gratis volledig lezen. Daarna ontgrendelt CoddyKit PRO alle lessen, plus interactieve oefeningen met een ingebouwde code-editor en een AI-tutor die 24/7 beschikbaar is. De cursus Veilig coderen en de OWASP Top 10 voor backends bevat in totaal 4 lessen.
Wat leer ik in “Command- en code-injectie”?
Leer kwetsbaarheden met betrekking tot OS-commandinjectie en willekeurige code-uitvoering in backendsystemen te identificeren en te beperken. Je oefent met Veilig coderen en de OWASP Top 10 voor backends door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Veilig coderen en de OWASP Top 10 voor backends te beginnen?
Ervaring vooraf is niet nodig. Veilig coderen en de OWASP Top 10 voor backends op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Command- en code-injectie”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Veilig coderen en de OWASP Top 10 voor backends?
Ja. Elke les over Veilig coderen en de OWASP Top 10 voor backends bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- SQL-injectie voorkomen
- Command- en code-injectie
- Cross-site scripting (XSS) in de backend
- XML- en LDAP-injection voorkomen