Command- og code injection
Lær at identificere og afhjælpe sårbarheder relateret til OS command injection og vilkårlig kodekørsel i backend-systemer.
Command- og code injection er en gratis Sikker kodning og OWASP Top 10 til backend-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Sikker kodning og OWASP Top 10 til backend, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Sikker kodning og OWASP Top 10 til backend-kurset indeholder 4 lektioner i alt.
Hvad er kommando- og kodeinjektion?
Velkommen! I denne lektion undersøger vi kommando- og kodeinjektion, to kritiske sårbarheder i backend.
Disse angreb narrer din applikation til at udføre utilsigtede systemkommandoer eller kode på applikationsniveau, hvilket kan føre til alvorlige sikkerhedsbrud.
- Kommandoinjektion: Udfører OS-kommandoer.
- Kodeinjektion: Udfører kode i applikationens programmeringssprog.
Grundlæggende om OS-kommandoinjektion
OS-kommandoinjektion opstår, når en angriber kan køre vilkårlige operativsystemkommandoer på den server, der hoster din applikation.
Det sker, når en applikation sender input fra brugeren, som ikke er renset, til en systemshell, ofte gennem funktioner, der udfører eksterne programmer.
Angribere kan derefter:
- Læse, skrive eller slette filer.
- Udføre ondsindede scripts.
- Få fuld kontrol over serveren.
Eksempel på sårbar OS-kommando
Lad os se på et sårbart Java-eksempel. Forestil dig, at userInput kommer direkte fra en webformular.
Angriberen kan bruge kommandoseparatorer (som ; eller &) til at føje nye kommandoer til den oprindelige kommando.
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());
}
}
}Sådan fungerer injektionen
I det foregående eksempel sendes strengen ls -l my_file.txt; echo HELLO_INJECTED_COMMAND til skallen.
Semikolonet (;) er en kommandoseparator på Linux/Unix-lignende systemer. Det fortæller skallen, at den først skal udføre den første kommando og derefter den anden.
Selv hvis my_file.txt ikke findes, køres echo-kommandoen stadig, hvilket demonstrerer injektionen.
Begrænsning af risiko: Validering af input
Det primære forsvar mod OS Command Injection er streng inputvalidering.
- Whitelisting: Dette er den sikreste tilgang. Definér præcis, hvilke tegn, formater eller værdier der er tilladt som brugerinput. Afvis alt, der ikke matcher.
- Undgå blacklisting: Forsøg på at blokere kendte skadelige tegn (som
;,&) kan ofte omgås på grund af forskellige fortolkninger i skallen eller tricks med kodning.
Begrænsning af risiko: Foretruk sikre API'er
I stedet for at sammenkæde brugerinput direkte i en kommandostreng skal du bruge API'er, der sender argumenter som separate elementer til kommandoen.
I Java er ProcessBuilder sikrere end Runtime.getRuntime().exec(), når det bruges korrekt, fordi det som standard ikke starter en skal til at fortolke argumenterne.
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å kodeinjektion
Kodeinjektion minder om Command Injection, men i stedet for OS-kommandoer udfører den vilkårlig kode i programmets programmeringssprog.
Det kan ske, når et program:
- Evaluerer brugerleveret input som eksekverbar kode (f.eks. ved at bruge
eval()i scriptingsprog eller Expression Languages i Java). - Deserialiserer data, man ikke har tillid til, og som kan oprette skadelige objekter.
- Bruger sårbare skabelonmotorer.
Scenarier for kodeinjektion
I modsætning til OS Command Injection, der retter sig mod operativsystemets skal, retter kodeinjektion sig mod programmets runtime-miljø.
- Dynamisk evaluering: Hvis dit program tager imod brugerinput og bruger det i en funktion som
eval()(almindeligt i Python, PHP og JavaScript), kan en angriber injicere sin egen kode. - Usikker deserialisering: Når et program deserialiserer data, man ikke har tillid til, uden ordentlig validering, kan en angriber fremstille skadelige serialiserede objekter, der udfører kode under deserialiseringen.
Java-programmer er særligt sårbare over for usikker deserialisering.
Forebyggelse af kodeinjektion
Begrænsning af kodeinjektion kræver omhyggeligt design og streng datahåndtering:
- Undgå dynamisk kodeudførelse: Brug aldrig funktioner, der evaluerer brugerleveret input som kode.
- Validér deserialiserede data: Deserialiser kun data fra kilder, du har tillid til. Implementér strenge typekontroller og objektvalidering for alt deserialiseret input.
- Brug sikre skabelonmotorer: Sørg for, at dine skabelonmotorer automatisk undslipper brugerleverede data for at forhindre injektion.
- Mindste privilegium: Kør dit program med de mindst mulige nødvendige tilladelser.
Test din viden
Det er tid til en hurtig kontrol! Vælg de mest effektive metoder til at forhindre injektionssårbarheder.
Opsummering: Forsvar mod injektion
Godt klaret! Du har lært om Command Injection og kodeinjektion.
- Command Injection giver angribere mulighed for at køre OS-kommandoer.
- Kodeinjektion giver angribere mulighed for at køre kode på programniveau.
- De vigtigste forsvarsmekanismer omfatter streng inputvalidering (whitelisting), brug af sikre API'er (f.eks.
ProcessBuildermed separate argumenter) og undgåelse af dynamisk kodeudførelse fra kilder, man ikke har tillid til.
Betragt altid brugerinput som data, du ikke har tillid til!
Lær Sikker kodning og OWASP Top 10 til backend med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 12
- Lektioner
- 48
Ofte stillede spørgsmål
Er lektionen “Command- og code injection” gratis?
Ja — alle 3 lektioner i læringssporet Sikker kodning og OWASP Top 10 til backend, inklusive “Command- og code injection”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Sikker kodning og OWASP Top 10 til backend-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Command- og code injection”?
Lær at identificere og afhjælpe sårbarheder relateret til OS command injection og vilkårlig kodekørsel i backend-systemer. Du øver dig i Sikker kodning og OWASP Top 10 til backend med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Sikker kodning og OWASP Top 10 til backend?
Der kræves ingen tidligere erfaring. Sikker kodning og OWASP Top 10 til backend på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Command- og code injection”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Sikker kodning og OWASP Top 10 til backend-lektion?
Ja. Alle Sikker kodning og OWASP Top 10 til backend-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Forebyggelse af SQL Injection
- Command- og code injection
- Cross-Site Scripting (XSS) i backend
- Forebyggelse af XML- og LDAP-injektion