os command injection (også kendt som shell injection) er en sikkerhedssårbarhed, der gør det muligt for en hacker at udføre vilkårlige operativsystemkommandoer (OS) på den server, der kører et program, og typisk kompromitterer applikationen og alle dens data fuldt ud.
hvorfor skal internetapplikationer udføre systemkommandoer?
applikationer skal undertiden udføre operativsystemkommandoer (os-kommandoer) for at kommunikere med det underliggende værtsoperativsystem og filsystemet. Dette kan gøres for at køre systemkommandoer, starte applikationer skrevet på et andet programmeringssprog eller køre shell -, python -, perl-eller PHP-scripts. Der er funktioner til rådighed, der kan udføre en kommando, der overføres til de andre scripts som en shell-kommando. Selvom det er ekstremt nyttigt, kan denne funktionalitet være farlig, når den bruges forkert, og kan føre til sikkerhedsproblemer på internettet, som forklaret i denne artikel.
hvorfor du skal være forsigtig, når du bruger systemkommandoer i internetapplikationer
ved at udnytte en kommandoinjektionssårbarhed i et sårbart program kan angribere tilføje yderligere kommandoer eller injicere deres egne operativsystemkommandoer. Dette betyder, at en angriber under et kommandoinjektionsangreb let kan tage fuld kontrol over værtsoperativsystemet på internetserveren. Derfor bør udviklere være meget forsigtige med at overføre brugerinput til en af disse funktioner, når de udvikler internetapplikationer.
eksempel på en Kommandoinjektionssårbarhed
i dette eksempel på kommandoinjektionssårbarheden bruger vi ping-funktionaliteten, som er notorisk usikker på mange routere. Forestil dig en sårbar applikation, der har en fælles funktion, der sender en IP-adresse fra en brugerinput til systemets ping-kommando. Derfor, hvis brugerindgangen er 127.0.0.1, udføres følgende kommando på værtsoperativsystemet:
ping -c 5 127.0.0.1
da vi har at gøre med en sårbar internetapplikation, er det muligt at bryde ud af ping-kommandoen eller provokere en fejl, der returnerer nyttige oplysninger til angriberen. Angriberen kan derefter bruge denne funktionalitet til at udføre sine egne vilkårlige kommandoer. Et eksempel på at tilføje yderligere systemkommandoer kunne se sådan ud:
ping -c 5 127.0.0.1; id
i ovenstående eksempel udføres først ping-kommandoen, og direkte efter at id-kommandoudførelsen finder sted. Derfor vil kommandoudgangen på siden se sådan ud:
under et OS-kommandoinjektionsangreb kan angriberen også oprette et fejlbaseret angreb. For eksempel vil en kodeinjektion i dette tilfælde typisk se ud som nedenstående:
ping -c 5 "$(id)"
ovenstående kodeinjektion returnerer et svar som dette:
ping: unknown host uid=0(root) gid=0(root) groups=0(root)
Sådan forhindres sårbarheder i Systemkommandoinjektion
for at forhindre en Angriber i at udnytte en sårbar internetapplikation og indsætte specialtegn i operativsystemkommandoen, skal du generelt forsøge at undgå systemopkald, hvor det er muligt. I alle tilfælde skal du undgå brugerinput af enhver art, medmindre det er absolut nødvendigt. Og hvis det er nødvendigt, skal du sørge for, at der er korrekt inputvalidering på plads – inputvalidering er altid et must for at sikre, at din applikationskode ikke er sårbar over for andre sårbarheder med stor effekt, herunder f.eks.
Deaktiver også denne funktionalitet i dit sprogs konfigurationsfil, hvis du ikke har brug for det, så angribere aldrig kan få adgang til systemskallen på værtsoperativsystemet gennem sårbare internetapplikationer. På nogle sprog kan du adskille udførelsen af processen fra inputparametrene. Du kan også oprette en hvid liste over mulige indgange og kontrollere formaterne, for eksempel kun at acceptere heltal for et numerisk id.