Dnes probereme zranitelnosti typu Command Injection operačního systému. Jak velkou hrozbu představují? Jak můžete těmto zranitelnostem předcházet? Jak je NexDAST pomáhá odstranit? Na všechny tyto otázky podrobně odpovíme níže!
Co jsou příkazové injekce operačního systému?
Nepleťte si příkazovou injekci s injekcí kódu. Škodlivý kód, který se injektuje do programovacího jazyka, je zranitelnost typu code injection. Injekce příkazů operačního systému jsou typem užitečného zatížení, které hacker injektuje. Toto užitečné zatížení se pak spustí jako příkaz operačního systému.
Hacker provede dočasný příkaz operačního systému na serveru aplikací, což vede k riziku ohrožení aplikace a dat. Zranitelnosti injektování příkazů operačního systému jsou hackery často využívány jako odrazový můstek. Jedná se o nejhorší možný scénář injektáže příkazů OS, protože začíná injektáží příkazů OS a vede ke zneužití dalších částí hostitelské infrastruktury, což vede k ohrožení celé řady dalších systémů.
Python, Ruby, Perl, Java, C, PHP. Všechny tyto programovací jazyky umožňují uživatelům volat systémový příkaz shellu. To je činí zranitelnými vůči příkazovým injekcím operačního systému. Přesto je injektované spuštění dočasného příkazu závislé na oprávněních webového serveru. Proto zranitelnosti typu command injection nejsou samy o sobě tak nebezpečné. Hacker však může využít zvýšení oprávnění a získat přístup k dalším informacím. S těmito informacemi lze najít a zneužít další zranitelnosti.
Příklady zranitelností typu Command Injection v operačních systémech
Řekněme, že si chcete na webové stránce koupit klávesnici. Aplikace vás musí nejprve nechat zjistit, zda je požadovaná klávesnice skladem. Uživatelé tuto informaci získají prostřednictvím adres URL, jako je tato:
https://Keyboard-website.com/StockStatus?ProductID=111&StoreID=22
Aplikace požádá starší systémy, aby uživateli poskytly informace o skladových zásobách. Tuto funkci představuje volání příkazu shellu. Argumenty jsou ID produktu a skladu, takže příkaz shellu vypadá nějak takto:
Keyboards.py 111 22
Uživatelé nyní vidí, zda je jejich preferovaná klávesnice skladem. Přesto je zde problém. Aplikace není zabezpečena proti injekcím příkazů operačního systému. Hackeři nyní mohou odeslat vstup, který spustí dočasný příkaz. Ten vypadá nějak jako „& echo randomstring &“ v parametru storeID. Aplikace pak provede tento příkaz:
Keyboards.py & echo randomstring & 22
Co tento příkaz udělá? Způsobí, že se na výstupu objeví echo dodaného řetězce. Efektivní způsob testování typů injektáží příkazů operačního systému. Oddělovač příkazů shellu ( & ) změní jeden příkaz na tři. Uživatelé pak vidí tři výsledky:
Error - productID was not provided
Randomstring
22: command not found
Původní příkaz Keyboard.py se provedl, ale chyběly očekávané argumenty. Proto se objevila chybová zpráva. Ve výstupu se ozval dodaný řetězec (Randomstring). To je cílem injektovaného příkazu echo. Zobrazuje se však 22: příkaz nebyl nalezen. Proč? Protože původní argument 22 se provedl jako příkaz, což způsobilo chybu.
Nyní se budeme zabývat zranitelnostmi typu blind OS command injection. K tomu dochází, když aplikace ve své odpovědi nevrací výstup z příkazu. Přesto mají hackeři k dispozici různé techniky, jak tyto zranitelnosti zneužít:
- časové zpoždění
- přesměrování výstupu
Použití injektovaného příkazu ke spuštění časového zpoždění umožňuje hackerovi potvrdit, zda byl příkaz proveden. O tom, zda byl příkaz proveden, nebo ne, vypovídá doba, za kterou aplikace zareaguje. Jedním z nejúčinnějších příkazů pro zneužití této slepé zranitelnosti je příkaz ping. Tento příkaz umožňuje zvolit přesný počet paketů ICMP, které se mají odeslat. Toto číslo bude představovat čas potřebný ke spuštění tohoto příkazu.
Přesměrování výstupu je dalším zneužitím příkazu pro injektáž operačního systému. Výstup injektovaného příkazu přesměrujete přímo do souboru. Tento soubor se nachází v rámci webového kořene, který je načten prostřednictvím prohlížeče.
Předcházení vstřikování příkazů operačního systému
Jak můžete zabránit vstřikování příkazů operačního systému? Nejjednodušší a nejúčinnější způsob je nikdy nepoužívat shell_exec nebo podobná volání příkazů hostitelského OS. Místo toho použijte stejné příkazy v programovacím jazyce, který používáte. Problém nastane, pokud váš programovací jazyk nemá odpovídající příkaz k tomu, který potřebujete. V těchto případech byste měli použít sanitizaci vstupu. Pomůže, když to uděláte ještě před přiřazením hodnoty příkazu shellu. Použití bílé listiny je vždy nejbezpečnější možností, pokud jde o injekce.
Mezi další možnosti výkonné validace vstupu patří např:
- Ověření platnosti alfanumerických znaků (Potvrdí zahrnutí pouze alfanumerických znaků bez bílých znaků nebo syntaxe do vstupu)
- Ověření platnosti čísel (Potvrdí, že vstup je číslo)
- Bílá listina povolených hodnot (Potvrdí proti bílé listině povolených hodnot)
Nikdy byste se neměli vyhýbat metaznakům shellu a snažit se tímto způsobem sanitizovat vstup. Protože tím se vstup stává zranitelným pro chytré hackery, kteří jej mohou snadno obejít.
Jak může NexDAST pomoci zabránit příkazovým injekcím do operačního systému
Nejjednodušší a nejúčinnější způsob, jak zabránit příkazovým injekcím do operačního systému, je využití NexDAST. Naše řešení pro testování zabezpečení typu black-box automaticky prověří vaši aplikaci. Při zjištění OS Command Injection jsou vývojáři nebo týmu SecOps zaslány pokyny k nápravě. S NexDAST není třeba zdlouhavé a pomalé manuální testování.
Příklad, kdy NexDAST identifikuje OS Command Injection:
vulnerable.com/site/ping?ip=8.8.8.8%3B+%2Fbin%2Fcat+%2Fetc%2Fpasswd
Část %3B+%2Fbin%2Fcat+%2Fetc%2Fpasswd
je zranitelnost. NexDAST také poskytuje pokyny k nápravě, které vám pomohou tuto zranitelnost co nejefektivněji odstranit.
Chcete se o NexDAST dozvědět více? Již dříve jsme se mu podrobně věnovali v jednom z našich blogů, a pokud máte problém, se kterým vám NexDAST může pomoci, požádejte o ukázku zde!