Kommando- och kodinjektion
Lär er identifiera och åtgärda sårbarheter relaterade till injektion av OS-kommandon och godtycklig kodkörning i backend-system.
Kommando- och kodinjektion är en gratis lektion i Säker kodning och OWASP Top 10 för backend på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för Säker kodning och OWASP Top 10 för backend, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Säker kodning och OWASP Top 10 för backend innehåller totalt 4 lektioner.
Vad är kommando- och kodinjektion?
Välkommen! I den här lektionen utforskar vi Command och Code Injection, två kritiska sårbarheter i backend.
De här attackerna lurar din applikation att köra oavsedda systemkommandon eller kod på applikationsnivå, vilket kan leda till allvarliga säkerhetsincidenter.
- Command Injection: Kör operativsystemkommandon.
- Code Injection: Kör kod i applikationens programmeringsspråk.
Grunderna i OS Command Injection
OS Command Injection inträffar när en angripare kan köra godtyckliga operativsystemkommandon på servern där din applikation körs.
Det händer när en applikation skickar osanerad indata från användaren till ett systemskal, ofta genom funktioner som kör externa program.
Angripare kan då:
- Läsa, skriva eller ta bort filer.
- Köra skadliga skript.
- Få full kontroll över servern.
Sårbart OS Command-exempel
Vi tittar på ett sårbart Java-exempel. Föreställ dig att userInput kommer direkt från ett webbformulär.
Angriparen kan använda kommandoseparatorer (som ; eller &) för att lägga till nya kommandon efter det ursprungliga.
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å fungerar injektionen
I det föregående exemplet skickas strängen ls -l my_file.txt; echo HELLO_INJECTED_COMMAND till skalet.
Semikolonet (;) är en kommandoseparator i Linux- och Unix-liknande system. Det talar om för skalet att köra det första kommandot och sedan det andra.
Även om my_file.txt inte finns kommer kommandot echo fortfarande att köras, vilket demonstrerar injektionen.
Åtgärd: Validering av indata
Det främsta skyddet mot OS-kommandeinjektion är strikt indatavalidering.
- Vitlistning: Detta är det säkraste tillvägagångssättet. Definiera exakt vilka tecken, format eller värden som tillåts i användarindata. Avvisa allt som inte matchar.
- Undvik svartlistning: Försök att blockera kända skadliga tecken (som
;,&) kan ofta kringgås på grund av olika tolkningar i skal eller trick med kodning.
Åtgärd: Föredra säkra API:er
I stället för att sammanfoga användarindata direkt till en kommandosträng bör du använda API:er som skickar argument som separata element till kommandot.
I Java är ProcessBuilder säkrare än Runtime.getRuntime().exec() när det används korrekt, eftersom det som standard inte startar ett skal för att tolka argumenten.
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());
}
}
}Förstå kodinjektion
Kodinjektion liknar kommandeinjektion, men i stället för OS-kommandon körs godtycklig kod i applikationens programmeringsspråk.
Detta kan inträffa när en applikation:
- Utvärderar användarindata som körbar kod (till exempel med
eval()i skriptspråk eller Expression Languages i Java). - Avserialiserar data som inte är betrodd och som kan skapa skadliga objekt.
- Använder sårbara mallmotorer.
Scenarier för kodinjektion
Till skillnad från OS-kommandeinjektion, som riktar sig mot operativsystemets skal, riktar sig kodinjektion mot applikationens körmiljö.
- Dynamisk utvärdering: Om applikationen tar emot användarindata och använder den i en funktion som
eval()(vanligt i Python, PHP och JavaScript) kan en angripare injicera egen kod. - Osäker avserialisering: När en applikation avserialiserar data som inte är betrodd utan korrekt validering kan en angripare skapa skadliga serialiserade objekt som kör kod vid avserialiseringen.
Java-applikationer är särskilt sårbara för osäker avserialisering.
Förhindra kodinjektion
För att minska risken för kodinjektion krävs noggrann design och strikt datahantering:
- Undvik dynamisk kodkörning: Använd aldrig funktioner som utvärderar användarindata som kod.
- Validera avserialiserade data: Avserialisera endast data från betrodda källor. Inför strikta typkontroller och objektvalidering för all indata som avserialiseras.
- Använd säkra mallmotorer: Se till att mallmotorerna automatiskt escaper användardata för att förhindra injektion.
- Minsta privilegium: Kör applikationen med minsta nödvändiga behörigheter.
Testa dina kunskaper
Det är dags för en snabb kontroll! Välj de mest effektiva metoderna för att förhindra injektionssårbarheter.
Sammanfattning: Skydd mot injektioner
Bra jobbat! Du har lärt dig om kommandeinjektion och kodinjektion.
- Kommandeinjektion gör det möjligt för angripare att köra OS-kommandon.
- Kodinjektion gör det möjligt för angripare att köra kod på applikationsnivå.
- Viktiga skydd omfattar strikt indatavalidering (vitlistning), användning av säkra API:er (som
ProcessBuildermed separata argument) och att undvika dynamisk kodkörning från källor som inte är betrodda.
Behandla alltid användarindata som data som inte är betrodd!
Lär dig Säker kodning och OWASP Top 10 för backend med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 12
- Lektioner
- 48
Vanliga frågor
Är lektionen ”Kommando- och kodinjektion” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen Säker kodning och OWASP Top 10 för backend, inklusive ”Kommando- och kodinjektion”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i Säker kodning och OWASP Top 10 för backend innehåller totalt 4 lektioner.
Vad lär jag mig i ”Kommando- och kodinjektion”?
Lär er identifiera och åtgärda sårbarheter relaterade till injektion av OS-kommandon och godtycklig kodkörning i backend-system. Ni övar på Säker kodning och OWASP Top 10 för backend med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig Säker kodning och OWASP Top 10 för backend?
Du behöver inga förkunskaper. Utbildningen i Säker kodning och OWASP Top 10 för backend på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Kommando- och kodinjektion”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här Säker kodning och OWASP Top 10 för backend-lektionen?
Ja. Varje Säker kodning och OWASP Top 10 för backend-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Förebygga SQL-injektion
- Kommando- och kodinjektion
- Cross-site scripting (XSS) i backend
- Förhindra XML- och LDAP-injektion