Přeskočit na hlavní obsah

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 nebo exec().

🔴 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

  1. Aplikace používá nezvalidovaná data od uživatele přímo v konstrukci SQL dotazu.
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
  1. 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 hodnotu or ‘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.

Kam dál

Cheat sheety

Checklisty

Další