OS command injection (även känd som shell injection) är en webbsäkerhetssårbarhet som gör det möjligt för en angripare att utföra godtyckliga operativsystem (OS) kommandon på servern som kör ett program, och vanligtvis helt äventyra programmet och alla dess data.
Varför behöver webbapplikationer köra systemkommandon?
webbapplikationer behöver ibland köra operativsystemkommandon (OS-kommandon) för att kommunicera med det underliggande värdoperativsystemet och filsystemet. Detta kan göras för att köra systemkommandon, starta applikationer skrivna i ett annat programmeringsspråk eller köra skal -, python -, perl-eller PHP-skript. För alla operativsystem, inklusive Windows, Unix och Linux, finns funktioner tillgängliga som kan utföra ett kommando som skickas till de andra skripten som ett skalkommando. Även om den är extremt användbar kan den här funktionen vara farlig när den används felaktigt och kan leda till säkerhetsproblem för webbapplikationer, vilket förklaras i den här artikeln.
varför du bör vara försiktig när du använder systemkommandon i webbapplikationer
genom att utnyttja en kommandoinjektionssårbarhet i en sårbar applikation kan angripare lägga till ytterligare kommandon eller injicera sina egna operativsystemkommandon. Detta innebär att under en kommandoinjektionsattack kan en angripare enkelt ta fullständig kontroll över webbserverns värdoperativsystem. Därför bör utvecklare vara mycket försiktiga med hur man skickar användarinmatning till en av dessa funktioner när man utvecklar webbapplikationer.
exempel på en Kommandoinjektionssårbarhet
i det här exemplet på kommandoinjektionssårbarheten använder vi ping-funktionaliteten, som är notoriskt osäker på många routrar. Föreställ dig en sårbar applikation som har en gemensam funktion som skickar en IP-adress från en användarinmatning till systemets ping-kommando. Därför, om användarinmatningen är 127.0.0.1, körs följande kommando på värdoperativsystemet:
ping -c 5 127.0.0.1
eftersom vi har att göra med en sårbar webbapplikation är det möjligt att bryta sig ur ping-kommandot eller provocera ett fel som returnerar användbar information till angriparen. Angriparen kan sedan använda denna funktion för att utföra sina egna godtyckliga kommandon. Ett exempel på att lägga till ytterligare systemkommandon kan se ut så här:
ping -c 5 127.0.0.1; id
i exemplet ovan körs först ping-kommandot och direkt därefter utförs id-kommandot. Därför kommer kommandoutmatningen på sidan att se ut så här:
under en OS-kommandoinjektionsattack kan angriparen också ställa in en felbaserad attack. Till exempel kommer en kodinjektion i det här fallet vanligtvis att se ut som nedan:
ping -c 5 "$(id)"
ovanstående kodinjektion returnerar ett svar så här:
ping: unknown host uid=0(root) gid=0(root) groups=0(root)
hur man förhindrar Systemkommandoinjektionssårbarheter
för att förhindra att en angripare utnyttjar en sårbar webbapplikation och sätter in specialtecken i operativsystemkommandot, bör du försöka för att i allmänhet undvika systemanrop där det är möjligt. Undvik i alla fall användarinmatning av något slag om det inte är absolut nödvändigt. Och om det är nödvändigt, se till att det finns korrekt inmatningsvalidering på plats – inmatningsvalidering är alltid ett måste för att säkerställa att din webbapplikationskod inte är sårbar för andra högeffektiva sårbarheter, inklusive XSS och SQL-injektion.
avaktivera också den här funktionen i ditt språks konfigurationsfil om du inte behöver den, så att angripare aldrig kan få tillgång till systemskalet på värdoperativsystemet via sårbara webbapplikationer. På vissa språk kan du skilja utförandet av processen från inmatningsparametrarna. Du kan också bygga en vit lista över möjliga ingångar och kontrollera formaten, till exempel acceptera endast heltal för ett numeriskt id.