Komento- ja koodiinjektio
Opettele tunnistamaan ja torjumaan käyttöjärjestelmän komentoinjektioon ja mielivaltaiseen koodin suoritukseen liittyviä haavoittuvuuksia backend-järjestelmissä.
Komento- ja koodiinjektio on ilmainen Turvallinen koodaus ja backendin OWASP Top 10-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Turvallinen koodaus ja backendin OWASP Top 10-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Turvallinen koodaus ja backendin OWASP Top 10-kurssilla on yhteensä 4 oppituntia.
Mitä komento- ja koodiinjektio ovat?
Tervetuloa! Tässä oppitunnissa tutustumme komento- ja koodiinjektioon, jotka ovat kaksi vakavaa taustajärjestelmien haavoittuvuutta.
Näissä hyökkäyksissä sovellus huijataan suorittamaan tahattomia järjestelmäkomentoja tai sovellustason koodia, mikä voi johtaa vakaviin tietoturvaloukkauksiin.
- Komento-injektio: suorittaa käyttöjärjestelmän komentoja.
- Koodiinjektio: suorittaa sovelluksen ohjelmointikielen koodia.
Käyttöjärjestelmän komento-injektion perusteet
Käyttöjärjestelmän komento-injektio tapahtuu, kun hyökkääjä voi suorittaa mielivaltaisia käyttöjärjestelmän komentoja sovellusta isännöivällä palvelimella.
Näin käy, kun sovellus välittää puhdistamattoman käyttäjän antaman syötteen järjestelmän komentotulkille, usein ulkoisia ohjelmia suorittavien funktioiden kautta.
Hyökkääjät voivat tällöin:
- Lukea, kirjoittaa tai poistaa tiedostoja.
- Suorittaa haitallisia komentosarjoja.
- Saada palvelimen täysin hallintaansa.
Haavoittuva käyttöjärjestelmäkomennon esimerkki
Tarkastellaan haavoittuvaa Java-esimerkkiä. Oletetaan, että userInput tulee suoraan verkkolomakkeesta.
Hyökkääjä voi käyttää komentojen erottimia, kuten ; tai &, uusien komentojen lisäämiseen alkuperäisen komennon perään.
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());
}
}
}Miten injektio toimii
Edellisessä esimerkissä merkkijono ls -l my_file.txt; echo HELLO_INJECTED_COMMAND välitetään komentotulkille.
Puolipiste (;) on komentojen erotin Linux- ja Unix-tyyppisissä järjestelmissä. Se ohjaa komentotulkin suorittamaan ensin ensimmäisen komennon ja sitten toisen.
Vaikka tiedostoa my_file.txt ei olisi olemassa, echo-komento suoritetaan silti, mikä havainnollistaa injektiota.
Lieventäminen: syötteiden validointi
Ensisijainen suoja käyttöjärjestelmäkomentojen injektiota vastaan on tiukka syötteiden validointi.
- Sallittujen arvojen luettelo: Tämä on turvallisin lähestymistapa. Määrittele tarkasti, mitkä merkit, muodot tai arvot käyttäjän syötteessä sallitaan. Hylkää kaikki, mikä ei vastaa määritelmää.
- Vältä kieltoluetteloita: Tunnettujen haitallisten merkkien (kuten
;ja&) estäminen voidaan usein kiertää erilaisten komentotulkkitulkintojen tai koodauskeinojen avulla.
Lieventäminen: turvallisten ohjelmointirajapintojen suosiminen
Sen sijaan että yhdistäisit käyttäjän syötteen suoraan komentomerkkijonoon, käytä ohjelmointirajapintoja, jotka välittävät argumentit komennolle erillisinä elementteinä.
Javassa ProcessBuilder on oikein käytettynä turvallisempi kuin Runtime.getRuntime().exec(), koska se ei oletusarvoisesti käynnistä komentotulkkia tulkitsemaan argumentteja.
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());
}
}
}Koodin injektion ymmärtäminen
Koodin injektio muistuttaa komentoinjektiota, mutta käyttöjärjestelmäkomentojen sijaan siinä suoritetaan sovelluksen ohjelmointikielellä kirjoitettua mielivaltaista koodia.
Näin voi tapahtua, kun sovellus:
- Arvioi käyttäjän syötteen suoritettavana koodina (esimerkiksi käyttää
eval()-funktiota komentosarjakielissä tai Java Expression Language -lausekkeita). - Deserialisoi epäluotettavaa dataa, jonka avulla voidaan luoda haitallisia olioita.
- Käyttää haavoittuvia mallinnusmoottoreita.
Koodin injektion tilanteet
Toisin kuin käyttöjärjestelmäkomentojen injektio, joka kohdistuu käyttöjärjestelmän komentotulkkiin, koodin injektio kohdistuu sovelluksen suoritusympäristöön.
- Dynaaminen arviointi: Jos sovellus ottaa vastaan käyttäjän syötettä ja käyttää sitä
eval()-funktion kaltaisessa funktiossa (yleistä Pythonissa, PHP:ssä ja JavaScriptissä), hyökkääjä voi injektoida omaa koodiaan. - Turvaton deserialisointi: Kun sovellus deserialisoi epäluotettavaa dataa ilman asianmukaista validointia, hyökkääjä voi muodostaa haitallisia serialisoituja olioita, jotka suorittavat koodia deserialisoinnin aikana.
Java-sovellukset ovat erityisen alttiita turvattomalle deserialisoinnille.
Koodin injektion estäminen
Koodin injektion torjuminen edellyttää huolellista suunnittelua ja tiukkaa datan käsittelyä:
- Vältä dynaamista koodin suoritusta: Älä koskaan käytä funktioita, jotka arvioivat käyttäjän syötteen koodina.
- Validoi deserialisoitu data: Deserialisoi dataa vain luotetuista lähteistä. Toteuta tiukat tyyppitarkistukset ja olioiden validointi kaikelle deserialisoidulle syötteelle.
- Käytä turvallisia mallinnusmoottoreita: Varmista, että mallinnusmoottorit muuttavat käyttäjän antaman datan automaattisesti suojattuun muotoon injektioiden estämiseksi.
- Vähimpien oikeuksien periaate: Suorita sovellusta vain sen tarvitsemilla vähimmäisoikeuksilla.
Testaa tietosi
On nopean kertauksen aika! Valitse tehokkaimmat käytännöt injektiohaavoittuvuuksien estämiseksi.
Kertaus: suojaus injektioilta
Hienoa työtä! Olet oppinut komentoinjektiosta ja koodin injektiosta.
- Komento-injektio mahdollistaa käyttöjärjestelmäkomentojen suorittamisen hyökkääjän toimesta.
- Koodin injektio mahdollistaa sovellustason koodin suorittamisen hyökkääjän toimesta.
- Keskeisiä suojauksia ovat tiukka syötteiden validointi (sallittujen arvojen luettelo), turvallisten ohjelmointirajapintojen käyttö (kuten
ProcessBuildererillisten argumenttien kanssa) sekä epäluotettavista lähteistä tulevan dynaamisen koodin suorituksen välttäminen.
Käsittele käyttäjän syötettä aina epäluotettavana datana!
Opi Turvallinen koodaus ja backendin OWASP Top 10 tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 12
- Oppitunnit
- 48
Usein kysytyt kysymykset
Onko oppitunti ”Komento- ja koodiinjektio” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Turvallinen koodaus ja backendin OWASP Top 10-oppimispolun 3 oppituntia, myös oppitunnin “Komento- ja koodiinjektio”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Turvallinen koodaus ja backendin OWASP Top 10-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Komento- ja koodiinjektio”?
Opettele tunnistamaan ja torjumaan käyttöjärjestelmän komentoinjektioon ja mielivaltaiseen koodin suoritukseen liittyviä haavoittuvuuksia backend-järjestelmissä. Harjoittelet Turvallinen koodaus ja backendin OWASP Top 10-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Turvallinen koodaus ja backendin OWASP Top 10-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Turvallinen koodaus ja backendin OWASP Top 10-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Komento- ja koodiinjektio”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Turvallinen koodaus ja backendin OWASP Top 10-oppitunnilla?
Kyllä. Jokainen Turvallinen koodaus ja backendin OWASP Top 10-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- SQL-injektioiden estäminen
- Komento- ja koodiinjektio
- Cross-Site Scripting (XSS) backendissä
- XML- ja LDAP-injektioiden estäminen