Kommando- og kodeinjeksjon
Lær å identifisere og redusere sårbarheter knyttet til OS-kommandoinjeksjon og kjøring av vilkårlig kode i backend-systemer.
Kommando- og kodeinjeksjon er en gratis leksjon i Sikker koding og OWASP Top 10 for backend på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Sikker koding og OWASP Top 10 for backend, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Sikker koding og OWASP Top 10 for backend inneholder totalt 4 leksjoner.
Hva er kommando- og kodeinjeksjon?
Velkommen! I denne leksjonen skal vi utforske kommando- og kodeinjeksjon, to kritiske sårbarheter i backend.
Disse angrepene lurer applikasjonen din til å kjøre utilsiktede systemkommandoer eller kode på applikasjonsnivå, noe som kan føre til alvorlige sikkerhetsbrudd.
- Kommandoinjeksjon: Kjører OS-kommandoer.
- Kodeinjeksjon: Kjører kode i applikasjonens programmeringsspråk.
Grunnleggende om OS-kommandoinjeksjon
OS-kommandoinjeksjon oppstår når en angriper kan kjøre vilkårlige operativsystemkommandoer på serveren som er vert for applikasjonen.
Dette skjer når en applikasjon sender usaniterte brukerdata til et systemskall, ofte gjennom funksjoner som kjører eksterne programmer.
Angripere kan da:
- Lese, skrive eller slette filer.
- Kjøre skadelige skript.
- Få full kontroll over serveren.
Sårbart eksempel på OS-kommando
La oss se på et sårbart Java-eksempel. Tenk deg at userInput kommer direkte fra et webskjema.
Angriperen kan bruke kommandoseparatorer, for eksempel ; eller &, til å legge nye kommandoer til den opprinnelige kommandoen.
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());
}
}
}Slik fungerer injeksjonen
I eksempelet ovenfor sendes strengen ls -l my_file.txt; echo HELLO_INJECTED_COMMAND til skallet.
Semikolonet (;) er en kommandoseparator på Linux- og Unix-lignende systemer. Det forteller skallet at den første kommandoen skal kjøres, etterfulgt av den andre.
Selv om my_file.txt ikke finnes, vil echo-kommandoen fortsatt kjøre, noe som viser injeksjonen.
Tiltak: Validering av inndata
Det viktigste forsvaret mot OS Command Injection er streng validering av inndata.
- Hvitelisting: Dette er den sikreste tilnærmingen. Definer nøyaktig hvilke tegn, formater eller verdier som er tillatt i inndata fra brukeren. Avvis alt som ikke samsvarer.
- Unngå svartelisting: Forsøk på å blokkere kjente ondsinnede tegn (som
;,&) kan ofte omgås på grunn av ulike tolkninger i skall eller triks med koding.
Tiltak: Foretrekk sikre API-er
I stedet for å sette sammen inndata fra brukeren direkte i en kommandostreng bør De bruke API-er som sender argumenter som separate elementer til kommandoen.
I Java er ProcessBuilder sikrere enn Runtime.getRuntime().exec() når det brukes riktig, ettersom det som standard ikke starter et skall for å tolke argumentene.
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());
}
}
}Forstå kodeinjeksjon
Kodeinjeksjon ligner på Command Injection, men i stedet for OS-kommandoer kjører den vilkårlig kode i programmets programmeringsspråk.
Dette kan skje når et program:
- Evaluerer inndata fra brukeren som kjørbar kode (for eksempel ved å bruke
eval()i skriptspråk eller Expression Languages i Java). - Deserialiserer data som ikke er til å stole på, og som kan konstruere ondsinnede objekter.
- Bruker sårbare malmotorer.
Scenarier for kodeinjeksjon
I motsetning til OS Command Injection, som retter seg mot operativsystemets skall, retter kodeinjeksjon seg mot programmets kjøremiljø.
- Dynamisk evaluering: Hvis programmet tar imot inndata fra brukeren og bruker dem i en funksjon som
eval()(vanlig i Python, PHP og JavaScript), kan en angriper injisere sin egen kode. - Usikker deserialisering: Når et program deserialiserer data som ikke er til å stole på, uten tilstrekkelig validering, kan en angriper lage ondsinnede serialiserte objekter som kjører kode under deserialiseringen.
Java-programmer er spesielt sårbare for usikker deserialisering.
Forhindre kodeinjeksjon
For å redusere risikoen for kodeinjeksjon kreves gjennomtenkt utforming og streng håndtering av data:
- Unngå dynamisk kjøring av kode: Bruk aldri funksjoner som evaluerer inndata fra brukeren som kode.
- Valider deserialiserte data: Deserialiser bare data fra pålitelige kilder. Implementer strenge typesjekker og objektvalidering for alle deserialiserte inndata.
- Bruk sikre malmotorer: Sørg for at malmotorene automatisk unnslipper data fra brukeren for å forhindre injeksjon.
- Minste privilegium: Kjør programmet med så få tillatelser som nødvendig.
Test kunnskapen Deres
Det er tid for en rask kontroll! Velg de mest effektive metodene for å forhindre injeksjonssårbarheter.
Oppsummering: Forsvar mot injeksjon
Godt jobbet! De har lært om Command Injection og kodeinjeksjon.
- Command Injection gjør det mulig for angripere å kjøre OS-kommandoer.
- Kodeinjeksjon gjør det mulig for angripere å kjøre kode på programnivå.
- Viktige forsvarstiltak omfatter streng validering av inndata (hvitelisting), bruk av sikre API-er (som
ProcessBuildermed separate argumenter) og unngåelse av dynamisk kjøring av kode fra upålitelige kilder.
Behandle alltid inndata fra brukere som data De ikke kan stole på!
Lær deg Sikker koding og OWASP Top 10 for backend med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 12
- Leksjoner
- 48
Ofte stilte spørsmål
Er leksjonen «Kommando- og kodeinjeksjon» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Sikker koding og OWASP Top 10 for backend, inkludert «Kommando- og kodeinjeksjon», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Sikker koding og OWASP Top 10 for backend inneholder totalt 4 leksjoner.
Hva lærer jeg i «Kommando- og kodeinjeksjon»?
Lær å identifisere og redusere sårbarheter knyttet til OS-kommandoinjeksjon og kjøring av vilkårlig kode i backend-systemer. Du øver på Sikker koding og OWASP Top 10 for backend med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med Sikker koding og OWASP Top 10 for backend?
Ingen tidligere erfaring er nødvendig. Sikker koding og OWASP Top 10 for backend på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Kommando- og kodeinjeksjon»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne Sikker koding og OWASP Top 10 for backend-leksjonen?
Ja. Alle Sikker koding og OWASP Top 10 for backend-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Forebygging av SQL-injeksjon
- Kommando- og kodeinjeksjon
- Cross-Site Scripting (XSS) i backend
- Forebygging av XML- og LDAP-injeksjon