Približne pred rokom sme v DataLine spustili službu na vyhľadávanie a analýzu zraniteľností v IT aplikáciách. V základe služby je cloudové riešenie Qualys, o ktorom . Po roku používania tohto riešenia sme vykonali 291 skenovaní pre rôzne webové stránky a nas accumulovali štatistiky o rozšírených zraniteľnostiach vo webových aplikáciách.
V nasledujúcom článku ukážem, aké presne bezpečnostné diery sa skrývajú za rôznymi úrovňami kritičnosti. Pozrime sa, aké zraniteľnosti skener nachádzal obzvlášť často, prečo môžu vzniknúť a ako sa chrániť.

Všetky zraniteľnosti webových aplikácií Qualys delí na tri úrovne kritičnosti: nízku, strednú a vysokú. Keď sa pozrieme na rozdelenie podľa "závažnosti", zdá sa, že to nie je také zlé. Zraniteľností s vysokou úrovňou kritičnosti je málo, väčšinou sú všetky nekritické:

Ale nekritické neznamená bezvýznamné. Môžu tiež spôsobiť vážne škody.
Top „nekritických“ zraniteľností
- Zraniteľnosti súvisiace so zmiešaným obsahom.
Štandardom bezpečnosti webových stránok je prenos dát medzi klientom a serverom prostredníctvom protokolu HTTPS, ktorý podporuje šifrovanie a chráni informácie pred odposluchom.
Niektoré webové stránky používajú zmiešaný obsah: prenášajú časť dát prostredníctvom nezabezpečeného protokolu HTTP. Častejšie tak prenášajú pasívny obsah – informácie, ktoré ovplyvňujú len zobrazenie stránky: obrázky, CSS štýly. Niekedy však tak prenášajú aj aktívny obsah: skripty, ktoré riadia správanie stránky. V tomto prípade je možné pomocou špeciálneho softvéru analyzovať informácie prichádzajúce zo servera s aktívnym obsahom, modifikovať na mieste svoje odpovede a nútiť stroj fungovať tak, ako to nebolo zamýšľané jeho tvorcami.
Nové verzie prehliadačov varujú používateľov, že webové stránky so zmiešaným obsahom nie sú bezpečné, a blokujú obsah. Vývojári stránok taktiež dostávajú upozornenia od prehliadača v konzole. Napríklad to vyzerá takto v :

Aké je nebezpečenstvo: Útočníci používajú nezabezpečený protokol na odposluch informácií o používateľovi, výmenu skriptov a odosielanie požiadaviek na stránku v jeho mene. Dokonca aj keď návštevník stránky nezadáva údaje, to ho neochráni pred phishingom – získavania dôverných informácií podvodnými metódami. Napríklad pomocou skriptu je možné presmerovať používateľa na nezabezpečenú stránku, ktorá sa maskuje ako známá stránka. V niektorých prípadoch môže zlovôľna stránka vyzerať dokonca lepšie ako originál a používateľ môže sám vyplniť formulár a odovzdať dôverné údaje.Na čo si má pamätať webový vývojár: Aj keď administrátor stránky nainštaloval a nastavil certifikát SSL/TLS, zraniteľnosť sa môže objaviť z dôvodu ľudskej chyby. Napríklad, ak je na niektorej zo stránok použitá absolútna, nie relatívna, linka s http, a ešte k tomu neboli nastavené presmerovania z http na https.
Zmiešaný obsah na stránke môžete zistiť pomocou prehliadača: prehľadajte zdrojový kód stránky, prečítajte si upozornenia v konzole pre vývojárov. Avšak vývojár sa bude musieť dlhé hodiny prehrabávať v kóde. Proces môžete urýchliť pomocou automatizovaných analytických nástrojov, napríklad: , voľný softvér Lighthouse alebo platený softvér Screaming Frog SEO Spider.
Zraniteľnosť sa môže vyskytnúť aj z dôvodu problémov so starým kódom – kódom, ktorý bol zdedený. Napríklad, ak sa niektoré stránky generujú podľa starého šablónu, kde sa neberie do úvahy prechod stránok na https.
- Cookies bez flagov „HTTPOnly“ a „secure“.
Atribút „HTTPOnly“ chráni súbory cookie pred spracovaním skriptmi, ktoré útočníci používajú na krádež používateľských údajov. Flag „secure“ nezapne prenos cookies vo voľnej forme. Výmena údajov bude povolená len v prípade, že sa cookies odosielajú prostredníctvom zabezpečeného protokolu HTTPS.
Oba atribúty sú definované v vlastnostiach cookies:
Set-Cookie: Secure; HttpOnlyAké je nebezpečenstvo: Ak vývojár stránky nepoužil tieto atribúty, útočník môže zachytiť informácie používateľa z cookies a využiť ich. Ak sú cookies použité na autentifikáciu a autorizáciu, môže ukradnúť reláciu používateľa a vykonávať akcie na stránke jeho menom.
Na čo si má pamätať webový vývojár: Zvyčajne sa v populárnych rámcoch tieto atribúty nastavujú automaticky. Ale aj tak skontrolujte konfiguráciu webového servera a nastavte flag: Set-Cookie HttpOnly; Secure.
Pri tom atribút „HTTPOnly“ urobí cookies neviditeľnými aj pre váš vlastný JavaScript.
- Path-Based Vulnerabilities („cestné“ zraniteľnosti).
Skener hlásí takovou zranitelnost, pokud najde veřejně přístupný soubor nebo adresář na webu s potenciálně důvěrnými informacemi. Například může objevit jednotlivé soubory s konfigurací systému nebo přístup k celé souborové struktuře. Tato situace může nastat, pokud jsou na webu nesprávně nastaveny přístupové práva.
Aké je nebezpečenstvo: Pokud je souborový systém "viditelný", útočník se může dostat do rozhraní operačního systému a pokusit se najít složky s hesly, pokud jsou uchovávány v nechráněné podobě (nedělejte to!). Nebo může ukrást hashe hesel a pokusit se je uhádnout, stejně jako se pokusit zvýšit svoje oprávnění v systému a postupovat hlouběji do infrastruktury.
Na čo si má pamätať webový vývojár: Nezapomínejte na přístupová práva a konfigurovat platformu, webový server, webovou aplikaci tak, aby nebylo možné "utéct" z webového adresáře.
- Formuláře pro vkládání důvěrných údajů s povolenou funkcí automatického vyplňování.
Pokud uživatel často vyplňuje formuláře na webech, jeho prohlížeč tuto informaci ukládá pomocí funkce automatického vyplňování.
Formuláře na webech mohou obsahovat pole s důvěrnými informacemi, například hesla nebo čísla kreditních karet. Pro taková pole je vhodné na webu vypnout funkci automatického vyplňování formulářů.
Aké je nebezpečenstvo: Pokud prohlížeč uživatele uloží důvěrné informace, útočník je může později zachytit, například pomocí phishingu. V podstatě webový vývojář, který na tento aspekt zapomene, vystavuje své uživatele riziku.
Na čo si má pamätať webový vývojár: V tomto případě máme klasický konflikt: pohodlí vs. bezpečnost. Pokud webový vývojář myslí na pohodlí uživatele, může se rozhodnout pro povolení automatického vyplňování. Například pokud je důležité dodržovat – doporučení pro přístupnost obsahu pro uživatele se zdravotním postižením.
Ve většině prohlížečů lze vypnout automatické vyplňování pomocí atributu autocompete="off", například:
<body> <form action="/sk/form/submit/" method="get" autocomplete="off" data-trp-original-action="/form/submit"> <div> <input type="text" placeholder="First Name"> </div> <div> <input type="text" id="lname" placeholder="Last Name" autocomplete="on"> </div> <div> <input type="number" placeholder="Číslo kreditnej karty"> </div> <input type="submit"> <input type="hidden" name="trp-form-language" value="sk"/></form> </body>Ale pro Chrome to nebude fungovat. To se obchází pomocí JavaScriptu, variantu receptu lze najít .
- V kódu webu není nastaven hlavička X-Frame-Options.
Tento nadpis ovplyvňuje značky frame, iframe, embed alebo object. Pomocou neho môžete úplne zakázať vkladanie vašej stránky do rámčeku. Na to sa nastaví hodnota X-Frame-Options: deny. Alebo môžete nastaviť X-Frame-Options: sameorigin, vtedy bude vkladanie do iframe prístupné iba na vašej doméne.
Aké je nebezpečenstvo: Nepresnosť tohto nadpisu môžu zneužívať škodlivé stránky na clickjacking.Pri tomto útoku útočník vytvorí priehľadný rámček nad tlačidlami a podvádza používateľa. Napríklad: podvodníci vložia do rámčeka na stránke sociálnych sietí. Používateľ si myslí, že kliká na tlačidlo na tejto stránke. Namiesto toho kliknutie sa zachytí a odošle požiadavku používateľa na sociálnu sieť, kde je aktívna relácia. Takto útočníci rozosielajú spam v mene používateľa alebo získavajú falošných sledovateľov a lajky.
Ak sa takáto možnosť nezakáže, útočník môže umiestniť tlačidlo vašej aplikácie na škodlivú stránku. Má záujem o vašu partnerskú program alebo o vašich používateľov.
Na čo si má pamätať webový vývojár: Zraniteľnosť môže vzniknúť, ak je X-Frame-Options s konfliktujúcou hodnotou nastavená na webovom serveri alebo vyrovnávači záťaže. V tomto prípade server a vyrovnávač jednoducho prepíšu nadpis, pretože majú vyššiu prioritu v porovnaní s backendovým kódom.
Hodnoty deny a sameorigin nadpisu X-Frame-Options budú prekážať fungovaniu webového vizora Yandexu. Aby ste umožnili používanie iframe pre webový vizor, musíte napísať v nastaveniach samostatné pravidlo. Napríklad pre nginx môžete nastaviť nasledovne:
http{ ... map $http_referer $frame_options { "~webvisor.com" "ALLOW-FROM http://webvisor.com"; default "SAMEORIGIN"; } add_header X-Frame-Options $frame_options; ... } - Zraniteľnosti PRSSI (Path-relative stylesheet import).
Ide o zraniteľnosť v štýloch stránky. Vzniká, ak sa na prístup k súborom štýlov používajú relatívne odkazy ako href="/somefolder/styles.css/". Útočník to môže využiť, ak nájde spôsob, ako presmerovať používateľa na škodlivú stránku. Stránka vloží relatívny odkaz do svojho url a imituje prístup k štýlom. Vznikne požiadavka typu badsite.ru/.../somefolder/styles.css/, ktorá pod zámienkou štýlu môže vykonávať škodlivé akcie.
Aké je nebezpečenstvo: Podvodník môže využiť túto zraniteľnosť, ak nájde ďalšiu dieru v zabezpečení. V dôsledku toho môže ukradnúť používateľské údaje z cookies alebo tokeny.
Na čo si má pamätať webový vývojár: Nastavte hlavičku X-Content-Type-Options: nosniff. V takom prípade prehliadač skontroluje typ obsahu pre štýly. Ak sa typ líši od text/css, prehliadač zablokuje požiadavku.
Kritické zraniteľnosti
- Stránka s poľom pre heslo je doručená zo servera cez nezabezpečený kanál (HTML form containing password field(s) is served over HTTP).
Odpoveď od servera cez nešifrovaný kanál je zraniteľná voči útokom typu «Man in the middle». Útočník môže zachytiť prevádzku a vkliniť sa medzi klienta a server, keď stránka ide od servera k klientovi.
Aké je nebezpečenstvo: Podvodník môže zameniť stránku a poslať používateľovi formulár na dôverné údaje, ktoré odídu na server útočníka.
Na čo si má pamätať webový vývojár: Niektoré stránky namiesto hesla posielajú používateľom jednorazový kód na e-mail/telefón. V tomto prípade nie je zraniteľnosť taká kritická, ale mechanizmus zkomplikuje život používateľom.
- Odosielanie formulára s prihlasovacím menom a heslom cez nezabezpečený kanál (Login Form Is Not Submitted Via HTTPS).
V tomto prípade sa od používateľa na server cez nešifrovaný kanál odosiela formulár s prihlasovacím menom a heslom.
Aké je nebezpečenstvo: Na rozdiel od predchádzajúceho prípadu, toto už je kritická zraniteľnosť. Získať citlivé údaje je jednoduchšie, pretože ani nie je potrebné na to písať kód.
- Používanie knižníc JavaScript s známymi zraniteľnosťami.
Počas skenovania sa najpoužívanejšou knižnicou stal jQuery s rozsiahlym spektrom verzií. V každej z verzií existuje aspoň jedna, ak nie viac známych zraniteľností. Dopad môže byť rôzny – závisí od povahy zraniteľnosti.
Aké je nebezpečenstvo: Pre známe zraniteľnosti existujú exploit-y, napríklad takéto:

Na čo si má pamätať webový vývojár: Pravidelne sa vracajte k cyklu: hľadanie známych zraniteľností – odstraňovanie – kontrola. Ak vedome používate zastarané knižnice, napríklad na podporu starých prehliadačov alebo na šetrenie rozpočtu, hľadajte možnosti, ako odstrániť známu zraniteľnosť. - Medzistránkové skripty (XSS).
Cross-Site Scripting (XSS), alebo medziwebové skripty, sú útoky na webovú aplikáciu, pri ktorých sa do databázy dostávajú škodlivé kódy. Ak nájde Qualys takú zraniteľnosť, znamená to, že potenciálny útočník môže do kódu webu nasadiť svoj js skript a vykonávať škodlivé akcie.Uložené XSS (Stored XSS) sú nebezpečnejšie, pretože skript sa nasadzuje na serveri a vykonáva sa vždy pri otvorení napadnutej stránky v prehliadači.
Odrazené XSS (Reflected XSS) sa jednoduchšie vykonávajú, pretože zlovestný skript možno nasadiť do HTTP požiadavky. Aplikácia dostane HTTP požiadavku, neoverí údaje, zabalí ich a okamžite odošle. Ak útočník zachytí prenos a vloží skript vo forme
<script>/*+что+то+плохое+*/</script>, potom od klienta pôjde škodlivá požiadavka.
Jasný príklad XSS: js sniffery, ktoré imitujú stránky na zadávanie CVC, dátumu expirácie karty a podobne.
Na čo si má pamätať webový vývojár: V hlavičke Content-Security-Policy používajte atribút script-src, aby prehliadač klienta načítal a vykonával iba kód z dôveryhodného zdroja. Napríklad script-src ‘self’ pridáva do bieleho zoznamu všetky skripty iba z našich stránok.
Najlepšou praxou je Inline kód: povoliť iba inline javascript s hodnotou unsafe-inline. Táto hodnota povolí používanie inline js/css, ale nezakazuje pripojenie js súborov. V kombinácii so script-src ‘self’ zakazujeme vykonávanie vonkajších skriptov.Určite logujte všetko pomocou report-uri a sledujte pokusy o nasadenie na stránku.
- SQL injekcie.
Zraniteľnosť označuje možnosť nasadenia SQL kódu na stránku, ktorý priamo pristupuje k databáze stránky. SQL injekcia je možná, ak údaje od používateľa nie sú escapované: nie sú overené na správnosť a sú okamžite použité v požiadavke. Napríklad sa to stane, ak forma na stránke neoveruje zhodu vstupu s typom údajov.Aké je nebezpečenstvo: Ak útočník zadá do takejto formy SQL požiadavku, môže zničiť databázu alebo získať dôverné informácie.
Na čo si má pamätať webový vývojár: Nedôverujte tomu, čo prichádza z prehliadača. Ochrana je potrebná ako na strane klienta, tak aj na strane servera.
Na strane klienta napíšte kontrolu polí pomocou JavaScriptu.
Integrované funkcie v populárnych rámcoch tiež pomáhajú escapovať podozrivé znaky na serveri. Na serveri sa tiež odporúča používať parametrizované dotazy k databázam.
Určte, kde presne prebieha interakcia s databázou vo webovej aplikácii.
Interakcia nastáva, keď získavame nejaké informácie: dotaz s id (zmene id), vytvorenie nového používateľa, nový komentár, – nové záznamy v databáze. Tu môžu vzniknúť sql injekcie. Aj keď z databázy odstraňujeme záznam, je možná sql injekcia.
Všeobecné odporúčania
Nevymýšľajte kolo – používajte overené rámce.. Zvyčajne sú populárne rámce bezpečnejšie. Pre .NET je to ASP.NET MVC a ASP.NET Core, pre Python – Django alebo Flask, pre Ruby – Ruby on Rails, pre PHP – Symfony, Laravel, Yii, pre JavaScript – Node.JS - Express.js, pre Java – Spring MVC.
Sledujte aktualizácie od dodávateľa a pravidelne ich aktualizujte.. Zraniteľnosť objavia, potom napíšu exploit, zverejnia ho verejne a všetko sa opäť opakuje. Prihláste sa na odber aktualizácií stabilných verzií od dodávateľa softvéru.
Kontrolujte prístupové práva.. Z pohľadu servera sa vždy pozerajte na váš kód tak, akoby ho celý, od prvej po poslednú písmeno, napísal váš najnenávidenejší nepriateľ, ktorý chce zlomiť vašu stránku a narušiť integritu vašich dát. O to viac, že niekedy je to naozaj tak.
Používajte kópie, testovacie prostredia, a potom už nasadzujte na produkciu.. To pomôže, po prvé, vyhnúť sa chybám a nedostatkom v produktívnom prostredí: produktívne prostredie prináša peniaze, prestoje produktívneho prostredia sú kritické. Pri pridávaní, opravách alebo uzatváraní akýchkoľvek problémov je vhodné vykonávať práce v testovacom prostredí, potom skontrolovať funkčnosť a nájdené zraniteľnosti, a až potom plánovať práce s produktívnym prostredím.
Chráňte webovú aplikáciu pomocou a integrujte s ním správy od skenera zraniteľností. Napríklad v DataLine sa ako spojenie služieb používajú Qualys a FortiWeb.
Zdroj: habr.com


