(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); thecodest, Autor na The Codest - Strana 10 z 13

Scénář útoku

  1. Útočník najde zranitelnost XSS na webové stránce používané obětí, např. na webové stránce banky.
  2. Oběť je v současné době přihlášena na této stránce.
  3. Útočník pošle oběti vytvořenou adresu URL.
  4. Oběť klikne na adresu URL
  5. Na oběti banka webové stránky, JavaScript kód začne vykonávat, aby zachytil uživatelovo data nebo jeho jménem provést převod na účet útočníka.

Stojí za zmínku, že operace prováděné jménem oběti mohou být pro oběť neviditelné, protože mohou probíhat na pozadí s využitím bankovního systému. API, nebo je útočník může provést později s údaji potřebnými pro ověření, tokeny, soubory cookie atd.

Typy XSS

1. Odražený XSS

Jedná se o kód HTML/JavaScript obsažený v jakémkoli parametru (např. GET, POST nebo cookie), který se zobrazí v odpovědi.

Stránka s textovým vstupem pro vyhledávání, která zadá parametr ?search=foo v koncovce adresy URL při dotazování rozhraní API. Po zadání libovolné fráze, pokud není nalezena, se v HTML zobrazí návratová zpráva ex.

<div>Nebyl nalezen žádný výsledek pro <b>foo</b></div>

Můžeme zkusit zadat adresu URL ?search=..

2.DOM XSS

To je tehdy, když je jeho spuštění povoleno pomocí nebezpečných funkcí v JavaScript, jako např. `eval` nebo `innerHtml`. Níže uvedený "živý příklad" ukazuje útok DOM XSS založený na adrese `innerHtml` funkce.

3. Uložený XSS

V tomto případě je škodlivý kód napsán na straně serveru. Například můžeme odeslat komentář se škodlivým kódem k příspěvku na blogu, který je nahrán na server. Jeho úkolem je například počkat na moderaci administrátora a poté ukrást jeho údaje o relaci apod.

Injekční metody

1. V obsahu značky

`onerror=upozornění('XSS')`na

<img src onerror="alert('XSS')" />

2. V obsahu atributu

`" onmouseover=alert('XSS')` na

<div class="" onmouseover="alert('XSS')""></div>

  1. V obsahu atributu bez uvozovek

x onclick=alert('XSS')na

<div class="x" onclick="alert('XSS')"></div>

  1. V hrefatribut ef

javascript:alert('XSS') na

<a href="javascript:alert('XSS')"></a>

  1. V řetězci uvnitř kódu JavaScript

";alert('XSS')// na

<script>let username="";alert('XSS')//";</script>
  1. V atributu s událostí JavaScript

');alert('XSS')// kde ' je jednoduchá uvozovka, do

<div onclick="change('&#39;);alert('XSS')//')">John</div>

  1. V href atribut uvnitř protokolu JavaScript

);alert(1)// kde %27 je jednoduchá uvozovka, do

<a href="javascript:change('%27);alert(1)//')">klikněte na</a>


Živý příklad

Obranné metody

  1. Kódování dat pomocí vestavěných funkcí, které se nacházejí v mnoha programovací jazyky.
  2. Použití šablonových systémů s automatickým kódováním. Většina populárních frameworků, které takové systémy používají, chrání nás před injekcí XSS (Django, Šablony, Vue, React atd.).
  3. Nepoužívejte funkce jako eval nebo Funkce s nedůvěryhodnými uživatelskými daty.
  4. Nepoužívejte funkce a vlastnosti, které přiřazují kód HTML přímo prvkům stromu DOM, např., innerHTML, outerHTML, insertAdjacentHTML, ocument.write. Místo toho můžete použít funkce, které těmto prvkům přímo přiřadí text, jako např. textContent nebo innerText.
  5. Při přesměrování uživatele na adresu URL, která je pod jeho kontrolou, buďte opatrní. Riziko injekce location = 'javascript('XSS')'.
  6. Filtrování HTML pomocí knihoven, jako je DOMPurify.
  7. Pozor na nahrávání .html nebo .svg soubory. Můžete vytvořit samostatnou doménu, ze které budou nahrané soubory obsluhovány.
  8. Použijte Content-Security-Policy mechanismus.
  9. Podívejte se na filtry proti XSS zabudované ve většině populárních prohlížečů.

    Pokud vás tento článek zaujal, sledujte Lukáše na Githubu: https://github.com/twistezo

Přečtěte si více:

Strategie načítání dat v NextJS

Rozhraní Rails API a CORS. Kousek vědomí

Proč byste (pravděpodobně) měli používat Typescript?

cs_CZCzech