Turvallinen koodaus ja backendin OWASP Top 10 · Oppitunti

Komento- ja koodiinjektio

Opettele tunnistamaan ja torjumaan käyttöjärjestelmän komentoinjektioon ja mielivaltaiseen koodin suoritukseen liittyviä haavoittuvuuksia backend-järjestelmissä.

Oppitunti 2/411 vaihetta

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 ProcessBuilder erillisten 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!

Aloita maksutta

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

  1. SQL-injektioiden estäminen
  2. Komento- ja koodiinjektio
  3. Cross-Site Scripting (XSS) backendissä
  4. XML- ja LDAP-injektioiden estäminen
← Takaisin: Turvallinen koodaus ja backendin OWASP Top 10