Zabezpečení webové aplikace

Základy problematiky

  • Služba webových stránek se na internetu stala jednou z nejvyužívanějších. Způsoby její využívání umožňují např. nakupovat na dálku, provádět bankovní operace apod. Využívání těchto webových služeb je vždy založeno na důvěře. Mohou však existovat kritická pochybení jak na straně tvůrce webu, tak na straně klienta.
  • Za bezpečnostní mezery může nedokonalost jednotlivých technologií.
    • HTTP – přenosový protokol webové aplikace
    • programovací jazyky – HTML/CSS, PHP, Javascript
    • konektory k databázi
  • Špatné používání webových aplikací:
    • nešifrovaná komunikace
    • SW napadený malwarem na straně klienta
    • slabá hesla
    • neukončení relace přihlášení – po odhlášení je rovněž nutné zavřít webový prohlížeč
    • atd.

Problematika zaheslovaného webu (stavovost)

  • Majitelé některých webových aplikací vyžadují při jejich využívání autorizaci (identifikaci) návštěvníka. Než je možné autorizovat využívání služby webové aplikace, je třeba autentizovat návštěvníka při přihlášení.
  • Proces autentizace – zadání jména a hesla (nejzranitelnější část procesu).
  • Aby nebylo třeba při každém znovunačtení stránky provádět autentizaci, je třeba udržovat stav – tzv. udržovat sezení.
  • HTTP protokol sám stav nedokáže udržovat, nerozlišuje kontext jednotlivých požadavků a odpovědí. To vytváří řadu bezpečnostních problémů. Jaké jsou možnosti k udržování stavu?
    • Princip metody GET – je založen na parametrizování URL adresy např. domena.cz?id=admin&heslo=neco . Tento způsob udržování stavu je vyloženě sebevražedný.
    • Princip cookie – data cookie jsou ukládány do prohlížeče na straně klienta a při každém HTTP požadavku se jejich data přenášejí na server. Server tedy dokáže rozpoznat návštěvníka díky unikátnosti hodnoty v cookie. Kvůli velmi nízké bezpečnosti jsou cookies vhodné pouze k webové analytice nebo personalizované reklamě. Pokud bychom do cookie chtěli ukládat identifikátory, je třeba místo nich používat hash.
    • Princip session – webový server si při spuštění relace session může o uživatelích uložit libovolné informace. Server může relaci udržovat po určitou dobu. Relaci je třeba však průběžně obnovovat.
  • Způsoby, jak krást session jsou popsány zde: https://cs.wikipedia.org/wiki/Session

Šifrování komunikace

  • Útok typu man in the middle – Zneužitím infrastrukturních prvků v síti si kopii paketů s HTTP požadavky nejen můžeme přečíst, ale také si odchytit HTTP odpovědi vzdáleného serveru, s nímž oběť komunikuje. HTTP protokol není nijak šifrovaný a lze obsah komunikace přečíst např. pomocí programu WireShark.
  • Řešením je komunikovat šifrovanou verzí HTTPS. Tím se stanou odposlouchaná data nečitelná. K tomu, aby bylo možno komunikovat šifrovaně, je třeba využít SSL certifikát (někdy také označované jako HTTPS certifikáty). Více o protokolu SSL zde: https://cs.wikipedia.org/wiki/Secure_Sockets_Layer
  • Certifikační autorita (CA) – subjekt, který poskytuje digitální certifikáty (ověřené šifrovací klíče). Díky ověřenému certifikátu rovněž lze v komunikaci dokazovat identitu komunikujícího. Na trhu jsou k dispozici placené i neplacené služby CA. Obecně platí, že weby využívající placenou certifikaci (např. Rapid SSL apod.) jsou důvěryhodnější. To se vyplatí např. bankám, přičemž zákazníci banky získávají důvěru v online komunikaci. Pro bezpečnostně nenáročné projekty lze využít i neplacené CA jako např. Let’s Encrypt.
  • Další výhody HTTPS – Weby s HTTPS jsou upřednostňovány před weby HTTP. Google od roku 2014 začat weby s HTTP adresou označovat jako “nezabezpečené”.

Běžné formy útoků

  • Obecné typy počítačových útoků naleznete zde: https://cs.wikipedia.org/wiki/Po%C4%8D%C3%ADta%C4%8Dov%C3%BD_%C3%BAtok#Typy_%C3%BAtok%C5%AF
  • Konkrétní typy webových útoků:
    • Injekce – SQL injection – problém s neošetřenými vstupy POST/GET/COOKIE. Problematické jsou všechny dotazovací systémy. Nebezpečné použití funkce eval v PHP umožňující spouštět kód uložený v proměnných. Řešením je použití rozhraní PDO: https://jecas.cz/pdo
    • Spuštění nebo načtení souboru – možnost uploadu souboru se zákeřnými skripty – Řešením je testování parametrů souboru.
    • Krádež session – problém vychází z potřeby stavovosti HTTP a trvalého přihlášení návštěvníka webu (tzv. udržování sezení pomocí cookie). Ke krádeži hodnoty session identifikátoru z cookie může dojít při vytvoření cookie a nebo při překliknutí na web útočníka, kdy útočník v HTTP požadavku může přečíst údaj z HTTP refereru (URL webu z kterého přišel návštěvník). Řešení: zamezit načtení obsahu cookie jiným serverem, zamezení přístupu ke cookie pomocí Javascriptu, po vytvoření přihlašovací cookie provádět přesměrování, neukládat identifikátory přihlášení do URL.
    • Cross Site Scripting (XSS) – problém vstupů – podvržení skriptu – Problém vzniká převážně tam, kde potřebujeme vstupu předávat např. HTML kód (WYSIWYG u redakčních systémů). Je třeba charakteristické značky HTML převádět na entitní znaky, které pak nejsou spustitelné přímo v PHP souboru zpracovávajícím data formuláře. Nepřevedený kód na HTML entity z daných vstupů je třeba pečlivě filtrovat.
    • Cross Site Request Forgery (CSRF) – podvržení HTTP požadavku – použití kontrolních subsystémů (SMS, kapča …)
    • JavaScript Hijacking – problém opět souvisí s udržováním přihlášení, kdy u aplikací poskytující data JSON se mění data v závislosti na stavu přihlášení. Ze struktury dat je čitelné, kde se budou nacházet tajná data v době, kdy je udržováno sezení (uživatel webu přihlášen). Pak lze ve správný moment pomocí Javascriptu (funkce setter) data unést.
    • Clickjacking (Click Hijacking) – Podstatou je nepozorné ukliknutí na instalaci malwaru při rychlých klikacích sekvencích (např. u klikaček). V domnění, že se nacházíme na bezpečném webu, může být i tak samotná klikací hra do webu vložena iframem a pak web v rychlém sledu podvrhne kamuflovaný ovládací prvek, který vyvolá nežádoucí akci. Částečným řešením jsou bezpečnostní mechanismy samotného webového prohlížeče. Úplným řešením by bylo zabránění vkládání takovýchto aplikací pomocí iframu.

Zásady a metody zabezpečení

  • Zásady jsem vám uvedl v bodu výše.
  • Hlavní zásadou je si uvědomit, které části webové aplikace slouží pouze k prezentaci dat (front-end) a které slouží ke správě webu (back-end). Back-endovou část webové aplikace je třeba mnohem pečlivě ochránit – zde se nachází kritické body celého našeho systému webové aplikace. Je třeba řádně oddělit skripty back-endu a nepoužívat tyto skripty na velmi exponované části front-endu.
  • Na tyto zásady navazují zásady administrátorů a uživatelů redakčních systémů. Jak zabezpečit WordPress: https://www.interval.cz/clanky/10-super-ucinnych-zpusobu-jak-zabezpecit-wordpress/

Souhrn

Klíčové pojmy

autorizace, autentizace, metoda GET, cookie, session, HTTP/HTTPS, man in the middle, SSL, certifikační autorita, SQL injekce, Cross Site Scripting, Cross Site Request Forgery, JavaScript Hijacking, Clickjacking, front-end, back-end

Studijní materiály