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ří:
- Cross Site Scripting XSS (téma minulého newsletteru),
- LDAP injection,
- XML injection,
- Command injection.
-
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:
- Webová stránka obsahuje formulář pro přihlášení do aplikace.
- 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ů.
- 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. - 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 + '"'- Pokud se do dotazu dostane
" or ""="
, je interpretován jako kód, nikoli jako text:
SELECT * FROM users WHERE username ="" OR ""="" AND password ="" OR ""=""
- 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 typuUNION
,UPDATE
neboDLETE
, 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
- Přestaňte psát dynamické dotazy se spojováním řetězců.
- Zabraňte tomu, aby uživatelský vstup obsahující škodlivé SQL, ovlivnil logiku prováděného dotazu.
- Validujte veškerý uživatelský vstup (používejte seznam povolených znaků, kontrolujte rozsahy, atd.) ve formulářích, URL parametrech atd.
- Escapujte veškerý uživatelský vstup (např. ORM).
- Použijte query parametrizaci (prepared statements) nebo stored procedures.
- 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íkcrossenv
. 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…?
- Balík
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.
- V jedné z verzí se nacházel post-install skript, který podobně jako v případě
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
neboreact
?- 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.
- Spousta kontributorů (662) má heslo
📰 Co je nového
- Ú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.
- 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.
- 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.