Injection
- Útoky mohou vést ke čtení, změně nebo odstranění dat, případně spuštění uložených procedur.
- Aplikace je náchylná k útoku v případě, že
- uživatelem odeslaná data nejsou zvalidována, odfiltrována nebo jinak vhodně upravena aplikací,
- se používají dynamické query nebo neparametrizovaná volání bez escapování přímo v interpretu,
- se používají nebezpečná data v rámci ORM parametrů vyhledávání k získání dalších citlivých dat,
- se používají nebezpečná data napřímo, nebo se spojují s dalšími, např. v SQL dotazu.
- Mezi nejčastější formy injection patří: SQL, NoSQL, OS command, ORM, LDAP, expression language, OGNL.
- Nejlepší způsoby, jak tyto zranitelnosti detekovat, jsou
- code review,
- automatické testování všech parametrů, hlaviček, URL, cookies, JSON, SOAP nebo XML dat.
- Předcházet zranitelnostem v produkčním prostředí lze také pomocí SAST, DAST nebo IAST security testing nástroji a jejich integrací do CI/CD pipeline.
Nejčastější zranitelnosti
- Cross-site scripting (XSS).
- SQL injection.
- Externí kontrola nad názvem, nebo cestou k souboru.
Jak zranitelnosti předcházet
🔴 Oddělte data od příkazů a dotazů.
🔴 Použijte bezpečné API, které se vyhne použití interpretu a poskytne parametrizované rozhraní, nebo přejděte na ORM.
- I v případě parametrizovaných uložených procedur může dojít k SQL injection, pokud např. jazyk PL/SQL spojuje dotazy pomocí
EXECUTE IMMEDIATE
neboexec()
.
🔴 Validujte vstup na serveru.
🔴 Escapujte speciální znaky, nebo použijte speciální escape syntaxy daného interpretu.
- SQL tabulky nebo názvy sloupců není možné escapovat - pokud jsou tyto názvy poskytovány uživatelem, jde o nebezpečnou manipulaci - častý problém.
🔴 Použijte LIMIT
a další prvky, které předejdou získání velkého množství dat najednou.
Příklad zneužití zranitelnosti
- Aplikace používá nezvalidovaná data od uživatele přímo v konstrukci SQL dotazu.
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
- Podobně může důvěra aplikace v obdržená data vést k dotazům, které jsou stále zranitelné (např. HQL).
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
- V obou případech dokáže útočník modifikovat
id
parametr v prohlížeči a odeslat hodnotuor ‘1’=’1
.
http://example.com/app/accountView?id=' or '1'='1
- To změní význam obou dotazů a vrátí se všechny záznamy z tabulky
accounts
.