Přeskočit na hlavní obsah

Jak se bránit proti SQL injection, jsou vaše závislosti bezpečné a další

Víte, co je to SQL injection a jak předcházet SQL injection útokům? Znáte hrozby aplikačních závislostí? Víte, jaká bezpečnostní hrozba ovlivnila react, express nebo eslint? Přečtěte si o příkladech kompromitovaných závislostí, které možná dobře znáte.


🏆 Téma: SQL injection a ochrana proti ní

  • = druh útoku, pomocí kterého útočník injektuje škodlivý kód do aplikace.

    • Kód není interpretován jako text, ale jako kód, čímž dojde k jeho spuštění na úrovni databáze, což vede k úniku dat, jejich úpravě nebo smazání.
    • Proto injection (injekce), je to jako když dostanete injekci na očkování (to je ale žádoucí narozdíl od tohoto příkladu).
  • Útoky na databáze jsou velmi časté, což je způsobeno velkým výskytem této zranitelnosti, ale také atraktivitou cíle - databáze obsahuje citlivá a kritická data.

  • Injection zranitelnost je 3. nejrozšířenější zranitelností současných webových aplikací.

  • Mezi další injection útoky patří:

  • Chyby vznikají, když vývojáři vytvářejí dynamické databázové dotazy konstruované spojováním řetězců, které zahrnují uživatelské vstupy.

    • SELECT * FROM users WHERE id = " + $_GET["user_id"], kde $_GET["user_id"] představuje parametr v URL query stringu (za ?) https://<url>?user_id=1
  • Příklad:

    1. Webová stránka obsahuje formulář pro přihlášení do aplikace.
    2. Po zadání přihlašovacího jména a hesla se dotyčný buď přihlásí nebo se zobrazí chyba v závislosti na správnosti přihlašovacích údajů.
    3. Pokud však do pole pro přihlašovací jméno a heslo zadáme řetězec " OR ""=", přihlášení se zdaří a ocitnete se v aplikaci.
    4. Formulářová data slouží jako vstup pro přímé (dynamické) konstruování SQL dotazu, který vypadá následovně:
    $username = $_POST["username"]; // uživatelské jméno z formuláře
    $password = $_POST["password"]; // heslo z formuláře

    $sql = 'SELECT * FROM users WHERE username ="' + $username + '" AND password ="' + $password + '"'
    1. Pokud se do dotazu dostane " or ""=", je interpretován jako kód, nikoli jako text:
    SELECT * FROM users WHERE username ="" OR ""="" AND password ="" OR ""=""
    1. Dochází k vyhodnocení dotazu, kde minimálně část porovnání ""="" prázdných řetězců bude vždy pravdivá, čímž dotaz vrátí například první nalezený záznam a díky tomu dojde k přihlášení se za takto nalezeného uživatele.
      • V praxi to samozřejmě nemusí být takhle jednoduché, ale podstata je stejná - dynamické sestavení databázového dotazu bez validace vstupu, escapování a dalších kontrol.
  • Vyzkoušejte si SQL injection online hru, pomocí které si uděláte lepší obrázek. Hra vás povede pomocí příkladů a vysvětlení, není potřeba žádná znalost.

  • Do SQL kódu výše se nemusí zadávat pouze příkaz " OR ""=", který pomůže s přihlášením, ale je možné využít všech funkcí jazyka SQL a sestavovat další, mnohem složitější dotazy typu UNION, UPDATE nebo DLETE, které mohou způsobit mnohem větší škody.

Proč je zranitelnost tak častá

  • Jde převážně o programátorskou chybu a nedostatečnou znalost této problematiky.
  • Hojně se vyskytuje ve starých (legacy) aplikacích - vlivem zastaralých technologií a neudržovaného kódu.
  • Nedostatečná validace uživatelského vstupu - vývojář důvěřuje, že uživatel nezadá nic neočekávaného.
  • Nedostatečné escapování nebo nevyužívání moderních prostředků ochrany, jako je např. ORM.
  • Sestavování dynamického dotazu přímo ze vstupu - nepoužívání query parametrizace.

Základní pravidla, jak předcházet SQL injection

  1. Přestaňte psát dynamické dotazy se spojováním řetězců.
  2. Zabraňte tomu, aby uživatelský vstup obsahující škodlivé SQL, ovlivnil logiku prováděného dotazu.
  3. Validujte veškerý uživatelský vstup (používejte seznam povolených znaků, kontrolujte rozsahy, atd.) ve formulářích, URL parametrech atd.
  4. Escapujte veškerý uživatelský vstup (např. ORM).
  5. Použijte query parametrizaci (prepared statements) nebo stored procedures.
  6. Použijte pravidlo nejnižšího oprávnění (least privilege).
    • zejména v případě command injection, kdy se kód spouští nad operačním systémem

🎓 Učíme se společně

Co jsme se dozvěděli z přednášek, školení, čtení knih a dalších aktivit?

Black Clouds and Silver Linings in Node.js Security

  • Speaker: Liran Tal
  • V NPM registry je přes 1 mil. balíků / modulů, což s sebou nese svá rizika - lukrativní pro útočníky.
  • Na NPM je možné publikovat i bez existence GitHub repository.
  • Reálně jsou aplikace nejméně z 90 % tvořeny cizím kódem, pouze 10 % jsme si napsali sami.

Malicious modules and attacks

  • cossenv vs. cross-env - balík pro správu proměnných prostředí.
    • Balík cross-env má jako závislost oficiální balík crossenv.
    • cross-env však v post-install skriptu spouští setup soubor, který odesílá proměnné prostředí na server útočníka / tvůrce balíčku.
    • Vzhledem k tomu, že má jako závislost právě crossenv, vystupuje důvěryhodně a pokud se tím člověk nezabývá, není poznat rozdíl.
    • A co v proměnných prostředí ukládáte vy? Hesla, secrets, tokeny…?
  • coffeescript vs. coffee-script .
    • = Typosquatting attack.
    • 🤔 Než začnete číst dál, hádejte, který z nich je správný, dokážete to rozlišit?
      • (ten první)
  • getcookies - parsuje HTTP hlavičky a umožňuje práci s cookies.
    • Nicméně umožňuje spouštět libovolné commandy poté, co balík nainstalujete (backdoor).
    • Útočník tento balík schoval do několika vrstev (dalších balíků), čímž ho hezky zamaskoval.
      • Běžně nekontrolujeme závislosti našich závislostí do několika úrovní dolů.
    • Povedlo se ho injectovat do mail parser balíku a dostat ho k milionům uživatelů.
  • eslint-scope - součást eslint statické analýzy pro javascriptové projekty.
    • V jedné z verzí se nacházel post-install skript, který podobně jako v případě cross-env posílal data na server útočníka.
    • Na tomto balíku závisí např. tyto: babel-eslint, eslint, webpack.
    • Způsobilo to cca 4.500 kompromitovaných NPM účtů - útočník byl schopen vydávat NPM balíčky jako legitimní maintainer.
  • event-stream - balík vyhledal Bitcoin peněženku uživatele a poslal transakci na neznámou Bitcoin adresu.
    • Kód byl transpilovaný (z TypeScriptu do JavaScriptu), což podstatně ztěžuje code review.
  • 14% NPM modulů má kompromitované mainteinery, patříly mezi ně express, react, moment, debug, request.
    • Byly v situaci, kdy byl někdo schopný publikovat napadenou verzi jednoho z těchto balíků.
    • Naštěstí k tomu nedošlo.
  • Jak je možné kompromitovat express nebo react?
    • Spousta kontributorů (662) má heslo 123456.
    • 1409 uživatelů má jako heslo své username.
    • 11 % kontributorů používá leaknuté heslo.
    • → Ukazuje důležitost bezpečnosti hesel.

📰 Co je nového

  1. Únik zákaznických dat společnosti Toyota.
    • Vlivem nezabezpečených cloud serverů byla veřejně dostupná zákaznická jména, telefonní čísla a další osobní údaje včetně VIN kódu auta a registračního čísla.
    • Výrobce neuvedl, kolik zákazníků bylo ovlivněno.
    • Data byla ihned po zjištění ze serverů odstraněna.
    • Už dříve Toyota zjistila, že jeden ze serverů odhaloval polohu více než 2 mil. zákazníků po dobu 10 let.
  2. Bratislava zaznamenala masivní DDoS útok.
    • Online služby města během konference GLOBSEC zaznamenaly výpadek.
    • Nedošlo k žádnému úniku dat.
    • Za útokem stojí skupina CyberTriad.
  3. Spyware v Android aplikacích nainstalovaný více než 420 milionkrát.
    • Malware byl distribuovaný jako reklamní SDK.
    • Ze zařízení se odesílala soukromá uživatelská data na vzdálený server.
      • Na pozadí se četla data z gyroskopu nebo magnetometru.
    • Malware působil jako legitimní díky gamefikaci, kterou používal jako systém odměn.
    • Mezi postižené aplikace patří aplikace pro střih a editaci videí, offline čtečky a různé “play to earn” aplikace.
    • Google aplikace na základě reportu odebral.

😂 Závěrečný ftípek: What do you tell a hacker after a bad breakup? There are plenty of phish in the sea!

🔔 Sledujte nás na LinkedInu, kam pravidelně sdílíme další novinky a know-how.

🆘 S bezpečností vám rádi pomůžeme, klidně nám napište - školíme vývojáře i management, nastavujeme procesy, vyvíjíme bezpečné aplikace a poskytujeme další služby.